mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-03 03:12:31 +00:00
35662 lines
1024 KiB
Markdown
35662 lines
1024 KiB
Markdown
# Test Log
|
|
|
|
> [email protected] test:unit
|
|
> node scripts/run-unit-tests.mjs
|
|
|
|
|
|
→ Running tests/app-batch-fetch-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: batchFetchProfiles handles fast and failing relays
|
|
ok 1 - batchFetchProfiles handles fast and failing relays
|
|
---
|
|
duration_ms: 11.347752
|
|
type: 'test'
|
|
...
|
|
# Subtest: batchFetchProfiles respects forceRefresh
|
|
ok 2 - batchFetchProfiles respects forceRefresh
|
|
---
|
|
duration_ms: 1.432216
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.923616
|
|
|
|
→ Running tests/app-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: Initial state is clean
|
|
ok 1 - Initial state is clean
|
|
---
|
|
duration_ms: 2.458562
|
|
type: 'test'
|
|
...
|
|
# Subtest: setPubkey() updates state and notifies subscribers
|
|
ok 2 - setPubkey() updates state and notifies subscribers
|
|
---
|
|
duration_ms: 1.001744
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentUserNpub() updates state
|
|
ok 3 - setCurrentUserNpub() updates state
|
|
---
|
|
duration_ms: 0.408267
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentVideo() updates state
|
|
ok 4 - setCurrentVideo() updates state
|
|
---
|
|
duration_ms: 0.640847
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap() updates state
|
|
ok 5 - setVideosMap() updates state
|
|
---
|
|
duration_ms: 0.58406
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideoSubscription() updates state
|
|
ok 6 - setVideoSubscription() updates state
|
|
---
|
|
duration_ms: 0.365106
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState() updates state and notifies modal subscribers
|
|
ok 7 - setModalState() updates state and notifies modal subscribers
|
|
---
|
|
duration_ms: 0.80965
|
|
type: 'test'
|
|
...
|
|
# Subtest: Global subscriber receives updates
|
|
ok 8 - Global subscriber receives updates
|
|
---
|
|
duration_ms: 0.634669
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState() clears all state and notifies
|
|
ok 9 - resetAppState() clears all state and notifies
|
|
---
|
|
duration_ms: 0.593409
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 9.575579
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.93184
|
|
|
|
→ Running tests/app/channel-profile-moderation.test.mjs
|
|
node:internal/modules/package_json_reader:314
|
|
throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null);
|
|
^
|
|
|
|
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsdom' imported from /app/tests/app/channel-profile-moderation.test.mjs
|
|
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:314:9)
|
|
at packageResolve (node:internal/modules/esm/resolve:767:81)
|
|
at moduleResolve (node:internal/modules/esm/resolve:853:18)
|
|
at defaultResolve (node:internal/modules/esm/resolve:983:11)
|
|
at #cachedDefaultResolve (node:internal/modules/esm/loader:731:20)
|
|
at ModuleLoader.resolve (node:internal/modules/esm/loader:708:38)
|
|
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:310:38)
|
|
at ModuleJob._link (node:internal/modules/esm/module_job:182:49) {
|
|
code: 'ERR_MODULE_NOT_FOUND'
|
|
}
|
|
|
|
Node.js v22.22.0
|
|
|
|
✖ tests/app/channel-profile-moderation.test.mjs failed with exit code 1
|
|
npm notice
|
|
npm notice New minor version of npm available! 11.7.0 -> 11.10.0
|
|
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.10.0
|
|
npm notice To update run: npm install -g npm@11.10.0
|
|
npm notice
|
|
|
|
> [email protected] test:unit
|
|
> node scripts/run-unit-tests.mjs
|
|
|
|
|
|
→ Running tests/app-batch-fetch-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: batchFetchProfiles handles fast and failing relays
|
|
ok 1 - batchFetchProfiles handles fast and failing relays
|
|
---
|
|
duration_ms: 3.873016
|
|
type: 'test'
|
|
...
|
|
# Subtest: batchFetchProfiles respects forceRefresh
|
|
ok 2 - batchFetchProfiles respects forceRefresh
|
|
---
|
|
duration_ms: 0.972463
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.926111
|
|
|
|
→ Running tests/app-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: Initial state is clean
|
|
ok 1 - Initial state is clean
|
|
---
|
|
duration_ms: 2.399172
|
|
type: 'test'
|
|
...
|
|
# Subtest: setPubkey() updates state and notifies subscribers
|
|
ok 2 - setPubkey() updates state and notifies subscribers
|
|
---
|
|
duration_ms: 0.988354
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentUserNpub() updates state
|
|
ok 3 - setCurrentUserNpub() updates state
|
|
---
|
|
duration_ms: 0.582713
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentVideo() updates state
|
|
ok 4 - setCurrentVideo() updates state
|
|
---
|
|
duration_ms: 0.518129
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap() updates state
|
|
ok 5 - setVideosMap() updates state
|
|
---
|
|
duration_ms: 0.60507
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideoSubscription() updates state
|
|
ok 6 - setVideoSubscription() updates state
|
|
---
|
|
duration_ms: 0.323639
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState() updates state and notifies modal subscribers
|
|
ok 7 - setModalState() updates state and notifies modal subscribers
|
|
---
|
|
duration_ms: 0.742334
|
|
type: 'test'
|
|
...
|
|
# Subtest: Global subscriber receives updates
|
|
ok 8 - Global subscriber receives updates
|
|
---
|
|
duration_ms: 0.641097
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState() clears all state and notifies
|
|
ok 9 - resetAppState() clears all state and notifies
|
|
---
|
|
duration_ms: 0.696579
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 9.42967
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.268057
|
|
|
|
→ Running tests/app/channel-profile-moderation.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderChannelVideosFromList decorates videos before storing
|
|
ok 1 - renderChannelVideosFromList decorates videos before storing
|
|
---
|
|
duration_ms: 136.597794
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderChannelVideosFromList applies moderation blur without existing metadata
|
|
ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata
|
|
---
|
|
duration_ms: 36.712026
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
ok 3 - applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
---
|
|
duration_ms: 16.869787
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation override clears channel blur via event wiring
|
|
ok 4 - moderation override clears channel blur via event wiring
|
|
---
|
|
duration_ms: 29.730034
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel header moderation badge reflects blur state and override actions
|
|
ok 5 - channel header moderation badge reflects blur state and override actions
|
|
---
|
|
duration_ms: 34.349005
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel video cards update moderation state in place when summary changes
|
|
ok 6 - channel video cards update moderation state in place when summary changes
|
|
---
|
|
duration_ms: 29.14083
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 305.05826
|
|
|
|
→ Running tests/app/feedCoordinator.test.mjs
|
|
TAP version 13
|
|
# Subtest: createFeedCoordinator - loadForYouVideos
|
|
# Subtest: loadForYouVideos executes successfully
|
|
ok 1 - loadForYouVideos executes successfully
|
|
---
|
|
duration_ms: 2.55716
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - createFeedCoordinator - loadForYouVideos
|
|
---
|
|
duration_ms: 4.379186
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.941918
|
|
|
|
→ Running tests/app/hash-change-handler.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleHashChange defaults to for-you when logged in
|
|
ok 1 - handleHashChange defaults to for-you when logged in
|
|
---
|
|
duration_ms: 90.299709
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange defaults to most-recent-videos when logged out
|
|
ok 2 - handleHashChange defaults to most-recent-videos when logged out
|
|
---
|
|
duration_ms: 17.124794
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange respects explicit view regardless of login state
|
|
ok 3 - handleHashChange respects explicit view regardless of login state
|
|
---
|
|
duration_ms: 18.10759
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 138.368793
|
|
|
|
→ Running tests/app/hydrate-sidebar-navigation.test.mjs
|
|
TAP version 13
|
|
# Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
ok 1 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
---
|
|
duration_ms: 103.796798
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
ok 2 - hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
---
|
|
duration_ms: 19.114249
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 136.684131
|
|
|
|
→ Running tests/app/is-user-logged-in.test.mjs
|
|
TAP version 13
|
|
# Subtest: isUserLoggedIn returns false when no user pubkey is set
|
|
ok 1 - isUserLoggedIn returns false when no user pubkey is set
|
|
---
|
|
duration_ms: 1.887904
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn treats extension logins as authenticated
|
|
ok 2 - isUserLoggedIn treats extension logins as authenticated
|
|
---
|
|
duration_ms: 0.562774
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn guards against mismatched nostrClient state
|
|
ok 3 - isUserLoggedIn guards against mismatched nostrClient state
|
|
---
|
|
duration_ms: 0.419478
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn ignores anonymous session actor mismatches
|
|
ok 4 - isUserLoggedIn ignores anonymous session actor mismatches
|
|
---
|
|
duration_ms: 0.338595
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn rejects mismatched managed session actors
|
|
ok 5 - isUserLoggedIn rejects mismatched managed session actors
|
|
---
|
|
duration_ms: 0.537694
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 40.684375
|
|
|
|
→ Running tests/app/moderation-overrides.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationOverride decorates stored and current videos then refreshes UI
|
|
ok 1 - handleModerationOverride decorates stored and current videos then refreshes UI
|
|
---
|
|
duration_ms: 5.945926
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationOverride resumes deferred playback
|
|
ok 2 - handleModerationOverride resumes deferred playback
|
|
---
|
|
duration_ms: 1.227272
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
ok 3 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
---
|
|
duration_ms: 3.605258
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock returns false when viewer is logged out
|
|
ok 4 - handleModerationBlock returns false when viewer is logged out
|
|
---
|
|
duration_ms: 1.006912
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.169184
|
|
|
|
→ Running tests/app/moderation-settings-refresh.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
ok 1 - handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
---
|
|
duration_ms: 4.491854
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.180422
|
|
|
|
→ Running tests/app/similar-content.test.mjs
|
|
TAP version 13
|
|
# Subtest: orders similar videos by shared tags then timestamp
|
|
ok 1 - orders similar videos by shared tags then timestamp
|
|
---
|
|
duration_ms: 3.213169
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns no matches when the active video lacks tags
|
|
ok 2 - returns no matches when the active video lacks tags
|
|
---
|
|
duration_ms: 0.528101
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips candidates without tag metadata
|
|
ok 3 - skips candidates without tag metadata
|
|
---
|
|
duration_ms: 0.405583
|
|
type: 'test'
|
|
...
|
|
# Subtest: filters NSFW and private videos when NSFW content is disabled
|
|
ok 4 - filters NSFW and private videos when NSFW content is disabled
|
|
---
|
|
duration_ms: 0.538725
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.144684
|
|
|
|
→ Running tests/auth/signingAdapter.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNip07SigningAdapter
|
|
# Subtest: uses explicit extension if provided
|
|
ok 1 - uses explicit extension if provided
|
|
---
|
|
duration_ms: 3.90752
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to window.nostr if no extension provided
|
|
ok 2 - falls back to window.nostr if no extension provided
|
|
---
|
|
duration_ms: 0.702002
|
|
type: 'test'
|
|
...
|
|
# Subtest: throws error if no extension available
|
|
ok 3 - throws error if no extension available
|
|
---
|
|
duration_ms: 1.349977
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizes explicit extension over window.nostr
|
|
ok 4 - prioritizes explicit extension over window.nostr
|
|
---
|
|
duration_ms: 0.791745
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - createNip07SigningAdapter
|
|
---
|
|
duration_ms: 8.438813
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.27363
|
|
|
|
→ Running tests/comment-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
ok 1 - buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
---
|
|
duration_ms: 2.88372
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
ok 2 - buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
---
|
|
duration_ms: 0.54315
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent normalizes relays and preserves explicit overrides
|
|
ok 3 - buildCommentEvent normalizes relays and preserves explicit overrides
|
|
---
|
|
duration_ms: 0.814022
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent falls back to event pointers when no address is supplied
|
|
ok 4 - buildCommentEvent falls back to event pointers when no address is supplied
|
|
---
|
|
duration_ms: 0.270816
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent accepts partial metadata for parent overrides
|
|
ok 5 - buildCommentEvent accepts partial metadata for parent overrides
|
|
---
|
|
duration_ms: 0.507199
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent sanitizes additional tags before signing
|
|
ok 6 - buildCommentEvent sanitizes additional tags before signing
|
|
---
|
|
duration_ms: 0.91122
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.523829
|
|
|
|
→ Running tests/comment-thread-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: CommentThreadService caches mixed-case video ids consistently
|
|
ok 1 - CommentThreadService caches mixed-case video ids consistently
|
|
---
|
|
duration_ms: 3.643543
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache read failures
|
|
ok 2 - CommentThreadService surfaces cache read failures
|
|
---
|
|
duration_ms: 0.707246
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache write failures
|
|
ok 3 - CommentThreadService surfaces cache write failures
|
|
---
|
|
duration_ms: 0.539127
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService persists caches safely during teardown failures
|
|
ok 4 - CommentThreadService persists caches safely during teardown failures
|
|
---
|
|
duration_ms: 1.976216
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService logs cache usage and fallback decisions
|
|
ok 5 - CommentThreadService logs cache usage and fallback decisions
|
|
---
|
|
duration_ms: 1.405525
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case event ids in thread state
|
|
ok 6 - CommentThreadService normalizes mixed-case event ids in thread state
|
|
---
|
|
duration_ms: 2.341791
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
ok 7 - CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
---
|
|
duration_ms: 0.98349
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
ok 8 - CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
---
|
|
duration_ms: 1.045611
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService retries profile hydration before succeeding
|
|
ok 9 - CommentThreadService retries profile hydration before succeeding
|
|
---
|
|
duration_ms: 76.746748
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces profile hydration failures after retries
|
|
ok 10 - CommentThreadService surfaces profile hydration failures after retries
|
|
---
|
|
duration_ms: 202.180916
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments accepts builder events without parent ids and filters replies
|
|
ok 11 - listVideoComments accepts builder events without parent ids and filters replies
|
|
---
|
|
duration_ms: 5.90168
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
ok 12 - CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
---
|
|
duration_ms: 33.974583
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService loadThread falls back to event id when address is missing
|
|
ok 13 - CommentThreadService loadThread falls back to event id when address is missing
|
|
---
|
|
duration_ms: 0.819653
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService requests and snapshots comments by root identifier
|
|
ok 14 - CommentThreadService requests and snapshots comments by root identifier
|
|
---
|
|
duration_ms: 0.745666
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService falls back to pointerIdentifiers root id
|
|
ok 15 - CommentThreadService falls back to pointerIdentifiers root id
|
|
---
|
|
duration_ms: 0.790199
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
ok 16 - CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
---
|
|
duration_ms: 5.216459
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService teardown cancels hydration timers
|
|
ok 17 - CommentThreadService teardown cancels hydration timers
|
|
---
|
|
duration_ms: 81.181975
|
|
type: 'test'
|
|
...
|
|
1..17
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 430.874374
|
|
|
|
→ Running tests/compliance/nip04_44_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-04/44 Compliance: Encryption Preference
|
|
# Subtest: createNip46Cipher prefers nip44.v2 when available
|
|
ok 1 - createNip46Cipher prefers nip44.v2 when available
|
|
---
|
|
duration_ms: 21.560216
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Cipher falls back to nip04 if nip44 is missing
|
|
ok 2 - createNip46Cipher falls back to nip04 if nip44 is missing
|
|
---
|
|
duration_ms: 9.535353
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-04/44 Compliance: Encryption Preference
|
|
---
|
|
duration_ms: 122.610928
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-04/44 Compliance: Decryption Fallback
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
ok 1 - decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
---
|
|
duration_ms: 25.870269
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip04 payload
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip04 payload
|
|
---
|
|
duration_ms: 36.581415
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - NIP-04/44 Compliance: Decryption Fallback
|
|
---
|
|
duration_ms: 64.71237
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 206.652054
|
|
|
|
→ Running tests/compliance/nip07_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Compliance: Retry Logic
|
|
# Subtest: runNip07WithRetry succeeds on first try
|
|
ok 1 - runNip07WithRetry succeeds on first try
|
|
---
|
|
duration_ms: 2.021351
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry retries on timeout error
|
|
ok 2 - runNip07WithRetry retries on timeout error
|
|
---
|
|
duration_ms: 20.804337
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry fails after max retries or if error is not timeout
|
|
ok 3 - runNip07WithRetry fails after max retries or if error is not timeout
|
|
---
|
|
duration_ms: 1.209118
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - NIP-07 Compliance: Retry Logic
|
|
---
|
|
duration_ms: 25.648444
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 59.274839
|
|
|
|
→ Running tests/compliance/nip65_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-65 Compliance: Relay List Loading
|
|
# Subtest: loadRelayList requests Kind 10002
|
|
ok 1 - loadRelayList requests Kind 10002
|
|
---
|
|
duration_ms: 6.934884
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadRelayList parses r tags correctly
|
|
ok 2 - loadRelayList parses r tags correctly
|
|
---
|
|
duration_ms: 0.329896
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-65 Compliance: Relay List Loading
|
|
---
|
|
duration_ms: 158.312117
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 172.028991
|
|
|
|
→ Running tests/compliance/video_note_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: Video Note Compliance (Kind 30078 & NIP-71)
|
|
# Subtest: prepareVideoPublishPayload creates Kind 30078 event
|
|
ok 1 - prepareVideoPublishPayload creates Kind 30078 event
|
|
---
|
|
duration_ms: 2.674873
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
ok 2 - prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
---
|
|
duration_ms: 0.957472
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Video Note Compliance (Kind 30078 & NIP-71)
|
|
---
|
|
duration_ms: 39.709423
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 54.047089
|
|
|
|
→ Running tests/design-system-metrics.test.mjs
|
|
TAP version 13
|
|
# Subtest: metric probe falls back to numeric parsing when measurement fails
|
|
ok 1 - metric probe falls back to numeric parsing when measurement fails
|
|
---
|
|
duration_ms: 258.83015
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 275.066096
|
|
|
|
→ Running tests/designSystem/dynamicStyles.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/designSystem/dynamicStyles.js
|
|
# Subtest: registerScope
|
|
# Subtest: should register a scope and return a string ID
|
|
ok 1 - should register a scope and return a string ID
|
|
---
|
|
duration_ms: 118.742464
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a style element or use adoptedStyleSheets
|
|
ok 2 - should create a style element or use adoptedStyleSheets
|
|
---
|
|
duration_ms: 15.288436
|
|
type: 'test'
|
|
...
|
|
# Subtest: should insert rules with the correct selector
|
|
ok 3 - should insert rules with the correct selector
|
|
---
|
|
duration_ms: 13.14124
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle "&" in selectors
|
|
ok 4 - should handle "&" in selectors
|
|
---
|
|
duration_ms: 11.58199
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - registerScope
|
|
---
|
|
duration_ms: 160.248423
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setVariables
|
|
# Subtest: should update CSS variables on the scope
|
|
ok 1 - should update CSS variables on the scope
|
|
---
|
|
duration_ms: 11.622113
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle removing variables
|
|
ok 2 - should handle removing variables
|
|
---
|
|
duration_ms: 10.689878
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setVariables
|
|
---
|
|
duration_ms: 22.794895
|
|
type: 'suite'
|
|
...
|
|
# Subtest: releaseScope
|
|
# Subtest: should remove rules and clean up
|
|
ok 1 - should remove rules and clean up
|
|
---
|
|
duration_ms: 9.432565
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for non-existent scope
|
|
ok 2 - should return false for non-existent scope
|
|
---
|
|
duration_ms: 8.485024
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - releaseScope
|
|
---
|
|
duration_ms: 18.297913
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Isolation
|
|
# Subtest: should manage scopes independently for different documents
|
|
ok 1 - should manage scopes independently for different documents
|
|
---
|
|
duration_ms: 33.53914
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 4 - Isolation
|
|
---
|
|
duration_ms: 33.695457
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Edge cases
|
|
# Subtest: should handle invalid selectors gracefully
|
|
ok 1 - should handle invalid selectors gracefully
|
|
---
|
|
duration_ms: 9.917057
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing document gracefully
|
|
ok 2 - should handle missing document gracefully
|
|
---
|
|
duration_ms: 7.360211
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fallback to <style> element if CSSStyleSheet is missing
|
|
ok 3 - should fallback to <style> element if CSSStyleSheet is missing
|
|
---
|
|
duration_ms: 16.517796
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 5 - Edge cases
|
|
---
|
|
duration_ms: 34.190991
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - js/designSystem/dynamicStyles.js
|
|
---
|
|
duration_ms: 270.992917
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 6
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 297.794367
|
|
|
|
→ Running tests/dm-block-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM block/mute filtering
|
|
# Subtest: setDmBlockChecker
|
|
# Subtest: should accept a function
|
|
ok 1 - should accept a function
|
|
---
|
|
duration_ms: 1.767813
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed null
|
|
ok 2 - should clear checker when passed null
|
|
---
|
|
duration_ms: 0.473871
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed non-function
|
|
ok 3 - should clear checker when passed non-function
|
|
---
|
|
duration_ms: 1.156344
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - setDmBlockChecker
|
|
---
|
|
duration_ms: 4.853278
|
|
type: 'suite'
|
|
...
|
|
# Subtest: applyDirectMessage with block checker
|
|
# Subtest: should drop messages from blocked senders
|
|
ok 1 - should drop messages from blocked senders
|
|
---
|
|
duration_ms: 1.188959
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow messages from non-blocked senders
|
|
ok 2 - should allow messages from non-blocked senders
|
|
---
|
|
duration_ms: 3.345742
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow all messages when no block checker is set
|
|
ok 3 - should allow all messages when no block checker is set
|
|
---
|
|
duration_ms: 0.67722
|
|
type: 'test'
|
|
...
|
|
# Subtest: should block outgoing messages to blocked recipients
|
|
ok 4 - should block outgoing messages to blocked recipients
|
|
---
|
|
duration_ms: 0.393858
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyDirectMessage with block checker
|
|
---
|
|
duration_ms: 6.482404
|
|
type: 'suite'
|
|
...
|
|
# Subtest: _isDmRemoteBlocked
|
|
# Subtest: should return false when no checker is set
|
|
ok 1 - should return false when no checker is set
|
|
---
|
|
duration_ms: 0.513608
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true for blocked remote pubkey
|
|
ok 2 - should return true for blocked remote pubkey
|
|
---
|
|
duration_ms: 0.649322
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for allowed remote pubkey
|
|
ok 3 - should return false for allowed remote pubkey
|
|
---
|
|
duration_ms: 0.612276
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle checker that throws
|
|
ok 4 - should handle checker that throws
|
|
---
|
|
duration_ms: 0.516034
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - _isDmRemoteBlocked
|
|
---
|
|
duration_ms: 2.651434
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - DM block/mute filtering
|
|
---
|
|
duration_ms: 15.147026
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 4
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 37.857706
|
|
|
|
→ Running tests/dm-db.test.mjs
|
|
TAP version 13
|
|
# Subtest: writeMessages normalizes records before storing
|
|
ok 1 - writeMessages normalizes records before storing
|
|
---
|
|
duration_ms: 24.306306
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateConversationFromMessage persists metadata updates
|
|
ok 2 - updateConversationFromMessage persists metadata updates
|
|
---
|
|
duration_ms: 7.233916
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 40.015566
|
|
|
|
→ Running tests/dm-decryptor.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM handles kind 4 events with nip04 ciphertext
|
|
ok 1 - decryptDM handles kind 4 events with nip04 ciphertext
|
|
---
|
|
duration_ms: 97.17225
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM prefers recipient pubkeys when actor is the sender
|
|
ok 2 - decryptDM prefers recipient pubkeys when actor is the sender
|
|
---
|
|
duration_ms: 23.319036
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM unwraps kind 1059 gift wraps with nip44
|
|
ok 3 - decryptDM unwraps kind 1059 gift wraps with nip44
|
|
---
|
|
duration_ms: 70.080809
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM returns failure when decryptors are unavailable
|
|
ok 4 - decryptDM returns failure when decryptors are unavailable
|
|
---
|
|
duration_ms: 0.327535
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 207.707528
|
|
|
|
→ Running tests/dm-normalization.test.mjs
|
|
TAP version 13
|
|
# Subtest: direct message normalization hashes conversations consistently
|
|
ok 1 - direct message normalization hashes conversations consistently
|
|
---
|
|
duration_ms: 17.126532
|
|
type: 'test'
|
|
...
|
|
# Subtest: direct message list dedupes entries by event id
|
|
ok 2 - direct message list dedupes entries by event id
|
|
---
|
|
duration_ms: 6.343349
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/docs/verify-upload-claims.test.mjs
|
|
TAP version 13
|
|
# Subtest: Documentation Accuracy Verification
|
|
# Subtest: setup
|
|
ok 1 - setup
|
|
---
|
|
duration_ms: 7.938749
|
|
type: 'test'
|
|
...
|
|
# Subtest: should list accepted video file extensions in docs matching the HTML accept attribute
|
|
ok 2 - should list accepted video file extensions in docs matching the HTML accept attribute
|
|
---
|
|
duration_ms: 0.605974
|
|
type: 'test'
|
|
...
|
|
# Subtest: should state Title is required in docs and be required in HTML
|
|
ok 3 - should state Title is required in docs and be required in HTML
|
|
---
|
|
duration_ms: 0.453575
|
|
type: 'test'
|
|
...
|
|
# Subtest: should mention 2GB limit recommendation in docs and HTML
|
|
ok 4 - should mention 2GB limit recommendation in docs and HTML
|
|
---
|
|
duration_ms: 0.326021
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Documentation Accuracy Verification
|
|
---
|
|
duration_ms: 11.408387
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.466843
|
|
|
|
→ Running tests/edit-modal-submit-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: ignores additional submissions while pending without spurious errors
|
|
ok 1 - ignores additional submissions while pending without spurious errors
|
|
---
|
|
duration_ms: 304.666224
|
|
type: 'test'
|
|
...
|
|
# Subtest: editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
ok 2 - editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
---
|
|
duration_ms: 103.316811
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not show missing video error after modal closes
|
|
ok 3 - does not show missing video error after modal closes
|
|
---
|
|
duration_ms: 88.348735
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 509.659098
|
|
|
|
→ Running tests/event-schemas.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Event Schemas
|
|
# Subtest: should validate buildVideoPostEvent
|
|
ok 1 - should validate buildVideoPostEvent
|
|
---
|
|
duration_ms: 2.281985
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildVideoMirrorEvent
|
|
ok 2 - should validate buildVideoMirrorEvent
|
|
---
|
|
duration_ms: 0.410384
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRepostEvent
|
|
ok 3 - should validate buildRepostEvent
|
|
---
|
|
duration_ms: 0.461189
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildShareEvent
|
|
ok 4 - should validate buildShareEvent
|
|
---
|
|
duration_ms: 0.649713
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRelayListEvent
|
|
ok 5 - should validate buildRelayListEvent
|
|
---
|
|
duration_ms: 0.505095
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmRelayListEvent
|
|
ok 6 - should validate buildDmRelayListEvent
|
|
---
|
|
duration_ms: 0.423654
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildProfileMetadataEvent
|
|
ok 7 - should validate buildProfileMetadataEvent
|
|
---
|
|
duration_ms: 0.427399
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildMuteListEvent
|
|
ok 8 - should validate buildMuteListEvent
|
|
---
|
|
duration_ms: 0.481639
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDeletionEvent
|
|
ok 9 - should validate buildDeletionEvent
|
|
---
|
|
duration_ms: 0.804249
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildLegacyDirectMessageEvent
|
|
ok 10 - should validate buildLegacyDirectMessageEvent
|
|
---
|
|
duration_ms: 0.457759
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmAttachmentEvent
|
|
ok 11 - should validate buildDmAttachmentEvent
|
|
---
|
|
duration_ms: 0.391842
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmReadReceiptEvent
|
|
ok 12 - should validate buildDmReadReceiptEvent
|
|
---
|
|
duration_ms: 0.273856
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmTypingIndicatorEvent
|
|
ok 13 - should validate buildDmTypingIndicatorEvent
|
|
---
|
|
duration_ms: 0.245137
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildViewEvent
|
|
ok 14 - should validate buildViewEvent
|
|
---
|
|
duration_ms: 0.485322
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildZapRequestEvent
|
|
ok 15 - should validate buildZapRequestEvent
|
|
---
|
|
duration_ms: 0.409312
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildReactionEvent
|
|
ok 16 - should validate buildReactionEvent
|
|
---
|
|
duration_ms: 0.842008
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildCommentEvent
|
|
ok 17 - should validate buildCommentEvent
|
|
---
|
|
duration_ms: 0.923819
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildWatchHistoryEvent
|
|
ok 18 - should validate buildWatchHistoryEvent
|
|
---
|
|
duration_ms: 0.299881
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildSubscriptionListEvent
|
|
ok 19 - should validate buildSubscriptionListEvent
|
|
---
|
|
duration_ms: 0.258069
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildBlockListEvent
|
|
ok 20 - should validate buildBlockListEvent
|
|
---
|
|
duration_ms: 0.199532
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildHashtagPreferenceEvent
|
|
ok 21 - should validate buildHashtagPreferenceEvent
|
|
---
|
|
duration_ms: 0.17345
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildAdminListEvent (moderation)
|
|
ok 22 - should validate buildAdminListEvent (moderation)
|
|
---
|
|
duration_ms: 0.348131
|
|
type: 'test'
|
|
...
|
|
1..22
|
|
ok 1 - Nostr Event Schemas
|
|
---
|
|
duration_ms: 14.638971
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 22
|
|
# suites 1
|
|
# pass 22
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 38.073914
|
|
|
|
→ Running tests/feed-engine/explore-diversity.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore diversity sorter increases tag diversity in the top results
|
|
ok 1 - explore diversity sorter increases tag diversity in the top results
|
|
---
|
|
duration_ms: 2.374231
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore diversity sorter logs why when MMR re-orders similar candidates
|
|
ok 2 - explore diversity sorter logs why when MMR re-orders similar candidates
|
|
---
|
|
duration_ms: 1.248944
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.98509
|
|
|
|
→ Running tests/feed-engine/explore-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore disinterest filter drops videos with disinterested tags
|
|
ok 1 - explore disinterest filter drops videos with disinterested tags
|
|
---
|
|
duration_ms: 1.694855
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer penalizes disinterest overlap and logs why metadata
|
|
ok 2 - explore scorer penalizes disinterest overlap and logs why metadata
|
|
---
|
|
duration_ms: 1.899736
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer rewards novelty and new tag fraction
|
|
ok 3 - explore scorer rewards novelty and new tag fraction
|
|
---
|
|
duration_ms: 0.504312
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.578142
|
|
|
|
→ Running tests/feed-engine/kids-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: kids scorer correctly identifies dominant positive component
|
|
ok 1 - kids scorer correctly identifies dominant positive component
|
|
---
|
|
duration_ms: 2.642113
|
|
type: 'test'
|
|
...
|
|
# Subtest: kids scorer picks educational-boost when dominant
|
|
ok 2 - kids scorer picks educational-boost when dominant
|
|
---
|
|
duration_ms: 0.466284
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.766806
|
|
|
|
→ Running tests/feed-engine/tag-preference-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: tag preference stage filters by interests and excludes disinterests
|
|
ok 1 - tag preference stage filters by interests and excludes disinterests
|
|
---
|
|
duration_ms: 2.934538
|
|
type: 'test'
|
|
...
|
|
# Subtest: tag preference stage accepts interests from nip71 hashtags
|
|
ok 2 - tag preference stage accepts interests from nip71 hashtags
|
|
---
|
|
duration_ms: 0.37041
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.161403
|
|
|
|
→ Running tests/grid-health.test.mjs
|
|
TAP version 13
|
|
# Subtest: prioritizeEntries input validation
|
|
ok 1 - prioritizeEntries input validation
|
|
---
|
|
duration_ms: 80.380326
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries filtering
|
|
ok 2 - prioritizeEntries filtering
|
|
---
|
|
duration_ms: 11.975572
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries without viewport center
|
|
ok 3 - prioritizeEntries without viewport center
|
|
---
|
|
duration_ms: 10.661044
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries with viewport center
|
|
ok 4 - prioritizeEntries with viewport center
|
|
---
|
|
duration_ms: 8.463493
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries ratio prioritization when distances are similar
|
|
ok 5 - prioritizeEntries ratio prioritization when distances are similar
|
|
---
|
|
duration_ms: 9.915517
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries uses boundingClientRect fallback
|
|
ok 6 - prioritizeEntries uses boundingClientRect fallback
|
|
---
|
|
duration_ms: 8.023441
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 148.297157
|
|
|
|
→ Running tests/hashtag-preferences.test.mjs
|
|
[bitvid] [HashtagPreferences] Failed to decrypt hashtag preferences Error: Decrypt permissions are required to read hashtag preferences.
|
|
at HashtagPreferencesService.decryptEvent (file:///app/js/services/hashtagPreferencesService.js:1011:23)
|
|
at async HashtagPreferencesService.loadInternal (file:///app/js/services/hashtagPreferencesService.js:854:25)
|
|
at async HashtagPreferencesService.load (file:///app/js/services/hashtagPreferencesService.js:566:7)
|
|
at async TestContext.<anonymous> (file:///app/tests/hashtag-preferences.test.mjs:291:7)
|
|
at async Test.run (node:internal/test_runner/test:1054:7)
|
|
at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) {
|
|
code: 'hashtag-preferences-permission-required'
|
|
}
|
|
TAP version 13
|
|
# Subtest: load decrypts nip44 payloads and normalizes tags
|
|
ok 1 - load decrypts nip44 payloads and normalizes tags
|
|
---
|
|
duration_ms: 22.530756
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to nip04 decryption
|
|
ok 2 - load falls back to nip04 decryption
|
|
---
|
|
duration_ms: 2.720721
|
|
type: 'test'
|
|
...
|
|
# Subtest: load retries decryptors when hinted scheme fails
|
|
ok 3 - load retries decryptors when hinted scheme fails
|
|
---
|
|
duration_ms: 2.432953
|
|
type: 'test'
|
|
...
|
|
# Subtest: load defers permission-required decrypts until explicitly enabled
|
|
ok 4 - load defers permission-required decrypts until explicitly enabled
|
|
---
|
|
duration_ms: 6.774312
|
|
type: 'test'
|
|
...
|
|
# Subtest: interest and disinterest lists remain exclusive
|
|
ok 5 - interest and disinterest lists remain exclusive
|
|
---
|
|
duration_ms: 12.129297
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish encrypts payload and builds event via builder
|
|
ok 6 - publish encrypts payload and builds event via builder
|
|
---
|
|
duration_ms: 2.613241
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish falls back to window nostr encryptors
|
|
ok 7 - publish falls back to window nostr encryptors
|
|
---
|
|
duration_ms: 2.808012
|
|
type: 'test'
|
|
...
|
|
# Subtest: load prefers canonical kind when timestamps match while accepting legacy payload
|
|
ok 8 - load prefers canonical kind when timestamps match while accepting legacy payload
|
|
---
|
|
duration_ms: 2.446301
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer is missing
|
|
ok 9 - load falls back to window.nostr when active signer is missing
|
|
---
|
|
duration_ms: 2.069538
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
ok 10 - load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
---
|
|
duration_ms: 1.590071
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/login-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: LoginModalController shows custom error for empty nsec input
|
|
ok 1 - LoginModalController shows custom error for empty nsec input
|
|
---
|
|
duration_ms: 199.965192
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController does not set required attribute when toggling modes
|
|
ok 2 - LoginModalController does not set required attribute when toggling modes
|
|
---
|
|
duration_ms: 68.511107
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController shows NIP-46 handshake panel
|
|
ok 3 - LoginModalController shows NIP-46 handshake panel
|
|
---
|
|
duration_ms: 56.186881
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 338.743913
|
|
|
|
→ Running tests/magnet-utils.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeMagnet handles encoded values
|
|
ok 1 - safeDecodeMagnet handles encoded values
|
|
---
|
|
duration_ms: 1.509065
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeMagnet leaves plain strings untouched
|
|
ok 2 - safeDecodeMagnet leaves plain strings untouched
|
|
---
|
|
duration_ms: 0.276919
|
|
type: 'test'
|
|
...
|
|
# Subtest: bare hashes normalize consistently
|
|
ok 3 - bare hashes normalize consistently
|
|
---
|
|
duration_ms: 2.849335
|
|
type: 'test'
|
|
...
|
|
# Subtest: legacy %3A payloads decode
|
|
ok 4 - legacy %3A payloads decode
|
|
---
|
|
duration_ms: 0.703859
|
|
type: 'test'
|
|
...
|
|
# Subtest: duplicate trackers and hints stay in sync
|
|
ok 5 - duplicate trackers and hints stay in sync
|
|
---
|
|
duration_ms: 0.981367
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper enforces HTTPS web seeds when on HTTPS
|
|
ok 6 - object helper enforces HTTPS web seeds when on HTTPS
|
|
---
|
|
duration_ms: 0.450922
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper allows HTTP seeds on HTTP origins
|
|
ok 7 - object helper allows HTTP seeds on HTTP origins
|
|
---
|
|
duration_ms: 0.456801
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractMagnetHints returns first ws/xs pair
|
|
ok 8 - extractMagnetHints returns first ws/xs pair
|
|
---
|
|
duration_ms: 0.48846
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper reports didChange when output differs
|
|
ok 9 - object helper reports didChange when output differs
|
|
---
|
|
duration_ms: 0.690696
|
|
type: 'test'
|
|
...
|
|
# Subtest: helpers trim fragments from non-magnet values
|
|
ok 10 - helpers trim fragments from non-magnet values
|
|
---
|
|
duration_ms: 0.55353
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet filters out known broken trackers
|
|
ok 11 - normalizeAndAugmentMagnet filters out known broken trackers
|
|
---
|
|
duration_ms: 0.74397
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput parses each inbound parameter exactly once
|
|
ok 12 - normalizeMagnetInput parses each inbound parameter exactly once
|
|
---
|
|
duration_ms: 0.282123
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
ok 13 - normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
---
|
|
duration_ms: 0.617126
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
ok 14 - normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
---
|
|
duration_ms: 0.343377
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.326479
|
|
|
|
→ Running tests/media-loader.test.mjs
|
|
TAP version 13
|
|
# Subtest: MediaLoader assigns image sources once intersecting
|
|
ok 1 - MediaLoader assigns image sources once intersecting
|
|
---
|
|
duration_ms: 92.326951
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader loads video sources and poster fallbacks
|
|
ok 2 - MediaLoader loads video sources and poster fallbacks
|
|
---
|
|
duration_ms: 20.462389
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader clears unsupported lazy targets without inline styles
|
|
ok 3 - MediaLoader clears unsupported lazy targets without inline styles
|
|
---
|
|
duration_ms: 10.389176
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 135.991973
|
|
|
|
→ Running tests/minimal-channel-profile.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import channelProfile
|
|
ok 1 - can import channelProfile
|
|
---
|
|
duration_ms: 1.128111
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.336429
|
|
|
|
→ Running tests/minimal-webtorrent.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import WebTorrent
|
|
ok 1 - can import WebTorrent
|
|
---
|
|
duration_ms: 1.329438
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.733485
|
|
|
|
→ Running tests/modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal closes on Escape and restores trigger focus
|
|
ok 1 - UploadModal closes on Escape and restores trigger focus
|
|
---
|
|
duration_ms: 244.977012
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal backdrop click closes and restores trigger focus
|
|
ok 2 - UploadModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 82.776463
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal mode toggle updates button states
|
|
ok 3 - UploadModal mode toggle updates button states
|
|
---
|
|
duration_ms: 63.488855
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal Escape closes and restores trigger focus
|
|
ok 4 - EditModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 108.494013
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal backdrop click closes and restores trigger focus
|
|
ok 5 - EditModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 81.622056
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal visibility toggle updates button state
|
|
ok 6 - EditModal visibility toggle updates button state
|
|
---
|
|
duration_ms: 79.390277
|
|
type: 'test'
|
|
...
|
|
# Subtest: RevertModal Escape closes and restores trigger focus
|
|
ok 7 - RevertModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 49.306148
|
|
type: 'test'
|
|
...
|
|
# Subtest: static modal helper toggles accessibility hooks
|
|
ok 8 - static modal helper toggles accessibility hooks
|
|
---
|
|
duration_ms: 12.717998
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 732.809127
|
|
|
|
→ Running tests/moderation-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted report summaries respect personal blocks and admin lists
|
|
ok 1 - trusted report summaries respect personal blocks and admin lists
|
|
---
|
|
duration_ms: 4.959654
|
|
type: 'test'
|
|
...
|
|
# Subtest: user block updates recompute summaries and emit notifications
|
|
ok 2 - user block updates recompute summaries and emit notifications
|
|
---
|
|
duration_ms: 4.372416
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation thresholds emit logger hooks only when crossing
|
|
ok 3 - moderation thresholds emit logger hooks only when crossing
|
|
---
|
|
duration_ms: 1.756981
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute aggregation tracks F1 mute lists
|
|
ok 4 - trusted mute aggregation tracks F1 mute lists
|
|
---
|
|
duration_ms: 1.681021
|
|
type: 'test'
|
|
...
|
|
# Subtest: viewer mute list publishes and updates aggregation
|
|
ok 5 - viewer mute list publishes and updates aggregation
|
|
---
|
|
duration_ms: 2.642487
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2021.793265
|
|
|
|
→ Running tests/moderation-stage.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage enforces admin lists without whitelist bypass
|
|
ok 1 - moderation stage enforces admin lists without whitelist bypass
|
|
---
|
|
duration_ms: 4.517488
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage annotates trusted mute metadata
|
|
ok 2 - moderation stage annotates trusted mute metadata
|
|
---
|
|
duration_ms: 0.930503
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage applies provided thresholds
|
|
ok 3 - moderation stage applies provided thresholds
|
|
---
|
|
duration_ms: 1.115923
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime threshold changes
|
|
ok 4 - moderation stage respects runtime threshold changes
|
|
---
|
|
duration_ms: 0.953092
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports function-based threshold resolvers
|
|
ok 5 - moderation stage supports function-based threshold resolvers
|
|
---
|
|
duration_ms: 0.720097
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage propagates whitelist, muters, and threshold updates
|
|
ok 6 - moderation stage propagates whitelist, muters, and threshold updates
|
|
---
|
|
duration_ms: 1.292176
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage blurs viewer-muted authors
|
|
ok 7 - moderation stage blurs viewer-muted authors
|
|
---
|
|
duration_ms: 0.720121
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage clears cached reporters and muters after service signals
|
|
ok 8 - moderation stage clears cached reporters and muters after service signals
|
|
---
|
|
duration_ms: 0.96231
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.355106
|
|
|
|
→ Running tests/moderation/hide-thresholds.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage hides videos muted by trusted when threshold met
|
|
ok 1 - moderation stage hides videos muted by trusted when threshold met
|
|
---
|
|
duration_ms: 4.32302
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides videos when trusted reports exceed threshold
|
|
ok 2 - moderation stage hides videos when trusted reports exceed threshold
|
|
---
|
|
duration_ms: 0.716917
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime hide threshold changes
|
|
ok 3 - moderation stage respects runtime hide threshold changes
|
|
---
|
|
duration_ms: 0.935115
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports trusted mute hide resolver functions
|
|
ok 4 - moderation stage supports trusted mute hide resolver functions
|
|
---
|
|
duration_ms: 1.118154
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage bypasses hard hides on home feed
|
|
ok 5 - moderation stage bypasses hard hides on home feed
|
|
---
|
|
duration_ms: 0.699528
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides admin-whitelisted videos once thresholds fire
|
|
ok 6 - moderation stage hides admin-whitelisted videos once thresholds fire
|
|
---
|
|
duration_ms: 0.78652
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.111301
|
|
|
|
→ Running tests/moderation/submit-report.test.mjs
|
|
TAP version 13
|
|
# Subtest: submitReport emits NIP-56 compliant report tags
|
|
ok 1 - submitReport emits NIP-56 compliant report tags
|
|
---
|
|
duration_ms: 10.892459
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.024291
|
|
|
|
→ Running tests/moderation/trust-seeds.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: default trust seeds derive from config
|
|
ok 1 - default trust seeds derive from config
|
|
---
|
|
duration_ms: 2.238524
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted mute counts
|
|
ok 2 - trusted seeds contribute to trusted mute counts
|
|
---
|
|
duration_ms: 4.171598
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted report counts
|
|
ok 3 - trusted seeds contribute to trusted report counts
|
|
---
|
|
duration_ms: 3.499483
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seed updates recompute guest report summaries
|
|
ok 4 - trusted seed updates recompute guest report summaries
|
|
---
|
|
duration_ms: 1.273085
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderator seeds populate trusted contacts
|
|
ok 5 - moderator seeds populate trusted contacts
|
|
---
|
|
duration_ms: 0.823087
|
|
type: 'test'
|
|
...
|
|
# Subtest: bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
ok 6 - bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
---
|
|
duration_ms: 83.458531
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3603.328503
|
|
|
|
→ Running tests/moderation/trusted-mute-lists.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted mute lists from seeds hide authors for anonymous viewers
|
|
ok 1 - trusted mute lists from seeds hide authors for anonymous viewers
|
|
---
|
|
duration_ms: 13.281191
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2017.603011
|
|
|
|
→ Running tests/moderation/trusted-report-count.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
ok 1 - trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
---
|
|
duration_ms: 6.545352
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount ignores reports from muted or blocked reporters
|
|
ok 2 - trustedReportCount ignores reports from muted or blocked reporters
|
|
---
|
|
duration_ms: 2.660834
|
|
type: 'test'
|
|
...
|
|
# Subtest: blocking and unblocking reporters recomputes trusted summaries
|
|
ok 3 - blocking and unblocking reporters recomputes trusted summaries
|
|
---
|
|
duration_ms: 3.247666
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
ok 4 - trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
---
|
|
duration_ms: 2.155962
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2021.151959
|
|
|
|
→ Running tests/moderation/video-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoCard renders moderation badges and respects viewer override
|
|
ok 1 - VideoCard renders moderation badges and respects viewer override
|
|
---
|
|
duration_ms: 147.977415
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides content when hide metadata is present and override unmasks it
|
|
ok 2 - VideoCard hides content when hide metadata is present and override unmasks it
|
|
---
|
|
duration_ms: 36.563336
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs viewer-muted creators
|
|
ok 3 - VideoCard blurs viewer-muted creators
|
|
---
|
|
duration_ms: 20.851134
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
ok 4 - VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
---
|
|
duration_ms: 18.83994
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard block action restores trusted mute hide state after override
|
|
ok 5 - VideoCard block action restores trusted mute hide state after override
|
|
---
|
|
duration_ms: 35.116742
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyModerationContextDatasets clears blur when overrides are active
|
|
ok 6 - applyModerationContextDatasets clears blur when overrides are active
|
|
---
|
|
duration_ms: 10.650971
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
ok 7 - buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
---
|
|
duration_ms: 0.378652
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 289.81006
|
|
|
|
→ Running tests/more-menu-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: copy-link action writes to clipboard and shows success
|
|
ok 1 - copy-link action writes to clipboard and shows success
|
|
---
|
|
duration_ms: 3.200155
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author requires moderator access and refreshes subscriptions
|
|
ok 2 - blacklist-author requires moderator access and refreshes subscriptions
|
|
---
|
|
duration_ms: 0.703685
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author shows error when no moderator session is available
|
|
ok 3 - blacklist-author shows error when no moderator session is available
|
|
---
|
|
duration_ms: 0.349851
|
|
type: 'test'
|
|
...
|
|
# Subtest: block-author updates user blocks, reloads videos, and refreshes feeds
|
|
ok 4 - block-author updates user blocks, reloads videos, and refreshes feeds
|
|
---
|
|
duration_ms: 0.692048
|
|
type: 'test'
|
|
...
|
|
# Subtest: mute-author updates viewer mute list and refreshes feeds
|
|
ok 5 - mute-author updates viewer mute list and refreshes feeds
|
|
---
|
|
duration_ms: 0.725422
|
|
type: 'test'
|
|
...
|
|
# Subtest: unmute-author removes creators from viewer mute list
|
|
ok 6 - unmute-author removes creators from viewer mute list
|
|
---
|
|
duration_ms: 0.666651
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.532789
|
|
|
|
→ Running tests/nip07-concurrency.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Concurrency Queue
|
|
# Subtest: runs up to 5 tasks concurrently
|
|
ok 1 - runs up to 5 tasks concurrently
|
|
---
|
|
duration_ms: 306.237587
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects priority
|
|
ok 2 - respects priority
|
|
---
|
|
duration_ms: 153.796177
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-07 Concurrency Queue
|
|
---
|
|
duration_ms: 462.846557
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 472.205444
|
|
|
|
→ Running tests/nip71-base-event-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
ok 1 - 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
---
|
|
duration_ms: 7.959307
|
|
type: 'test'
|
|
...
|
|
# Subtest: imeta tags lower-case mime values
|
|
ok 2 - imeta tags lower-case mime values
|
|
---
|
|
duration_ms: 0.801373
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.359205
|
|
|
|
→ Running tests/nip71-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildNip71VideoEvent assembles rich metadata
|
|
ok 1 - buildNip71VideoEvent assembles rich metadata
|
|
---
|
|
duration_ms: 4.064412
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent falls back to summary and selects kind
|
|
ok 2 - buildNip71VideoEvent falls back to summary and selects kind
|
|
---
|
|
duration_ms: 0.380026
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent attaches pointer tags
|
|
ok 3 - buildNip71VideoEvent attaches pointer tags
|
|
---
|
|
duration_ms: 0.501358
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractNip71MetadataFromTags parses metadata and pointers
|
|
ok 4 - extractNip71MetadataFromTags parses metadata and pointers
|
|
---
|
|
duration_ms: 1.41197
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.806555
|
|
|
|
→ Running tests/nip71-form-manager.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectSection sanitizes and deduplicates hashtags
|
|
ok 1 - collectSection sanitizes and deduplicates hashtags
|
|
---
|
|
duration_ms: 134.321702
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSection renders sanitized hashtags with prefix
|
|
ok 2 - hydrateSection renders sanitized hashtags with prefix
|
|
---
|
|
duration_ms: 29.730208
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 183.76345
|
|
|
|
→ Running tests/nostr-login-permissions.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Login Permissions
|
|
# Subtest: NIP-07 login requests decrypt permissions upfront
|
|
ok 1 - NIP-07 login requests decrypt permissions upfront
|
|
---
|
|
duration_ms: 6.133036
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 decrypt reuses cached extension permissions
|
|
ok 2 - NIP-07 decrypt reuses cached extension permissions
|
|
---
|
|
duration_ms: 2.039115
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login falls back when structured permissions fail
|
|
ok 3 - NIP-07 login falls back when structured permissions fail
|
|
---
|
|
duration_ms: 1.850528
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login supports extensions that only allow enable() without payload
|
|
ok 4 - NIP-07 login supports extensions that only allow enable() without payload
|
|
---
|
|
duration_ms: 1.736013
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login quickly retries when a permission payload stalls
|
|
ok 5 - NIP-07 login quickly retries when a permission payload stalls
|
|
---
|
|
duration_ms: 82.841975
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login does not wait for deferred permission grants
|
|
ok 6 - NIP-07 login does not wait for deferred permission grants
|
|
---
|
|
duration_ms: 302.525259
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login surfaces enable permission errors
|
|
ok 7 - NIP-07 login surfaces enable permission errors
|
|
---
|
|
duration_ms: 2.176913
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry respects timeout without retry multiplier
|
|
ok 8 - runNip07WithRetry respects timeout without retry multiplier
|
|
---
|
|
duration_ms: 62.120341
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - NIP-07 Login Permissions
|
|
---
|
|
duration_ms: 463.830647
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 474.279583
|
|
|
|
→ Running tests/nostr-nip46-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
ok 1 - Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
---
|
|
duration_ms: 2.283373
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects priority levels
|
|
ok 2 - Nip46RequestQueue: respects priority levels
|
|
---
|
|
duration_ms: 10.723894
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects minDelayMs
|
|
ok 3 - Nip46RequestQueue: respects minDelayMs
|
|
---
|
|
duration_ms: 100.702281
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: clear() rejects pending tasks
|
|
ok 4 - Nip46RequestQueue: clear() rejects pending tasks
|
|
---
|
|
duration_ms: 101.739353
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 222.959652
|
|
|
|
→ Running tests/nostr-private-key-signer.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Private Key Signer
|
|
# Subtest: registerPrivateKeySigner exposes nip04 helpers
|
|
ok 1 - registerPrivateKeySigner exposes nip04 helpers
|
|
---
|
|
duration_ms: 157.213523
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Nostr Private Key Signer
|
|
---
|
|
duration_ms: 159.021529
|
|
type: 'suite'
|
|
...
|
|
|
|
→ Running tests/nostr-send-direct-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: sendDirectMessage succeeds with private key signer and no extension
|
|
ok 1 - sendDirectMessage succeeds with private key signer and no extension
|
|
---
|
|
duration_ms: 236.767204
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-service-access-control.test.mjs
|
|
TAP version 13
|
|
# Subtest: shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
ok 1 - shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
---
|
|
duration_ms: 3.047493
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
ok 2 - shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
---
|
|
duration_ms: 2.462848
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
ok 3 - shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
---
|
|
duration_ms: 65.773196
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo always returns true for the viewer's own video
|
|
ok 4 - shouldIncludeVideo always returns true for the viewer's own video
|
|
---
|
|
duration_ms: 0.578331
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo allows access when access control would deny the author
|
|
ok 5 - shouldIncludeVideo allows access when access control would deny the author
|
|
---
|
|
duration_ms: 0.470411
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: isSubtleCryptoAvailable returns true in test env
|
|
ok 1 - isSubtleCryptoAvailable returns true in test env
|
|
---
|
|
duration_ms: 2.796916
|
|
type: 'test'
|
|
...
|
|
# Subtest: generateRandomBytes returns correct length
|
|
ok 2 - generateRandomBytes returns correct length
|
|
---
|
|
duration_ms: 1.705625
|
|
type: 'test'
|
|
...
|
|
# Subtest: encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
ok 3 - encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 319.390642
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptSessionPrivateKey fails with wrong passphrase
|
|
ok 4 - decryptSessionPrivateKey fails with wrong passphrase
|
|
---
|
|
duration_ms: 300.35279
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor writes to localStorage and IndexedDB
|
|
ok 5 - persistSessionActor writes to localStorage and IndexedDB
|
|
---
|
|
duration_ms: 151.027319
|
|
type: 'test'
|
|
...
|
|
# Subtest: readStoredSessionActorEntry retrieves from localStorage
|
|
ok 6 - readStoredSessionActorEntry retrieves from localStorage
|
|
---
|
|
duration_ms: 152.321087
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes from localStorage
|
|
ok 7 - clearStoredSessionActor removes from localStorage
|
|
---
|
|
duration_ms: 1.083621
|
|
type: 'test'
|
|
...
|
|
# Subtest: helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
ok 8 - helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
---
|
|
duration_ms: 2.326116
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 941.138728
|
|
|
|
→ Running tests/nostr-signer-race.test.mjs
|
|
TAP version 13
|
|
# Subtest: ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
ok 1 - ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
---
|
|
duration_ms: 105.134556
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 113.698896
|
|
|
|
→ Running tests/nostr/adapters.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNsecAdapter wires signing and cipher capabilities
|
|
ok 1 - createNsecAdapter wires signing and cipher capabilities
|
|
---
|
|
duration_ms: 65.168322
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip07Adapter maps extension methods and permissions
|
|
ok 2 - createNip07Adapter maps extension methods and permissions
|
|
---
|
|
duration_ms: 3.104155
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Adapter wraps the remote signer client
|
|
ok 3 - createNip46Adapter wraps the remote signer client
|
|
---
|
|
duration_ms: 0.756644
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 81.569087
|
|
|
|
→ Running tests/nostr/cachePolicies.test.mjs
|
|
TAP version 13
|
|
# Subtest: CACHE_POLICIES structure
|
|
ok 1 - CACHE_POLICIES structure
|
|
---
|
|
duration_ms: 1.504274
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_POST policy
|
|
ok 2 - VIDEO_POST policy
|
|
---
|
|
duration_ms: 0.257643
|
|
type: 'test'
|
|
...
|
|
# Subtest: WATCH_HISTORY policy
|
|
ok 3 - WATCH_HISTORY policy
|
|
---
|
|
duration_ms: 0.251321
|
|
type: 'test'
|
|
...
|
|
# Subtest: SUBSCRIPTION_LIST policy
|
|
ok 4 - SUBSCRIPTION_LIST policy
|
|
---
|
|
duration_ms: 0.199751
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_COMMENT policy
|
|
ok 5 - VIDEO_COMMENT policy
|
|
---
|
|
duration_ms: 0.26523
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.306569
|
|
|
|
→ Running tests/nostr/client.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient
|
|
# Subtest: Initialization
|
|
# Subtest: should initialize with default state
|
|
ok 1 - should initialize with default state
|
|
---
|
|
duration_ms: 3.440528
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Initialization
|
|
---
|
|
duration_ms: 4.326699
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchListIncrementally
|
|
# Subtest: should fetch events and deduplicate results
|
|
ok 1 - should fetch events and deduplicate results
|
|
---
|
|
duration_ms: 3.207062
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle incremental updates using lastSeen
|
|
ok 2 - should handle incremental updates using lastSeen
|
|
---
|
|
duration_ms: 1.279713
|
|
type: 'test'
|
|
...
|
|
# Subtest: should override lastSeen with explicit since parameter
|
|
ok 3 - should override lastSeen with explicit since parameter
|
|
---
|
|
duration_ms: 1.107093
|
|
type: 'test'
|
|
...
|
|
# Subtest: should force full fetch if since is 0
|
|
ok 4 - should force full fetch if since is 0
|
|
---
|
|
duration_ms: 0.86953
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - fetchListIncrementally
|
|
---
|
|
duration_ms: 6.922212
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeVideos
|
|
# Subtest: should subscribe to video events and buffer them
|
|
ok 1 - should subscribe to video events and buffer them
|
|
---
|
|
duration_ms: 302.137405
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - subscribeVideos
|
|
---
|
|
duration_ms: 302.913574
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideos
|
|
# Subtest: should delegate to subscribeVideos and return result on eose
|
|
ok 1 - should delegate to subscribeVideos and return result on eose
|
|
---
|
|
duration_ms: 2.835202
|
|
type: 'test'
|
|
...
|
|
# Subtest: should respect since parameter if provided
|
|
ok 2 - should respect since parameter if provided
|
|
---
|
|
duration_ms: 5.381114
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - fetchVideos
|
|
---
|
|
duration_ms: 8.744142
|
|
type: 'suite'
|
|
...
|
|
# Subtest: publishVideo
|
|
# Subtest: should throw if not logged in
|
|
ok 1 - should throw if not logged in
|
|
---
|
|
duration_ms: 3.2001
|
|
type: 'test'
|
|
...
|
|
# Subtest: should sign and publish a valid video
|
|
ok 2 - should sign and publish a valid video
|
|
---
|
|
duration_ms: 4.79959
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - publishVideo
|
|
---
|
|
duration_ms: 8.27478
|
|
type: 'suite'
|
|
...
|
|
# Subtest: editVideo
|
|
# Subtest: should throw if not owner
|
|
ok 1 - should throw if not owner
|
|
---
|
|
duration_ms: 1.067249
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 6 - editVideo
|
|
---
|
|
duration_ms: 1.276205
|
|
type: 'suite'
|
|
...
|
|
# Subtest: revertVideo
|
|
# Subtest: should publish a deletion marker event
|
|
ok 1 - should publish a deletion marker event
|
|
---
|
|
duration_ms: 0.761812
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 7 - revertVideo
|
|
---
|
|
duration_ms: 0.903368
|
|
type: 'suite'
|
|
...
|
|
1..7
|
|
ok 1 - NostrClient
|
|
---
|
|
duration_ms: 334.701539
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 8
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 552.62969
|
|
|
|
→ Running tests/nostr/comment-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishComment prefers active signer when available
|
|
ok 1 - publishComment prefers active signer when available
|
|
---
|
|
duration_ms: 7.478685
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment rejects when active signer is unavailable
|
|
ok 2 - publishComment rejects when active signer is unavailable
|
|
---
|
|
duration_ms: 0.557964
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment accepts legacy targets with only an event id
|
|
ok 3 - publishComment accepts legacy targets with only an event id
|
|
---
|
|
duration_ms: 1.308132
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment derives root and parent metadata from parent comment tags
|
|
ok 4 - publishComment derives root and parent metadata from parent comment tags
|
|
---
|
|
duration_ms: 1.220852
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches comments even when tag casing and whitespace differ
|
|
ok 5 - listVideoComments matches comments even when tag casing and whitespace differ
|
|
---
|
|
duration_ms: 2.499402
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches uppercase definition addresses without lowering
|
|
ok 6 - listVideoComments matches uppercase definition addresses without lowering
|
|
---
|
|
duration_ms: 1.014453
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment emits only uppercase video event pointer when address and parent are absent
|
|
ok 7 - publishComment emits only uppercase video event pointer when address and parent are absent
|
|
---
|
|
duration_ms: 0.927658
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
ok 8 - listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
---
|
|
duration_ms: 1.329668
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments emits uppercase root filters when only the identifier is known
|
|
ok 9 - listVideoComments emits uppercase root filters when only the identifier is known
|
|
---
|
|
duration_ms: 1.268511
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments supports legacy targets without a definition address
|
|
ok 10 - listVideoComments supports legacy targets without a definition address
|
|
---
|
|
duration_ms: 1.215538
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
ok 11 - subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
---
|
|
duration_ms: 10.222331
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments supports video targets without a definition address
|
|
ok 12 - subscribeVideoComments supports video targets without a definition address
|
|
---
|
|
duration_ms: 0.760962
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 40.462206
|
|
|
|
→ Running tests/nostr/countDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: countDiagnostics
|
|
# Subtest: isVerboseDiagnosticsEnabled
|
|
# Subtest: should return true by default (due to override)
|
|
ok 1 - should return true by default (due to override)
|
|
---
|
|
duration_ms: 1.937722
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
ok 2 - should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
---
|
|
duration_ms: 0.562473
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
ok 3 - should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
---
|
|
duration_ms: 0.660329
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to isVerboseDevMode if window flag is not boolean
|
|
ok 4 - should fall back to isVerboseDevMode if window flag is not boolean
|
|
---
|
|
duration_ms: 0.589672
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - isVerboseDiagnosticsEnabled
|
|
---
|
|
duration_ms: 5.343968
|
|
type: 'suite'
|
|
...
|
|
# Subtest: logRelayCountFailure
|
|
# Subtest: should log warning for new relay URL
|
|
ok 1 - should log warning for new relay URL
|
|
---
|
|
duration_ms: 1.534857
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress 'Failed to connect to relay' errors
|
|
ok 2 - should suppress 'Failed to connect to relay' errors
|
|
---
|
|
duration_ms: 0.379212
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throttle duplicate warnings for the same relay
|
|
ok 3 - should throttle duplicate warnings for the same relay
|
|
---
|
|
duration_ms: 0.518351
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle empty or non-string relay URLs
|
|
ok 4 - should handle empty or non-string relay URLs
|
|
---
|
|
duration_ms: 0.65133
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - logRelayCountFailure
|
|
---
|
|
duration_ms: 3.765289
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Other Loggers
|
|
# Subtest: should log timeout cleanup failure once
|
|
ok 1 - should log timeout cleanup failure once
|
|
---
|
|
duration_ms: 0.671628
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log rebroadcast failure once
|
|
ok 2 - should log rebroadcast failure once
|
|
---
|
|
duration_ms: 0.410534
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log view count failure once
|
|
ok 3 - should log view count failure once
|
|
---
|
|
duration_ms: 0.522339
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - Other Loggers
|
|
---
|
|
duration_ms: 1.978164
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Verbose Mode Disabled
|
|
# Subtest: should not log even for new keys when disabled
|
|
ok 1 - should not log even for new keys when disabled
|
|
---
|
|
duration_ms: 0.54793
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not consume throttle key when disabled
|
|
ok 2 - should not consume throttle key when disabled
|
|
---
|
|
duration_ms: 0.478656
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - Verbose Mode Disabled
|
|
---
|
|
duration_ms: 1.189795
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - countDiagnostics
|
|
---
|
|
duration_ms: 18.991854
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 5
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 51.665032
|
|
|
|
→ Running tests/nostr/decryptionSchemeCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptionSchemeCache
|
|
# Subtest: stores and retrieves a scheme
|
|
ok 1 - stores and retrieves a scheme
|
|
---
|
|
duration_ms: 1.795707
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null for unknown pubkey
|
|
ok 2 - returns null for unknown pubkey
|
|
---
|
|
duration_ms: 0.509693
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 3 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.830836
|
|
type: 'test'
|
|
...
|
|
# Subtest: expires entries after TTL (2 hours)
|
|
ok 4 - expires entries after TTL (2 hours)
|
|
---
|
|
duration_ms: 0.668079
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not expire entries before TTL
|
|
ok 5 - does not expire entries before TTL
|
|
---
|
|
duration_ms: 0.36638
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears cache
|
|
ok 6 - clears cache
|
|
---
|
|
duration_ms: 0.249514
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - decryptionSchemeCache
|
|
---
|
|
duration_ms: 6.218954
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.895065
|
|
|
|
→ Running tests/nostr/defaultClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: Default NostrClient
|
|
# Subtest: should be an instance of NostrClient
|
|
ok 1 - should be an instance of NostrClient
|
|
---
|
|
duration_ms: 1.674575
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be configured with default relays
|
|
ok 2 - should be configured with default relays
|
|
---
|
|
duration_ms: 1.612041
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default read relays
|
|
ok 3 - should be initialized with default read relays
|
|
---
|
|
duration_ms: 0.286429
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default write relays
|
|
ok 4 - should be initialized with default write relays
|
|
---
|
|
duration_ms: 0.338411
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be registered as the default client
|
|
ok 5 - should be registered as the default client
|
|
---
|
|
duration_ms: 0.270383
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Default NostrClient
|
|
---
|
|
duration_ms: 6.411735
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.013991
|
|
|
|
→ Running tests/nostr/dm-direct-message-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM relay duplication is deduped
|
|
ok 1 - DM relay duplication is deduped
|
|
---
|
|
duration_ms: 172.500714
|
|
type: 'test'
|
|
...
|
|
# Subtest: out-of-order DM delivery keeps newest messages first
|
|
ok 2 - out-of-order DM delivery keeps newest messages first
|
|
---
|
|
duration_ms: 107.333002
|
|
type: 'test'
|
|
...
|
|
# Subtest: DM reconnect replays do not duplicate messages or reset seen state
|
|
ok 3 - DM reconnect replays do not duplicate messages or reset seen state
|
|
---
|
|
duration_ms: 180.369073
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 469.394905
|
|
|
|
→ Running tests/nostr/dmDecryptDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptDiagnostics
|
|
# Subtest: summarizeDmEventForLog
|
|
# Subtest: should return a default object when event is null or undefined
|
|
ok 1 - should return a default object when event is null or undefined
|
|
---
|
|
duration_ms: 1.948104
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return a default object when event is not an object
|
|
ok 2 - should return a default object when event is not an object
|
|
---
|
|
duration_ms: 0.282076
|
|
type: 'test'
|
|
...
|
|
# Subtest: should summarize a valid event correctly
|
|
ok 3 - should summarize a valid event correctly
|
|
---
|
|
duration_ms: 0.334668
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite created_at
|
|
ok 4 - should handle non-finite created_at
|
|
---
|
|
duration_ms: 0.243129
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite kind
|
|
ok 5 - should handle non-finite kind
|
|
---
|
|
duration_ms: 0.1786
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid content
|
|
ok 6 - should handle missing or invalid content
|
|
---
|
|
duration_ms: 0.188863
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid tags
|
|
ok 7 - should handle missing or invalid tags
|
|
---
|
|
duration_ms: 0.379612
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - summarizeDmEventForLog
|
|
---
|
|
duration_ms: 4.857316
|
|
type: 'suite'
|
|
...
|
|
# Subtest: sanitizeDecryptError
|
|
# Subtest: should return null when error is null or undefined
|
|
ok 1 - should return null when error is null or undefined
|
|
---
|
|
duration_ms: 0.486973
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle string errors
|
|
ok 2 - should handle string errors
|
|
---
|
|
duration_ms: 0.339124
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with standard properties
|
|
ok 3 - should handle Error objects with standard properties
|
|
---
|
|
duration_ms: 0.393348
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with missing properties
|
|
ok 4 - should handle Error objects with missing properties
|
|
---
|
|
duration_ms: 0.164596
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with non-string properties
|
|
ok 5 - should handle Error objects with non-string properties
|
|
---
|
|
duration_ms: 0.250951
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - sanitizeDecryptError
|
|
---
|
|
duration_ms: 2.141152
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - dmDecryptDiagnostics
|
|
---
|
|
duration_ms: 7.886224
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.396599
|
|
|
|
→ Running tests/nostr/dmDecryptorPreference.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM prefers nip44 decryptors when available
|
|
ok 1 - decryptDM prefers nip44 decryptors when available
|
|
---
|
|
duration_ms: 3.099381
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM falls back to nip04 when nip44 fails
|
|
ok 2 - decryptDM falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.586273
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.721171
|
|
|
|
→ Running tests/nostr/dmDecryptWorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptWorkerClient
|
|
# Subtest: should support worker environment
|
|
ok 1 - should support worker environment
|
|
---
|
|
duration_ms: 5.783105
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker is unavailable
|
|
ok 2 - should reject if Worker is unavailable
|
|
---
|
|
duration_ms: 3.061965
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if inputs are invalid
|
|
ok 3 - should reject if inputs are invalid
|
|
---
|
|
duration_ms: 3.097273
|
|
type: 'test'
|
|
...
|
|
# Subtest: should successfully decrypt message
|
|
ok 4 - should successfully decrypt message
|
|
---
|
|
duration_ms: 9.240999
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error response
|
|
ok 5 - should handle worker error response
|
|
---
|
|
duration_ms: 3.607098
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error event
|
|
ok 6 - should handle worker error event
|
|
---
|
|
duration_ms: 4.585259
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 7 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 102.979056
|
|
type: 'test'
|
|
...
|
|
# Subtest: should initialize worker lazily and reuse instance
|
|
ok 8 - should initialize worker lazily and reuse instance
|
|
---
|
|
duration_ms: 3.15668
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recreate worker if creation fails
|
|
ok 9 - should recreate worker if creation fails
|
|
---
|
|
duration_ms: 1.708058
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - dmDecryptWorkerClient
|
|
---
|
|
duration_ms: 142.005703
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 150.311912
|
|
|
|
→ Running tests/nostr/dmSignalEvents.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmSignalEvents
|
|
# Subtest: publishDmReadReceipt should succeed
|
|
ok 1 - publishDmReadReceipt should succeed
|
|
---
|
|
duration_ms: 7.256901
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmReadReceipt should fail if session actor
|
|
ok 2 - publishDmReadReceipt should fail if session actor
|
|
---
|
|
duration_ms: 0.8686
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmTypingIndicator should succeed
|
|
ok 3 - publishDmTypingIndicator should succeed
|
|
---
|
|
duration_ms: 7.722679
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail if no signer
|
|
ok 4 - should fail if no signer
|
|
---
|
|
duration_ms: 1.363464
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - dmSignalEvents
|
|
---
|
|
duration_ms: 144.341442
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 170.469313
|
|
|
|
→ Running tests/nostr/edit-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: editVideo preserves existing d tag
|
|
ok 1 - editVideo preserves existing d tag
|
|
---
|
|
duration_ms: 12.357376
|
|
type: 'test'
|
|
...
|
|
# Subtest: editVideo falls back to base event id when d tag missing
|
|
ok 2 - editVideo falls back to base event id when d tag missing
|
|
---
|
|
duration_ms: 2.49405
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.660124
|
|
|
|
→ Running tests/nostr/eventsCacheStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsCacheStore
|
|
# Subtest: persistSnapshot should store events and tombstones
|
|
ok 1 - persistSnapshot should store events and tombstones
|
|
---
|
|
duration_ms: 18.012668
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should only update changed items
|
|
ok 2 - persistSnapshot should only update changed items
|
|
---
|
|
duration_ms: 4.677829
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should delete removed items
|
|
ok 3 - persistSnapshot should delete removed items
|
|
---
|
|
duration_ms: 3.699565
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should respect dirty keys optimization
|
|
ok 4 - persistSnapshot should respect dirty keys optimization
|
|
---
|
|
duration_ms: 2.970426
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - EventsCacheStore
|
|
---
|
|
duration_ms: 31.449827
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 40.540387
|
|
|
|
→ Running tests/nostr/eventsMap.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsMap functionality
|
|
# Subtest: indexes events by author on set
|
|
ok 1 - indexes events by author on set
|
|
---
|
|
duration_ms: 1.291265
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on delete
|
|
ok 2 - updates index on delete
|
|
---
|
|
duration_ms: 1.820111
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on overwrite with different object
|
|
ok 3 - updates index on overwrite with different object
|
|
---
|
|
duration_ms: 0.309655
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears index on clear
|
|
ok 4 - clears index on clear
|
|
---
|
|
duration_ms: 0.385109
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes pubkeys
|
|
ok 5 - normalizes pubkeys
|
|
---
|
|
duration_ms: 0.434073
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-event objects gracefully
|
|
ok 6 - handles non-event objects gracefully
|
|
---
|
|
duration_ms: 0.301024
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - EventsMap functionality
|
|
---
|
|
duration_ms: 7.303606
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.757009
|
|
|
|
→ Running tests/nostr/integration-remote-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: nostr login + remote signing + publish + watch history integration
|
|
ok 1 - nostr login + remote signing + publish + watch history integration
|
|
---
|
|
duration_ms: 150.507002
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 607.66987
|
|
|
|
→ Running tests/nostr/maxListenerDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: maxListenerDiagnostics
|
|
# Subtest: collectCandidateStrings
|
|
# Subtest: should return empty array for null/undefined/falsy
|
|
ok 1 - should return empty array for null/undefined/falsy
|
|
---
|
|
duration_ms: 1.939947
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return array with string for string input
|
|
ok 2 - should return array with string for string input
|
|
---
|
|
duration_ms: 0.627531
|
|
type: 'test'
|
|
...
|
|
# Subtest: should extract relevant fields from object
|
|
ok 3 - should extract relevant fields from object
|
|
---
|
|
duration_ms: 0.563849
|
|
type: 'test'
|
|
...
|
|
# Subtest: should ignore non-string fields in object
|
|
ok 4 - should ignore non-string fields in object
|
|
---
|
|
duration_ms: 0.784304
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - collectCandidateStrings
|
|
---
|
|
duration_ms: 5.084167
|
|
type: 'suite'
|
|
...
|
|
# Subtest: shouldSuppressWarning
|
|
# Subtest: should NOT suppress anything if verbose mode is enabled
|
|
ok 1 - should NOT suppress anything if verbose mode is enabled
|
|
---
|
|
duration_ms: 0.710331
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by code string
|
|
ok 2 - should suppress warning by code string
|
|
---
|
|
duration_ms: 0.269376
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object code property
|
|
ok 3 - should suppress warning by object code property
|
|
---
|
|
duration_ms: 0.390631
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by message snippet
|
|
ok 4 - should suppress warning by message snippet
|
|
---
|
|
duration_ms: 0.383969
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object message property snippet
|
|
ok 5 - should suppress warning by object message property snippet
|
|
---
|
|
duration_ms: 0.432055
|
|
type: 'test'
|
|
...
|
|
# Subtest: should NOT suppress unrelated warnings
|
|
ok 6 - should NOT suppress unrelated warnings
|
|
---
|
|
duration_ms: 0.474621
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle multiple arguments
|
|
ok 7 - should handle multiple arguments
|
|
---
|
|
duration_ms: 0.604215
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - shouldSuppressWarning
|
|
---
|
|
duration_ms: 3.98623
|
|
type: 'suite'
|
|
...
|
|
# Subtest: process.emitWarning patch
|
|
# Subtest: should have patched process.emitWarning
|
|
ok 1 - should have patched process.emitWarning
|
|
---
|
|
duration_ms: 0.248481
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - process.emitWarning patch
|
|
---
|
|
duration_ms: 0.38932
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - maxListenerDiagnostics
|
|
---
|
|
duration_ms: 11.443125
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 4
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.986183
|
|
|
|
→ Running tests/nostr/nip04WorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: nip04WorkerClient
|
|
# Subtest: should encrypt message successfully via worker
|
|
ok 1 - should encrypt message successfully via worker
|
|
---
|
|
duration_ms: 9.410784
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker returns error
|
|
ok 2 - should reject when worker returns error
|
|
---
|
|
duration_ms: 4.915839
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker emits error event
|
|
ok 3 - should reject when worker emits error event
|
|
---
|
|
duration_ms: 3.294676
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 4 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 103.00255
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject immediately if inputs are missing
|
|
ok 5 - should reject immediately if inputs are missing
|
|
---
|
|
duration_ms: 3.069181
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker API is unavailable
|
|
ok 6 - should reject if Worker API is unavailable
|
|
---
|
|
duration_ms: 2.425834
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker creation failure
|
|
ok 7 - should handle worker creation failure
|
|
---
|
|
duration_ms: 2.207005
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - nip04WorkerClient
|
|
---
|
|
duration_ms: 131.480392
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 144.780236
|
|
|
|
→ Running tests/nostr/nip07Adapter-race-condition.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip07Adapter Race Condition
|
|
# Subtest: should detect capabilities dynamically even if injected late
|
|
ok 1 - should detect capabilities dynamically even if injected late
|
|
---
|
|
duration_ms: 2.789104
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call the injected method even if added late
|
|
ok 2 - should call the injected method even if added late
|
|
---
|
|
duration_ms: 2.167201
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Nip07Adapter Race Condition
|
|
---
|
|
duration_ms: 6.423759
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.988086
|
|
|
|
→ Running tests/nostr/nip07Permissions.test.js
|
|
TAP version 13
|
|
# Subtest: writeStoredNip07Permissions normalizes and persists granted methods
|
|
ok 1 - writeStoredNip07Permissions normalizes and persists granted methods
|
|
---
|
|
duration_ms: 2.421612
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredNip07Permissions removes persisted grants
|
|
ok 2 - clearStoredNip07Permissions removes persisted grants
|
|
---
|
|
duration_ms: 0.360566
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions retries explicit and fallback variants
|
|
ok 3 - requestEnablePermissions retries explicit and fallback variants
|
|
---
|
|
duration_ms: 1.790851
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions reports unavailable extension
|
|
ok 4 - requestEnablePermissions reports unavailable extension
|
|
---
|
|
duration_ms: 0.235188
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension is present
|
|
ok 5 - waitForNip07Extension resolves when extension is present
|
|
---
|
|
duration_ms: 0.448974
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension appears later
|
|
ok 6 - waitForNip07Extension resolves when extension appears later
|
|
---
|
|
duration_ms: 51.301534
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension rejects when extension never appears
|
|
ok 7 - waitForNip07Extension rejects when extension never appears
|
|
---
|
|
duration_ms: 101.273335
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 165.855355
|
|
|
|
→ Running tests/nostr/nip46Client.test.js
|
|
TAP version 13
|
|
# Subtest: Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
ok 1 - Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
---
|
|
duration_ms: 168.265899
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
---
|
|
duration_ms: 24.113666
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
ok 3 - decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
---
|
|
duration_ms: 25.156522
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
ok 4 - decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
---
|
|
duration_ms: 24.085686
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
ok 5 - decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
---
|
|
duration_ms: 33.919812
|
|
type: 'test'
|
|
...
|
|
# Subtest: parseNip46ConnectionString handles remote signer key hints
|
|
ok 6 - parseNip46ConnectionString handles remote signer key hints
|
|
---
|
|
duration_ms: 5.747944
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
ok 7 - attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
---
|
|
duration_ms: 44.917662
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
ok 8 - attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
---
|
|
duration_ms: 30.33007
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RpcClient sendRpc publishes events and resolves responses
|
|
ok 9 - Nip46RpcClient sendRpc publishes events and resolves responses
|
|
---
|
|
duration_ms: 15.257499
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 382.814587
|
|
|
|
→ Running tests/nostr/nip46Connector.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46Connector
|
|
# Subtest: createKeyPair
|
|
# Subtest: should generate a new key pair if none provided
|
|
ok 1 - should generate a new key pair if none provided
|
|
---
|
|
duration_ms: 3.086487
|
|
type: 'test'
|
|
...
|
|
# Subtest: should use existing keys if provided
|
|
ok 2 - should use existing keys if provided
|
|
---
|
|
duration_ms: 0.514087
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - createKeyPair
|
|
---
|
|
duration_ms: 4.756756
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareHandshake
|
|
# Subtest: should parse connection string and return details
|
|
ok 1 - should parse connection string and return details
|
|
---
|
|
duration_ms: 1.307747
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - prepareHandshake
|
|
---
|
|
duration_ms: 1.800835
|
|
type: 'suite'
|
|
...
|
|
# Subtest: connect
|
|
# Subtest: should connect directly if remote pubkey is known
|
|
ok 1 - should connect directly if remote pubkey is known
|
|
---
|
|
duration_ms: 2.024766
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - connect
|
|
---
|
|
duration_ms: 2.361156
|
|
type: 'suite'
|
|
...
|
|
# Subtest: reconnectStored
|
|
# Subtest: should throw if no stored session
|
|
ok 1 - should throw if no stored session
|
|
---
|
|
duration_ms: 1.508382
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reconnect using stored session
|
|
ok 2 - should reconnect using stored session
|
|
---
|
|
duration_ms: 0.776291
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - reconnectStored
|
|
---
|
|
duration_ms: 2.669336
|
|
type: 'suite'
|
|
...
|
|
# Subtest: disconnect
|
|
# Subtest: should clear stored session and emit change
|
|
ok 1 - should clear stored session and emit change
|
|
---
|
|
duration_ms: 0.490442
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - disconnect
|
|
---
|
|
duration_ms: 0.701195
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - Nip46Connector
|
|
---
|
|
duration_ms: 13.36098
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 6
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.917065
|
|
|
|
→ Running tests/nostr/nip71.test.js
|
|
TAP version 13
|
|
# Subtest: buildNip71MetadataTags normalizes structured fields
|
|
ok 1 - buildNip71MetadataTags normalizes structured fields
|
|
---
|
|
duration_ms: 3.566596
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectNip71PointerRequests aggregates events and tags
|
|
ok 2 - collectNip71PointerRequests aggregates events and tags
|
|
---
|
|
duration_ms: 0.535146
|
|
type: 'test'
|
|
...
|
|
# Subtest: processNip71Events reconciles pointers and filters video hashtags
|
|
ok 3 - processNip71Events reconciles pointers and filters video hashtags
|
|
---
|
|
duration_ms: 1.380906
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateNip71MetadataForVideos fetches missing records once
|
|
ok 4 - populateNip71MetadataForVideos fetches missing records once
|
|
---
|
|
duration_ms: 0.939249
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent composes pointer tags
|
|
ok 5 - buildNip71VideoEvent composes pointer tags
|
|
---
|
|
duration_ms: 0.872215
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.533932
|
|
|
|
→ Running tests/nostr/nostrClientFacade.test.js
|
|
TAP version 13
|
|
# Subtest: nostrClientFacade forwards the default client instance
|
|
ok 1 - nostrClientFacade forwards the default client instance
|
|
---
|
|
duration_ms: 1.413029
|
|
type: 'test'
|
|
...
|
|
# Subtest: nostrClientFacade forwards the default permission helper
|
|
ok 2 - nostrClientFacade forwards the default permission helper
|
|
---
|
|
duration_ms: 0.231988
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.153736
|
|
|
|
→ Running tests/nostr/nostrClientRegistry.test.mjs
|
|
TAP version 13
|
|
# Subtest: registerSigner stores and resolves signer entries
|
|
ok 1 - registerSigner stores and resolves signer entries
|
|
---
|
|
duration_ms: 1.43157
|
|
type: 'test'
|
|
...
|
|
# Subtest: setActiveSigner notifies listeners and resolves by pubkey
|
|
ok 2 - setActiveSigner notifies listeners and resolves by pubkey
|
|
---
|
|
duration_ms: 1.703036
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.698025
|
|
|
|
→ Running tests/nostr/publishHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: mirrorVideoEvent lowercases provided MIME types
|
|
ok 1 - mirrorVideoEvent lowercases provided MIME types
|
|
---
|
|
duration_ms: 4.624915
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent lowercases inferred MIME types
|
|
ok 2 - mirrorVideoEvent lowercases inferred MIME types
|
|
---
|
|
duration_ms: 0.840296
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent includes hash tags when provided
|
|
ok 3 - mirrorVideoEvent includes hash tags when provided
|
|
---
|
|
duration_ms: 1.652832
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.382085
|
|
|
|
→ Running tests/nostr/reaction-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
ok 1 - publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
---
|
|
duration_ms: 5.885379
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
ok 2 - publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
---
|
|
duration_ms: 0.550441
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.227882
|
|
|
|
→ Running tests/nostr/revert-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: revertVideo preserves existing d tag
|
|
ok 1 - revertVideo preserves existing d tag
|
|
---
|
|
duration_ms: 7.21475
|
|
type: 'test'
|
|
...
|
|
# Subtest: revertVideo falls back to original event id when d tag missing
|
|
ok 2 - revertVideo falls back to original event id when d tag missing
|
|
---
|
|
duration_ms: 1.358836
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.972671
|
|
|
|
→ Running tests/nostr/session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: SessionActor
|
|
# Subtest: encrypts and decrypts private key
|
|
ok 1 - encrypts and decrypts private key
|
|
---
|
|
duration_ms: 353.284891
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails to decrypt with wrong passphrase
|
|
ok 2 - fails to decrypt with wrong passphrase
|
|
---
|
|
duration_ms: 357.310917
|
|
type: 'test'
|
|
...
|
|
# Subtest: persists and reads session actor
|
|
ok 3 - persists and reads session actor
|
|
---
|
|
duration_ms: 1.512338
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears stored session actor
|
|
ok 4 - clears stored session actor
|
|
---
|
|
duration_ms: 0.348897
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - SessionActor
|
|
---
|
|
duration_ms: 714.646586
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 728.315241
|
|
|
|
→ Running tests/nostr/sessionActor.test.js
|
|
TAP version 13
|
|
# Subtest: encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
ok 1 - encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 330.052767
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor stores encrypted payload metadata
|
|
ok 2 - persistSessionActor stores encrypted payload metadata
|
|
---
|
|
duration_ms: 195.798508
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes persisted payload
|
|
ok 3 - clearStoredSessionActor removes persisted payload
|
|
---
|
|
duration_ms: 176.545105
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 711.040897
|
|
|
|
→ Running tests/nostr/sessionActor.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/nostr/sessionActor.js
|
|
# Subtest: Encryption and Decryption Roundtrip
|
|
ok 1 - Encryption and Decryption Roundtrip
|
|
---
|
|
duration_ms: 348.853525
|
|
type: 'test'
|
|
...
|
|
# Subtest: Decryption fails with wrong passphrase
|
|
ok 2 - Decryption fails with wrong passphrase
|
|
---
|
|
duration_ms: 340.306483
|
|
type: 'test'
|
|
...
|
|
# Subtest: Persistence and Retrieval
|
|
ok 3 - Persistence and Retrieval
|
|
---
|
|
duration_ms: 316.1516
|
|
type: 'test'
|
|
...
|
|
# Subtest: Clear Stored Session Actor
|
|
ok 4 - Clear Stored Session Actor
|
|
---
|
|
duration_ms: 0.956158
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - js/nostr/sessionActor.js
|
|
---
|
|
duration_ms: 1009.344152
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1017.504914
|
|
|
|
→ Running tests/nostr/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent: processes requests sequentially
|
|
ok 1 - queueSignEvent: processes requests sequentially
|
|
---
|
|
duration_ms: 104.349086
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles timeouts
|
|
ok 2 - queueSignEvent: handles timeouts
|
|
---
|
|
duration_ms: 21.955902
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles permission denied errors
|
|
ok 3 - queueSignEvent: handles permission denied errors
|
|
---
|
|
duration_ms: 0.642837
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles signer disconnected
|
|
ok 4 - queueSignEvent: handles signer disconnected
|
|
---
|
|
duration_ms: 0.454048
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: fails if signer is missing or invalid
|
|
ok 5 - queueSignEvent: fails if signer is missing or invalid
|
|
---
|
|
duration_ms: 0.549566
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: continues queue processing after failure
|
|
ok 6 - queueSignEvent: continues queue processing after failure
|
|
---
|
|
duration_ms: 0.830946
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 212.308372
|
|
|
|
→ Running tests/nostr/signers.test.mjs
|
|
TAP version 13
|
|
# Subtest: setActiveSigner hydrates extension capabilities from window.nostr
|
|
ok 1 - setActiveSigner hydrates extension capabilities from window.nostr
|
|
---
|
|
duration_ms: 1.828328
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.908271
|
|
|
|
→ Running tests/nostr/syncMetadataStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: SyncMetadataStore
|
|
# Subtest: should load from localStorage on initialization
|
|
ok 1 - should load from localStorage on initialization
|
|
---
|
|
duration_ms: 1.880071
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update last seen and save to localStorage
|
|
ok 2 - should update last seen and save to localStorage
|
|
---
|
|
duration_ms: 0.829541
|
|
type: 'test'
|
|
...
|
|
# Subtest: should only update if timestamp is newer
|
|
ok 3 - should only update if timestamp is newer
|
|
---
|
|
duration_ms: 0.833475
|
|
type: 'test'
|
|
...
|
|
# Subtest: should get per-relay last seen
|
|
ok 4 - should get per-relay last seen
|
|
---
|
|
duration_ms: 1.841701
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing localStorage gracefully
|
|
ok 5 - should handle missing localStorage gracefully
|
|
---
|
|
duration_ms: 0.311341
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - SyncMetadataStore
|
|
---
|
|
duration_ms: 7.716203
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.56184
|
|
|
|
→ Running tests/nostr/toolkit.test.mjs
|
|
TAP version 13
|
|
# Subtest: toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
ok 1 - toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
---
|
|
duration_ms: 1.604348
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
ok 2 - toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
---
|
|
duration_ms: 0.681794
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
ok 3 - toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
---
|
|
duration_ms: 1.006679
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
ok 4 - toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
---
|
|
duration_ms: 0.317808
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: normalizeToolkitCandidate validation
|
|
ok 5 - toolkit: normalizeToolkitCandidate validation
|
|
---
|
|
duration_ms: 1.050445
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
ok 6 - toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
---
|
|
duration_ms: 10.894849
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.891298
|
|
|
|
→ Running tests/nostr/videoEventBuffer.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoEventBuffer
|
|
# Subtest: Push and Flush
|
|
ok 1 - Push and Flush
|
|
---
|
|
duration_ms: 3.613073
|
|
type: 'test'
|
|
...
|
|
# Subtest: Latest Wins
|
|
ok 2 - Latest Wins
|
|
---
|
|
duration_ms: 0.896737
|
|
type: 'test'
|
|
...
|
|
# Subtest: Tombstone Handling
|
|
ok 3 - Tombstone Handling
|
|
---
|
|
duration_ms: 0.839152
|
|
type: 'test'
|
|
...
|
|
# Subtest: Cleanup
|
|
ok 4 - Cleanup
|
|
---
|
|
duration_ms: 0.877577
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - VideoEventBuffer
|
|
---
|
|
duration_ms: 8.229463
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.997789
|
|
|
|
→ Running tests/nostr/videoPayloadBuilder.test.mjs
|
|
TAP version 13
|
|
# Subtest: videoPayloadBuilder
|
|
# Subtest: extractVideoPublishPayload
|
|
# Subtest: extracts videoData and nip71Metadata
|
|
ok 1 - extracts videoData and nip71Metadata
|
|
---
|
|
duration_ms: 2.93398
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles legacyFormData structure
|
|
ok 2 - handles legacyFormData structure
|
|
---
|
|
duration_ms: 0.444727
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags
|
|
ok 3 - normalizes boolean flags
|
|
---
|
|
duration_ms: 0.390682
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags (kids only)
|
|
ok 4 - normalizes boolean flags (kids only)
|
|
---
|
|
duration_ms: 0.227426
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - extractVideoPublishPayload
|
|
---
|
|
duration_ms: 5.626171
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload
|
|
# Subtest: throws if pubkey is missing
|
|
ok 1 - throws if pubkey is missing
|
|
---
|
|
duration_ms: 1.666597
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates a valid event structure
|
|
ok 2 - generates a valid event structure
|
|
---
|
|
duration_ms: 3.507095
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates unique d tag and videoRootId if not provided
|
|
ok 3 - generates unique d tag and videoRootId if not provided
|
|
---
|
|
duration_ms: 0.430208
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses provided seriesIdentifier as d tag
|
|
ok 4 - uses provided seriesIdentifier as d tag
|
|
---
|
|
duration_ms: 0.71197
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolves infoHash from magnet
|
|
ok 5 - resolves infoHash from magnet
|
|
---
|
|
duration_ms: 0.91856
|
|
type: 'test'
|
|
...
|
|
# Subtest: includes NIP-71 tags
|
|
ok 6 - includes NIP-71 tags
|
|
---
|
|
duration_ms: 1.402063
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - prepareVideoPublishPayload
|
|
---
|
|
duration_ms: 9.444026
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - videoPayloadBuilder
|
|
---
|
|
duration_ms: 16.323195
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 3
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 39.573059
|
|
|
|
→ Running tests/nostr/watchHistory.test.js
|
|
[bitvid] [ProfileCache] Expired watchHistory for 2222222222222222222222222222222222222222222222222222222222222222
|
|
TAP version 13
|
|
# Subtest: buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
ok 1 - buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
---
|
|
duration_ms: 3.250206
|
|
type: 'test'
|
|
...
|
|
# Subtest: getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
ok 2 - getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
---
|
|
duration_ms: 2.719822
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
ok 3 - fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
---
|
|
duration_ms: 9.970362
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
ok 4 - fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
---
|
|
duration_ms: 2.466439
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
ok 5 - publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
---
|
|
duration_ms: 4.854729
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot caches successful snapshot results
|
|
ok 6 - publishWatchHistorySnapshot caches successful snapshot results
|
|
---
|
|
duration_ms: 4.425016
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 35.607533
|
|
|
|
→ Running tests/nostr/watchHistoryBindings.test.js
|
|
TAP version 13
|
|
# Subtest: updateWatchHistoryList delegates to the client's manager
|
|
ok 1 - updateWatchHistoryList delegates to the client's manager
|
|
---
|
|
duration_ms: 2.372129
|
|
type: 'test'
|
|
...
|
|
# Subtest: removeWatchHistoryItem delegates to the client's manager
|
|
ok 2 - removeWatchHistoryItem delegates to the client's manager
|
|
---
|
|
duration_ms: 0.545114
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when the manager is unavailable
|
|
ok 3 - watch history bindings throw when the manager is unavailable
|
|
---
|
|
duration_ms: 0.798514
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when a required method is missing
|
|
ok 4 - watch history bindings throw when a required method is missing
|
|
---
|
|
duration_ms: 0.362262
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.430249
|
|
|
|
→ Running tests/nwc-settings-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: nwc settings service preserves settings across profile switches
|
|
ok 1 - nwc settings service preserves settings across profile switches
|
|
---
|
|
duration_ms: 2.104176
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateActiveNwcSettings returns cloned values
|
|
ok 2 - updateActiveNwcSettings returns cloned values
|
|
---
|
|
duration_ms: 0.535449
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.149216
|
|
|
|
→ Running tests/performance/resolvePostedAt.test.mjs
|
|
pool.list calls: 2
|
|
pool.get calls: 0
|
|
TAP version 13
|
|
# Subtest: hydrateVideoHistoryBatch optimizes network calls
|
|
ok 1 - hydrateVideoHistoryBatch optimizes network calls
|
|
---
|
|
duration_ms: 5.479365
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPostedAtBatch uses batch hydration
|
|
ok 2 - resolveVideoPostedAtBatch uses batch hydration
|
|
---
|
|
duration_ms: 0.815932
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.404849
|
|
|
|
→ Running tests/position-floating-panel.test.mjs
|
|
TAP version 13
|
|
# Subtest: flips placement when bottom placement would collide with viewport
|
|
ok 1 - flips placement when bottom placement would collide with viewport
|
|
---
|
|
duration_ms: 380.58407
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes previously open popovers without restoring focus
|
|
ok 2 - closes previously open popovers without restoring focus
|
|
---
|
|
duration_ms: 76.209191
|
|
type: 'test'
|
|
...
|
|
# Subtest: restores focus to the trigger when closed
|
|
ok 3 - restores focus to the trigger when closed
|
|
---
|
|
duration_ms: 34.619634
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 499.701617
|
|
|
|
→ Running tests/profile-cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: ProfileCache: setActiveProfile and getActiveProfile
|
|
ok 1 - ProfileCache: setActiveProfile and getActiveProfile
|
|
---
|
|
duration_ms: 2.847722
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolveAddressKey
|
|
ok 2 - ProfileCache: resolveAddressKey
|
|
---
|
|
duration_ms: 0.712534
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: set and get (memory and persistence)
|
|
ok 3 - ProfileCache: set and get (memory and persistence)
|
|
---
|
|
duration_ms: 23.609485
|
|
type: 'test'
|
|
...
|
|
[bitvid] [ProfileCache] Expired watchHistory for eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
|
|
# Subtest: ProfileCache: setProfile normalization and storage
|
|
ok 4 - ProfileCache: setProfile normalization and storage
|
|
---
|
|
duration_ms: 21.942781
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: TTL expiration
|
|
ok 5 - ProfileCache: TTL expiration
|
|
---
|
|
duration_ms: 1.975842
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
ok 6 - ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
---
|
|
duration_ms: 0.683251
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: listeners
|
|
ok 7 - ProfileCache: listeners
|
|
---
|
|
duration_ms: 0.423336
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 63.3323
|
|
|
|
→ Running tests/profile-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: Profile modal Escape closes and restores trigger focus
|
|
ok 1 - Profile modal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 1492.27107
|
|
type: 'test'
|
|
...
|
|
# Subtest: Add profile request suspends focus trap and elevates login modal
|
|
ok 2 - Add profile request suspends focus trap and elevates login modal
|
|
---
|
|
duration_ms: 1367.315166
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal navigation buttons toggle active state
|
|
ok 3 - Profile modal navigation buttons toggle active state
|
|
---
|
|
duration_ms: 1499.080754
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal toggles mobile menu and pane views
|
|
ok 4 - Profile modal toggles mobile menu and pane views
|
|
---
|
|
duration_ms: 1918.676139
|
|
type: 'test'
|
|
...
|
|
# Subtest: wallet URI input masks persisted values and restores on focus
|
|
ok 5 - wallet URI input masks persisted values and restores on focus
|
|
---
|
|
duration_ms: 1115.041425
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal uses abbreviated npub display
|
|
ok 6 - Profile modal uses abbreviated npub display
|
|
---
|
|
duration_ms: 854.522968
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSavedProfiles applies provider metadata
|
|
ok 7 - renderSavedProfiles applies provider metadata
|
|
---
|
|
duration_ms: 844.633222
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane shows empty states by default
|
|
ok 8 - Hashtag pane shows empty states by default
|
|
---
|
|
duration_ms: 1004.584803
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane adds, moves, and removes tags
|
|
ok 9 - Hashtag pane adds, moves, and removes tags
|
|
---
|
|
duration_ms: 966.440636
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddHashtagPreference publishes updates
|
|
ok 10 - handleAddHashtagPreference publishes updates
|
|
---
|
|
duration_ms: 1012.419307
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane resets after logout when service clears tags
|
|
ok 11 - Hashtag pane resets after logout when service clears tags
|
|
---
|
|
duration_ms: 1287.620424
|
|
type: 'test'
|
|
...
|
|
# Subtest: load() injects markup and caches expected elements
|
|
ok 12 - load() injects markup and caches expected elements
|
|
---
|
|
duration_ms: 556.064277
|
|
type: 'test'
|
|
...
|
|
# Subtest: show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
ok 13 - show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
---
|
|
duration_ms: 1038.729078
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateProfileRelays renders entries and wires action buttons
|
|
ok 14 - populateProfileRelays renders entries and wires action buttons
|
|
---
|
|
duration_ms: 588.719851
|
|
type: 'test'
|
|
...
|
|
# Subtest: admin mutations invoke accessControl stubs and update admin DOM
|
|
ok 15 - admin mutations invoke accessControl stubs and update admin DOM
|
|
---
|
|
duration_ms: 594.143909
|
|
type: 'test'
|
|
...
|
|
# Subtest: history pane lazily initializes the watch history renderer
|
|
ok 16 - history pane lazily initializes the watch history renderer
|
|
---
|
|
duration_ms: 1523.653267
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning throttles status updates
|
|
ok 17 - handleDirectMessagesRelayWarning throttles status updates
|
|
---
|
|
duration_ms: 559.618764
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
ok 18 - handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
---
|
|
duration_ms: 580.509871
|
|
type: 'test'
|
|
...
|
|
1..18
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18897.525972
|
|
|
|
→ Running tests/reaction-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildReactionEvent includes pointer and author tags when pubkey provided
|
|
ok 1 - buildReactionEvent includes pointer and author tags when pubkey provided
|
|
---
|
|
duration_ms: 3.370107
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildReactionEvent merges address and event pointers for addressable targets
|
|
ok 2 - buildReactionEvent merges address and event pointers for addressable targets
|
|
---
|
|
duration_ms: 0.847312
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.635412
|
|
|
|
→ Running tests/revert-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: RevertModalController
|
|
# Subtest: open() fetches history and opens modal
|
|
ok 1 - open() fetches history and opens modal
|
|
---
|
|
duration_ms: 1.599866
|
|
type: 'test'
|
|
...
|
|
# Subtest: open() shows error if not logged in
|
|
ok 2 - open() shows error if not logged in
|
|
---
|
|
duration_ms: 0.397592
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleConfirm() calls revertVideo and refreshes
|
|
ok 3 - handleConfirm() calls revertVideo and refreshes
|
|
---
|
|
duration_ms: 0.521767
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - RevertModalController
|
|
---
|
|
duration_ms: 4.176146
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.281262
|
|
|
|
→ Running tests/safe-decode.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeURIComponent returns original value on malformed sequences
|
|
ok 1 - safeDecodeURIComponent returns original value on malformed sequences
|
|
---
|
|
duration_ms: 1.210582
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecode helpers handle double-encoded values when applied repeatedly
|
|
ok 2 - safeDecode helpers handle double-encoded values when applied repeatedly
|
|
---
|
|
duration_ms: 0.261961
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose trims inputs by default
|
|
ok 3 - safeDecodeURIComponentLoose trims inputs by default
|
|
---
|
|
duration_ms: 0.196943
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
ok 4 - safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
---
|
|
duration_ms: 0.157641
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponent handles empty strings consistently
|
|
ok 5 - safeDecodeURIComponent handles empty strings consistently
|
|
---
|
|
duration_ms: 0.307171
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.546208
|
|
|
|
→ Running tests/services/attachmentService.test.mjs
|
|
TAP version 13
|
|
# Subtest: attachmentService
|
|
# Subtest: prepareAttachmentUpload
|
|
# Subtest: should prepare upload without encryption
|
|
ok 1 - should prepare upload without encryption
|
|
---
|
|
duration_ms: 3.042056
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prepare upload with encryption
|
|
ok 2 - should prepare upload with encryption
|
|
---
|
|
duration_ms: 10.057764
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - prepareAttachmentUpload
|
|
---
|
|
duration_ms: 14.153682
|
|
type: 'suite'
|
|
...
|
|
# Subtest: downloadAttachment
|
|
# Subtest: should download attachment
|
|
ok 1 - should download attachment
|
|
---
|
|
duration_ms: 1.762804
|
|
type: 'test'
|
|
...
|
|
# Subtest: should verify hash
|
|
ok 2 - should verify hash
|
|
---
|
|
duration_ms: 1.101169
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on hash mismatch
|
|
ok 3 - should throw on hash mismatch
|
|
---
|
|
duration_ms: 1.347072
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - downloadAttachment
|
|
---
|
|
duration_ms: 4.58588
|
|
type: 'suite'
|
|
...
|
|
# Subtest: caching
|
|
# Subtest: should cache downloaded attachments
|
|
ok 1 - should cache downloaded attachments
|
|
---
|
|
duration_ms: 1.001719
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 2 - should clear cache
|
|
---
|
|
duration_ms: 1.686532
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - caching
|
|
---
|
|
duration_ms: 3.203495
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - attachmentService
|
|
---
|
|
duration_ms: 23.650184
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 4
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 38.957049
|
|
|
|
→ Running tests/services/authUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: authUtils
|
|
# Subtest: normalizeProviderId
|
|
# Subtest: returns trimmed string if valid
|
|
ok 1 - returns trimmed string if valid
|
|
---
|
|
duration_ms: 2.572603
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if empty
|
|
ok 2 - returns 'nip07' fallback if empty
|
|
---
|
|
duration_ms: 0.185091
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if null
|
|
ok 3 - returns 'nip07' fallback if null
|
|
---
|
|
duration_ms: 0.276112
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if undefined
|
|
ok 4 - returns 'nip07' fallback if undefined
|
|
---
|
|
duration_ms: 0.241765
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if not a string
|
|
ok 5 - returns 'nip07' fallback if not a string
|
|
---
|
|
duration_ms: 0.220914
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - normalizeProviderId
|
|
---
|
|
duration_ms: 4.945517
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAuthType
|
|
# Subtest: prioritizes authTypeCandidate
|
|
ok 1 - prioritizes authTypeCandidate
|
|
---
|
|
duration_ms: 0.461586
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.authType
|
|
ok 2 - falls back to providerResult.authType
|
|
---
|
|
duration_ms: 0.213569
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.providerId
|
|
ok 3 - falls back to providerResult.providerId
|
|
---
|
|
duration_ms: 0.387907
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerId
|
|
ok 4 - falls back to providerId
|
|
---
|
|
duration_ms: 0.222379
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' if all else fails
|
|
ok 5 - returns 'nip07' if all else fails
|
|
---
|
|
duration_ms: 0.165723
|
|
type: 'test'
|
|
...
|
|
# Subtest: trims whitespace from results
|
|
ok 6 - trims whitespace from results
|
|
---
|
|
duration_ms: 0.13526
|
|
type: 'test'
|
|
...
|
|
# Subtest: ignores empty strings in candidates
|
|
ok 7 - ignores empty strings in candidates
|
|
---
|
|
duration_ms: 0.110382
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - normalizeAuthType
|
|
---
|
|
duration_ms: 2.989119
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - authUtils
|
|
---
|
|
duration_ms: 8.919624
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.133433
|
|
|
|
→ Running tests/services/discussionCountService.test.mjs
|
|
TAP version 13
|
|
# Subtest: DiscussionCountService
|
|
# Subtest: initialization sets defaults
|
|
ok 1 - initialization sets defaults
|
|
---
|
|
duration_ms: 1.673759
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if videos array is empty or invalid
|
|
ok 2 - refreshCounts returns early if videos array is empty or invalid
|
|
---
|
|
duration_ms: 0.859591
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if dependencies are missing
|
|
ok 3 - refreshCounts returns early if dependencies are missing
|
|
---
|
|
duration_ms: 1.258878
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles happy path (fetches and updates DOM)
|
|
ok 4 - refreshCounts handles happy path (fetches and updates DOM)
|
|
---
|
|
duration_ms: 93.08496
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts uses cached count if available
|
|
ok 5 - refreshCounts uses cached count if available
|
|
---
|
|
duration_ms: 3.289904
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles API errors gracefully
|
|
ok 6 - refreshCounts handles API errors gracefully
|
|
---
|
|
duration_ms: 4.620398
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles partial results
|
|
ok 7 - refreshCounts handles partial results
|
|
---
|
|
duration_ms: 3.783365
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles unsupported relays (empty perRelay)
|
|
ok 8 - refreshCounts handles unsupported relays (empty perRelay)
|
|
---
|
|
duration_ms: 2.523228
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - DiscussionCountService
|
|
---
|
|
duration_ms: 212.459039
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 231.10959
|
|
|
|
→ Running tests/services/exploreDataService.optimization.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService optimization
|
|
# Subtest: toLightweightVideo extracts necessary fields
|
|
ok 1 - toLightweightVideo extracts necessary fields
|
|
---
|
|
duration_ms: 1.922976
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags works with lightweight object
|
|
ok 2 - collectVideoTags works with lightweight object
|
|
---
|
|
duration_ms: 14.616304
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildVideoAddressPointer works with lightweight object
|
|
ok 3 - buildVideoAddressPointer works with lightweight object
|
|
---
|
|
duration_ms: 0.556466
|
|
type: 'test'
|
|
...
|
|
# Subtest: toLightweightVideo handles invalid input
|
|
ok 4 - toLightweightVideo handles invalid input
|
|
---
|
|
duration_ms: 0.194932
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - exploreDataService optimization
|
|
---
|
|
duration_ms: 19.340679
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 33.269517
|
|
|
|
→ Running tests/services/exploreDataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService - buildWatchHistoryTagCounts
|
|
# Subtest: should return empty Map if watchHistoryService is missing
|
|
ok 1 - should return empty Map if watchHistoryService is missing
|
|
---
|
|
duration_ms: 1.298814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing loadLatest method gracefully
|
|
ok 2 - should handle missing loadLatest method gracefully
|
|
---
|
|
duration_ms: 0.572188
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle loadLatest failure gracefully
|
|
ok 3 - should handle loadLatest failure gracefully
|
|
---
|
|
duration_ms: 9.883258
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return counts from worker on success
|
|
ok 4 - should return counts from worker on success
|
|
---
|
|
duration_ms: 3.466531
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error gracefully
|
|
ok 5 - should handle worker error gracefully
|
|
---
|
|
duration_ms: 2.025615
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - exploreDataService - buildWatchHistoryTagCounts
|
|
---
|
|
duration_ms: 27.768129
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.615262
|
|
|
|
→ Running tests/services/link-preview-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: LinkPreviewService
|
|
# Subtest: initializes IndexedDB
|
|
ok 1 - initializes IndexedDB
|
|
---
|
|
duration_ms: 12.421089
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetches and caches preview
|
|
ok 2 - fetches and caches preview
|
|
---
|
|
duration_ms: 33.96779
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null on fetch failure
|
|
ok 3 - returns null on fetch failure
|
|
---
|
|
duration_ms: 2.892358
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects TTL
|
|
ok 4 - respects TTL
|
|
---
|
|
duration_ms: 15.216403
|
|
type: 'test'
|
|
...
|
|
# Subtest: deletePreview removes from cache
|
|
ok 5 - deletePreview removes from cache
|
|
---
|
|
duration_ms: 4.095872
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - LinkPreviewService
|
|
---
|
|
duration_ms: 72.786971
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 82.691914
|
|
|
|
→ Running tests/services/moderation-action-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationActionController: handles moderation override
|
|
ok 1 - ModerationActionController: handles moderation override
|
|
---
|
|
duration_ms: 2.613227
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: blocks user and updates state
|
|
ok 2 - ModerationActionController: blocks user and updates state
|
|
---
|
|
duration_ms: 1.124623
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: prevents blocking self
|
|
ok 3 - ModerationActionController: prevents blocking self
|
|
---
|
|
duration_ms: 0.535081
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: requires login to block
|
|
ok 4 - ModerationActionController: requires login to block
|
|
---
|
|
duration_ms: 0.43985
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: handles hide action
|
|
ok 5 - ModerationActionController: handles hide action
|
|
---
|
|
duration_ms: 0.440015
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.118683
|
|
|
|
→ Running tests/services/nostr-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrService
|
|
# Subtest: loadVideos
|
|
# Subtest: should load cached videos and start subscription
|
|
ok 1 - should load cached videos and start subscription
|
|
---
|
|
duration_ms: 3.410185
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - loadVideos
|
|
---
|
|
duration_ms: 4.463676
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideosByAuthors
|
|
# Subtest: should fetch videos from relays for specific authors
|
|
ok 1 - should fetch videos from relays for specific authors
|
|
---
|
|
duration_ms: 2.342971
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - fetchVideosByAuthors
|
|
---
|
|
duration_ms: 2.59005
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - NostrService
|
|
---
|
|
duration_ms: 7.951009
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 3
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.332792
|
|
|
|
→ Running tests/services/playbackService_forcedSource.test.mjs
|
|
(node:2677) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Forced Source Logic
|
|
# Subtest: Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
ok 1 - Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
---
|
|
duration_ms: 12.240374
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
ok 2 - Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
---
|
|
duration_ms: 4.166628
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
ok 3 - Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
---
|
|
duration_ms: 2.147764
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
ok 4 - Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
---
|
|
duration_ms: 1.681837
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
ok 5 - Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
---
|
|
duration_ms: 2.009571
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - PlaybackService Forced Source Logic
|
|
---
|
|
duration_ms: 115.385594
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 128.511677
|
|
|
|
→ Running tests/services/playbackService_order.test.mjs
|
|
(node:2684) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Ordering
|
|
# Subtest: Playback Execution Order
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, succeeds
|
|
ok 1 - urlFirstEnabled=true: Tries URL first, succeeds
|
|
---
|
|
duration_ms: 8.694586
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
ok 2 - urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
---
|
|
duration_ms: 1.891114
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
ok 3 - urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
---
|
|
duration_ms: 1.313907
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
ok 4 - urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
---
|
|
duration_ms: 1.951158
|
|
type: 'test'
|
|
...
|
|
# Subtest: forcedSource=torrent overrides urlFirstEnabled=true
|
|
ok 5 - forcedSource=torrent overrides urlFirstEnabled=true
|
|
---
|
|
duration_ms: 0.871868
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Playback Execution Order
|
|
---
|
|
duration_ms: 15.865653
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - PlaybackService Ordering
|
|
---
|
|
duration_ms: 17.461623
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 2
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 32.610683
|
|
|
|
→ Running tests/services/playbackService.test.mjs
|
|
(node:2691) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService
|
|
# Subtest: Initialization sets defaults and dependencies
|
|
ok 1 - Initialization sets defaults and dependencies
|
|
---
|
|
duration_ms: 1.610145
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoElement respects localStorage and binds listener
|
|
ok 2 - prepareVideoElement respects localStorage and binds listener
|
|
---
|
|
duration_ms: 4.602593
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
ok 3 - registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
---
|
|
duration_ms: 1.575726
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
ok 4 - registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
---
|
|
duration_ms: 0.727297
|
|
type: 'test'
|
|
...
|
|
# Subtest: createSession returns a PlaybackSession
|
|
ok 5 - createSession returns a PlaybackSession
|
|
---
|
|
duration_ms: 0.523399
|
|
type: 'test'
|
|
...
|
|
# Subtest: PlaybackSession Flow
|
|
# Subtest: URL Probe Success starts playback
|
|
ok 1 - URL Probe Success starts playback
|
|
---
|
|
duration_ms: 8.515561
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Probe Failure triggers fallback
|
|
ok 2 - URL Probe Failure triggers fallback
|
|
---
|
|
duration_ms: 2.444211
|
|
type: 'test'
|
|
...
|
|
# Subtest: Watchdog Stall triggers fallback
|
|
ok 3 - Watchdog Stall triggers fallback
|
|
---
|
|
duration_ms: 2.910557
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 6 - PlaybackSession Flow
|
|
---
|
|
duration_ms: 14.31164
|
|
type: 'suite'
|
|
...
|
|
1..6
|
|
ok 1 - PlaybackService
|
|
---
|
|
duration_ms: 105.089066
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 119.196884
|
|
|
|
→ Running tests/services/profileMetadataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: profileMetadataService
|
|
# Subtest: fetchProfileMetadataBatch
|
|
# Subtest: should return empty map if no pubkeys provided
|
|
ok 1 - should return empty map if no pubkeys provided
|
|
---
|
|
duration_ms: 1.828871
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fetch profiles for provided pubkeys
|
|
ok 2 - should fetch profiles for provided pubkeys
|
|
---
|
|
duration_ms: 2.631512
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle relay failures gracefully
|
|
ok 3 - should handle relay failures gracefully
|
|
---
|
|
duration_ms: 0.646443
|
|
type: 'test'
|
|
...
|
|
# Subtest: should parse profile content correctly
|
|
ok 4 - should parse profile content correctly
|
|
---
|
|
duration_ms: 0.844405
|
|
type: 'test'
|
|
...
|
|
# Subtest: should deduplicate concurrent requests (inflight)
|
|
ok 5 - should deduplicate concurrent requests (inflight)
|
|
---
|
|
duration_ms: 8.02537
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - fetchProfileMetadataBatch
|
|
---
|
|
duration_ms: 15.30318
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchProfileMetadata
|
|
# Subtest: should return null for invalid pubkey
|
|
ok 1 - should return null for invalid pubkey
|
|
---
|
|
duration_ms: 0.729464
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return single profile result
|
|
ok 2 - should return single profile result
|
|
---
|
|
duration_ms: 0.550748
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - fetchProfileMetadata
|
|
---
|
|
duration_ms: 1.811337
|
|
type: 'suite'
|
|
...
|
|
# Subtest: ensureProfileMetadataSubscription
|
|
# Subtest: should return null if nostr pool is missing
|
|
ok 1 - should return null if nostr pool is missing
|
|
---
|
|
duration_ms: 0.447404
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a subscription via relaySubscriptionService
|
|
ok 2 - should create a subscription via relaySubscriptionService
|
|
---
|
|
duration_ms: 16.674752
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle onProfile callback
|
|
ok 3 - should handle onProfile callback
|
|
---
|
|
duration_ms: 1.706432
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - ensureProfileMetadataSubscription
|
|
---
|
|
duration_ms: 19.337127
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - profileMetadataService
|
|
---
|
|
duration_ms: 37.606887
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 4
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 57.586049
|
|
|
|
→ Running tests/services/r2Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/services/r2Service.js
|
|
# Subtest: Default Settings
|
|
ok 1 - Default Settings
|
|
---
|
|
duration_ms: 3.419491
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Valid Input
|
|
ok 2 - handleCloudflareSettingsSubmit - Valid Input
|
|
---
|
|
duration_ms: 1.009658
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
ok 3 - handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
---
|
|
duration_ms: 1.426188
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Missing Fields
|
|
ok 4 - handleCloudflareSettingsSubmit - Missing Fields
|
|
---
|
|
duration_ms: 1.046264
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
ok 5 - ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
---
|
|
duration_ms: 1.044532
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
ok 6 - ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
---
|
|
duration_ms: 0.616437
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Maps meta bucket into settings
|
|
ok 7 - resolveConnection - Maps meta bucket into settings
|
|
---
|
|
duration_ms: 1.183845
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Returns null without StorageService entries
|
|
ok 8 - resolveConnection - Returns null without StorageService entries
|
|
---
|
|
duration_ms: 0.427175
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - js/services/r2Service.js
|
|
---
|
|
duration_ms: 16.975915
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 35.110095
|
|
|
|
→ Running tests/services/relay-health-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: RelayHealthService: initializes with default values
|
|
ok 1 - RelayHealthService: initializes with default values
|
|
---
|
|
duration_ms: 1.595128
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: manages telemetry opt-in
|
|
ok 2 - RelayHealthService: manages telemetry opt-in
|
|
---
|
|
duration_ms: 0.394806
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: getRelayUrls fetches from relayManager
|
|
ok 3 - RelayHealthService: getRelayUrls fetches from relayManager
|
|
---
|
|
duration_ms: 1.205065
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: ensureRelayState creates default state
|
|
ok 4 - RelayHealthService: ensureRelayState creates default state
|
|
---
|
|
duration_ms: 0.240896
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay success flow
|
|
ok 5 - RelayHealthService: checkRelay success flow
|
|
---
|
|
duration_ms: 0.948417
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay failure flow
|
|
ok 6 - RelayHealthService: checkRelay failure flow
|
|
---
|
|
duration_ms: 0.567909
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay handles missing nostrClient
|
|
ok 7 - RelayHealthService: checkRelay handles missing nostrClient
|
|
---
|
|
duration_ms: 0.288295
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: refresh checks all relays
|
|
ok 8 - RelayHealthService: refresh checks all relays
|
|
---
|
|
duration_ms: 0.736029
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: emits telemetry if opted in
|
|
ok 9 - RelayHealthService: emits telemetry if opted in
|
|
---
|
|
duration_ms: 1.02216
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
ok 10 - RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
---
|
|
duration_ms: 9.899672
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: failure threshold triggers user warning
|
|
ok 11 - RelayHealthService: failure threshold triggers user warning
|
|
---
|
|
duration_ms: 0.923019
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: user warning respects cooldown
|
|
ok 12 - RelayHealthService: user warning respects cooldown
|
|
---
|
|
duration_ms: 0.578919
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: relay disconnect/error events trigger failure
|
|
ok 13 - RelayHealthService: relay disconnect/error events trigger failure
|
|
---
|
|
duration_ms: 0.25785
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
ok 14 - RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
---
|
|
duration_ms: 0.309967
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 5016.724308
|
|
|
|
→ Running tests/services/s3Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: s3Service
|
|
# Subtest: validateS3Connection
|
|
# Subtest: should validate correct configuration
|
|
ok 1 - should validate correct configuration
|
|
---
|
|
duration_ms: 1.683766
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on missing required fields
|
|
ok 2 - should throw on missing required fields
|
|
---
|
|
duration_ms: 0.824861
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - validateS3Connection
|
|
---
|
|
duration_ms: 3.705251
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getCorsOrigins
|
|
# Subtest: should return current origin
|
|
ok 1 - should return current origin
|
|
---
|
|
duration_ms: 102.632601
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle localhost
|
|
ok 2 - should handle localhost
|
|
---
|
|
duration_ms: 13.569228
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - getCorsOrigins
|
|
---
|
|
duration_ms: 116.566088
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - s3Service
|
|
---
|
|
duration_ms: 121.140478
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 3
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 136.451034
|
|
|
|
→ Running tests/services/s3UploadService.test.mjs
|
|
TAP version 13
|
|
# Subtest: S3UploadService
|
|
# Subtest: constructor initializes listeners
|
|
ok 1 - constructor initializes listeners
|
|
---
|
|
duration_ms: 1.415395
|
|
type: 'test'
|
|
...
|
|
# Subtest: Event Emitter Logic
|
|
ok 2 - Event Emitter Logic
|
|
---
|
|
duration_ms: 1.491679
|
|
type: 'test'
|
|
...
|
|
# Subtest: emit handles listener errors safely
|
|
ok 3 - emit handles listener errors safely
|
|
---
|
|
duration_ms: 0.615785
|
|
type: 'test'
|
|
...
|
|
# Subtest: verifyConnection
|
|
ok 4 - verifyConnection
|
|
---
|
|
duration_ms: 0.434793
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareUpload
|
|
ok 5 - prepareUpload
|
|
---
|
|
duration_ms: 0.498815
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadFile
|
|
# Subtest: validates parameters
|
|
ok 1 - validates parameters
|
|
---
|
|
duration_ms: 0.952638
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads successfully
|
|
ok 2 - uploads successfully
|
|
---
|
|
duration_ms: 1.014606
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - uploadFile
|
|
---
|
|
duration_ms: 2.784656
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadVideo
|
|
# Subtest: fails if npub missing
|
|
ok 1 - fails if npub missing
|
|
---
|
|
duration_ms: 1.124106
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if title missing
|
|
ok 2 - fails if title missing
|
|
---
|
|
duration_ms: 0.560229
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if file missing
|
|
ok 3 - fails if file missing
|
|
---
|
|
duration_ms: 0.244586
|
|
type: 'test'
|
|
...
|
|
# Subtest: successful upload flow
|
|
ok 4 - successful upload flow
|
|
---
|
|
duration_ms: 0.948041
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads thumbnail if provided
|
|
ok 5 - uploads thumbnail if provided
|
|
---
|
|
duration_ms: 0.61158
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles validation errors from normalizeVideoNotePayload
|
|
ok 6 - handles validation errors from normalizeVideoNotePayload
|
|
---
|
|
duration_ms: 0.366251
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles upload exception
|
|
ok 7 - handles upload exception
|
|
---
|
|
duration_ms: 0.45911
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 7 - uploadVideo
|
|
---
|
|
duration_ms: 7.505701
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - S3UploadService
|
|
---
|
|
duration_ms: 17.230096
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 38.342142
|
|
|
|
→ Running tests/services/trustBootstrap.test.mjs
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:150:11)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at runAsyncRetry (file:///app/js/services/trustBootstrap.js:160:13)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl failed
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:164:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:171:30)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
TAP version 13
|
|
# Subtest: trustBootstrap
|
|
# Subtest: should return early if feature is disabled
|
|
ok 1 - should return early if feature is disabled
|
|
---
|
|
duration_ms: 2.713974
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply seeds when accessControl is ready
|
|
ok 2 - should apply seeds when accessControl is ready
|
|
---
|
|
duration_ms: 2.063426
|
|
type: 'test'
|
|
...
|
|
# Subtest: should subscribe to accessControl changes
|
|
ok 3 - should subscribe to accessControl changes
|
|
---
|
|
duration_ms: 1.660887
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle accessControl timeout and apply seeds anyway
|
|
ok 4 - should handle accessControl timeout and apply seeds anyway
|
|
---
|
|
duration_ms: 3.85554
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recompute summaries after applying seeds
|
|
ok 5 - should recompute summaries after applying seeds
|
|
---
|
|
duration_ms: 0.909885
|
|
type: 'test'
|
|
...
|
|
# Subtest: should wait for relays if hydration fails initially
|
|
ok 6 - should wait for relays if hydration fails initially
|
|
---
|
|
duration_ms: 301.513253
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - trustBootstrap
|
|
---
|
|
duration_ms: 314.99688
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3771.664703
|
|
|
|
→ Running tests/share-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildShareEvent preserves share content
|
|
ok 1 - buildShareEvent preserves share content
|
|
---
|
|
duration_ms: 2.102803
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent normalizes hex identifiers for e and p tags
|
|
ok 2 - buildShareEvent normalizes hex identifiers for e and p tags
|
|
---
|
|
duration_ms: 1.826953
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent includes sanitized relay hints
|
|
ok 3 - buildShareEvent includes sanitized relay hints
|
|
---
|
|
duration_ms: 0.561769
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent tolerates missing optional fields
|
|
ok 4 - buildShareEvent tolerates missing optional fields
|
|
---
|
|
duration_ms: 0.291897
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.924804
|
|
|
|
→ Running tests/shareNostrController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ShareNostrController
|
|
# Subtest: handleShare shares video successfully
|
|
ok 1 - handleShare shares video successfully
|
|
---
|
|
duration_ms: 2.119389
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleShare throws error if missing video details
|
|
ok 2 - handleShare throws error if missing video details
|
|
---
|
|
duration_ms: 0.96252
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal shows error if no video
|
|
ok 3 - openModal shows error if no video
|
|
---
|
|
duration_ms: 0.682833
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal opens modal with correct payload
|
|
ok 4 - openModal opens modal with correct payload
|
|
---
|
|
duration_ms: 0.505083
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - ShareNostrController
|
|
---
|
|
duration_ms: 6.708789
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.983913
|
|
|
|
→ Running tests/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent executes successfully
|
|
ok 1 - queueSignEvent executes successfully
|
|
---
|
|
duration_ms: 1.79789
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes sequentially for same signer
|
|
ok 2 - queueSignEvent executes sequentially for same signer
|
|
---
|
|
duration_ms: 103.157122
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes concurrently for different signers
|
|
ok 3 - queueSignEvent executes concurrently for different signers
|
|
---
|
|
duration_ms: 51.64964
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent times out
|
|
ok 4 - queueSignEvent times out
|
|
---
|
|
duration_ms: 52.579792
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent normalizes errors
|
|
ok 5 - queueSignEvent normalizes errors
|
|
---
|
|
duration_ms: 0.710286
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles signer disconnect
|
|
ok 6 - queueSignEvent handles signer disconnect
|
|
---
|
|
duration_ms: 0.609198
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles missing signer
|
|
ok 7 - queueSignEvent handles missing signer
|
|
---
|
|
duration_ms: 0.429385
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 366.681357
|
|
|
|
→ Running tests/state/appState.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: getters and setters work for simple values
|
|
ok 1 - getters and setters work for simple values
|
|
---
|
|
duration_ms: 1.592796
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppStateKey fires on change
|
|
ok 2 - subscribeToAppStateKey fires on change
|
|
---
|
|
duration_ms: 0.733398
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppState fires on any change
|
|
ok 3 - subscribeToAppState fires on any change
|
|
---
|
|
duration_ms: 0.472778
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState updates state and notifies
|
|
ok 4 - setModalState updates state and notifies
|
|
---
|
|
duration_ms: 0.725374
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState clears everything
|
|
ok 5 - resetAppState clears everything
|
|
---
|
|
duration_ms: 0.709658
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap only accepts Maps or null
|
|
ok 6 - setVideosMap only accepts Maps or null
|
|
---
|
|
duration_ms: 0.296793
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 6.361252
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.956993
|
|
|
|
→ Running tests/state/cache-saved-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: persistSavedProfiles preserves custom authType strings
|
|
ok 1 - persistSavedProfiles preserves custom authType strings
|
|
---
|
|
duration_ms: 2.147335
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage retains custom provider authType
|
|
ok 2 - loadSavedProfilesFromStorage retains custom provider authType
|
|
---
|
|
duration_ms: 0.62234
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
ok 3 - loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
---
|
|
duration_ms: 0.368614
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage trims stored authType values
|
|
ok 4 - loadSavedProfilesFromStorage trims stored authType values
|
|
---
|
|
duration_ms: 0.29065
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
ok 5 - loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
---
|
|
duration_ms: 0.266596
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.634978
|
|
|
|
→ Running tests/state/cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/state/cache.js
|
|
# Subtest: Saved Profiles Persistence
|
|
ok 1 - Saved Profiles Persistence
|
|
---
|
|
duration_ms: 3.369346
|
|
type: 'test'
|
|
...
|
|
# Subtest: Active Profile Pubkey
|
|
ok 2 - Active Profile Pubkey
|
|
---
|
|
duration_ms: 0.624572
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Caching
|
|
ok 3 - URL Health Caching
|
|
---
|
|
duration_ms: 0.713517
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Expiration
|
|
ok 4 - URL Health Expiration
|
|
---
|
|
duration_ms: 10.771235
|
|
type: 'test'
|
|
...
|
|
# Subtest: Moderation Settings
|
|
ok 5 - Moderation Settings
|
|
---
|
|
duration_ms: 1.954029
|
|
type: 'test'
|
|
...
|
|
# Subtest: Legacy Moderation Overrides Support
|
|
# Subtest: ignores legacy v1 overrides
|
|
ok 1 - ignores legacy v1 overrides
|
|
---
|
|
duration_ms: 0.549717
|
|
type: 'test'
|
|
...
|
|
# Subtest: loads v2 overrides
|
|
ok 2 - loads v2 overrides
|
|
---
|
|
duration_ms: 0.756115
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - Legacy Moderation Overrides Support
|
|
---
|
|
duration_ms: 2.627197
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - js/state/cache.js
|
|
---
|
|
duration_ms: 24.479913
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.127216
|
|
|
|
→ Running tests/state/profile-cache.test.mjs
|
|
[bitvid] [ProfileCache] Expired watchHistory for 1111111111111111111111111111111111111111111111111111111111111111
|
|
TAP version 13
|
|
# Subtest: ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
ok 1 - ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
---
|
|
duration_ms: 2.599733
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolves storage keys correctly
|
|
ok 2 - ProfileCache: resolves storage keys correctly
|
|
---
|
|
duration_ms: 0.859268
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: persists data to localStorage and memory
|
|
ok 3 - ProfileCache: persists data to localStorage and memory
|
|
---
|
|
duration_ms: 2.55932
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: loads from localStorage if memory miss
|
|
ok 4 - ProfileCache: loads from localStorage if memory miss
|
|
---
|
|
duration_ms: 0.508406
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: handles active profile switching
|
|
ok 5 - ProfileCache: handles active profile switching
|
|
---
|
|
duration_ms: 1.472293
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile normalizes and saves
|
|
ok 6 - ProfileCache: setProfile normalizes and saves
|
|
---
|
|
duration_ms: 1.578183
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: emits events on active profile change
|
|
ok 7 - ProfileCache: emits events on active profile change
|
|
---
|
|
duration_ms: 0.58049
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: respects TTL expiration
|
|
ok 8 - ProfileCache: respects TTL expiration
|
|
---
|
|
duration_ms: 1.671238
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile sanitizes XSS in media URLs
|
|
ok 9 - ProfileCache: setProfile sanitizes XSS in media URLs
|
|
---
|
|
duration_ms: 1.960855
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 33.715349
|
|
|
|
→ Running tests/state/profile-settings-store.test.mjs
|
|
TAP version 13
|
|
# Subtest: profile settings store clones values and tracks entries
|
|
ok 1 - profile settings store clones values and tracks entries
|
|
---
|
|
duration_ms: 2.542327
|
|
type: 'test'
|
|
...
|
|
# Subtest: profile settings store ignores falsy keys and survives clone failures
|
|
ok 2 - profile settings store ignores falsy keys and survives clone failures
|
|
---
|
|
duration_ms: 0.367167
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.470735
|
|
|
|
→ Running tests/storage-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: StorageService
|
|
# Subtest: init() creates database and object store
|
|
ok 1 - init() creates database and object store
|
|
---
|
|
duration_ms: 11.073208
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() generates and stores master key with NIP-44
|
|
ok 2 - unlock() generates and stores master key with NIP-44
|
|
---
|
|
duration_ms: 10.250764
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() restores existing master key
|
|
ok 3 - unlock() restores existing master key
|
|
---
|
|
duration_ms: 4.626211
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
ok 4 - unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
---
|
|
duration_ms: 3.193851
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes permission denied decrypt errors
|
|
ok 5 - unlock() normalizes permission denied decrypt errors
|
|
---
|
|
duration_ms: 3.929294
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes missing decryptor errors
|
|
ok 6 - unlock() normalizes missing decryptor errors
|
|
---
|
|
duration_ms: 4.479922
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes unknown decrypt errors
|
|
ok 7 - unlock() normalizes unknown decrypt errors
|
|
---
|
|
duration_ms: 2.623997
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: saveConnection() encrypts and stores connection
|
|
ok 8 - saveConnection() encrypts and stores connection
|
|
---
|
|
duration_ms: 4.836253
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: getConnection() decrypts and returns connection
|
|
ok 9 - getConnection() decrypts and returns connection
|
|
---
|
|
duration_ms: 4.251301
|
|
type: 'test'
|
|
...
|
|
# Subtest: getConnection() throws if locked
|
|
ok 10 - getConnection() throws if locked
|
|
---
|
|
duration_ms: 1.327576
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Deleted connection conn_1
|
|
# Subtest: deleteConnection() removes connection
|
|
ok 11 - deleteConnection() removes connection
|
|
---
|
|
duration_ms: 3.320855
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: setDefaultConnection() updates metadata
|
|
ok 12 - setDefaultConnection() updates metadata
|
|
---
|
|
duration_ms: 3.585816
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: saveConnection() with defaultForUploads=true clears other defaults
|
|
ok 13 - saveConnection() with defaultForUploads=true clears other defaults
|
|
---
|
|
duration_ms: 3.666911
|
|
type: 'test'
|
|
...
|
|
1..13
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 63.656721
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 1
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 72.07895
|
|
|
|
→ Running tests/subscriptions-manager.test.mjs
|
|
[bitvid] [nostr] Relay backoff applied. {
|
|
relay: 'wss://relay-b.example',
|
|
backoffMs: 1000,
|
|
failureCount: 1,
|
|
retryAt: 1770906084386,
|
|
reason: null
|
|
}
|
|
TAP version 13
|
|
# Subtest: loadSubscriptions aggregates relay results when one rejects
|
|
ok 1 - loadSubscriptions aggregates relay results when one rejects
|
|
---
|
|
duration_ms: 10.453694
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions queries the correct subscription list kind
|
|
ok 2 - loadSubscriptions queries the correct subscription list kind
|
|
---
|
|
duration_ms: 0.939864
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions falls back to nip44 when hinted
|
|
ok 3 - loadSubscriptions falls back to nip44 when hinted
|
|
---
|
|
duration_ms: 1.766656
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions handles nip44.v2 decryptors
|
|
ok 4 - loadSubscriptions handles nip44.v2 decryptors
|
|
---
|
|
duration_ms: 1.205057
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions prefers nip44 decryptors when both are available
|
|
ok 5 - loadSubscriptions prefers nip44 decryptors when both are available
|
|
---
|
|
duration_ms: 1.449256
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
ok 6 - loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
---
|
|
duration_ms: 1.28128
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions retries permission-required decrypts only when enabled
|
|
ok 7 - loadSubscriptions retries permission-required decrypts only when enabled
|
|
---
|
|
duration_ms: 1.30557
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
ok 8 - showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
---
|
|
duration_ms: 90.031707
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureLoaded memoizes concurrent loads
|
|
ok 9 - ensureLoaded memoizes concurrent loads
|
|
---
|
|
duration_ms: 8.034134
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
ok 10 - publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
---
|
|
duration_ms: 2.541449
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList prefers nip44 encryption when available
|
|
ok 11 - publishSubscriptionList prefers nip44 encryption when available
|
|
---
|
|
duration_ms: 0.901114
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList falls back to nip04 when nip44 fails
|
|
ok 12 - publishSubscriptionList falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.834431
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle shows empty state message
|
|
ok 13 - renderSameGridStyle shows empty state message
|
|
---
|
|
duration_ms: 13.661953
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle forwards moderation badge actions to the application
|
|
ok 14 - renderSameGridStyle forwards moderation badge actions to the application
|
|
---
|
|
duration_ms: 62.808782
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 6025.216562
|
|
|
|
→ Running tests/torrent/service-worker-fallback-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: returns generic message when error missing
|
|
ok 1 - returns generic message when error missing
|
|
---
|
|
duration_ms: 3.10584
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies HTTPS requirement errors
|
|
ok 2 - identifies HTTPS requirement errors
|
|
---
|
|
duration_ms: 0.292543
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies disabled service worker errors
|
|
ok 3 - identifies disabled service worker errors
|
|
---
|
|
duration_ms: 0.424383
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies Brave specific guidance
|
|
ok 4 - identifies Brave specific guidance
|
|
---
|
|
duration_ms: 0.371457
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies blocked script errors
|
|
ok 5 - identifies blocked script errors
|
|
---
|
|
duration_ms: 0.338348
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies controller claim timeout
|
|
ok 6 - identifies controller claim timeout
|
|
---
|
|
duration_ms: 0.21028
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.939848
|
|
|
|
→ Running tests/torrent/style-helpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/styleHelpers
|
|
# Subtest: returns null when no element is provided
|
|
ok 1 - returns null when no element is provided
|
|
---
|
|
duration_ms: 1.099172
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns the original element without mutations
|
|
ok 2 - returns the original element without mutations
|
|
---
|
|
duration_ms: 83.569279
|
|
type: 'test'
|
|
...
|
|
# Subtest: provides an empty, frozen fallback map
|
|
ok 3 - provides an empty, frozen fallback map
|
|
---
|
|
duration_ms: 1.306139
|
|
type: 'test'
|
|
...
|
|
# Subtest: no-ops when removing styles
|
|
ok 4 - no-ops when removing styles
|
|
---
|
|
duration_ms: 10.498305
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - torrent/ui/styleHelpers
|
|
---
|
|
duration_ms: 98.146223
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 111.893686
|
|
|
|
→ Running tests/torrent/toast-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/toastService
|
|
# Subtest: renders a toast with Tailwind token classes and removes it on dismiss
|
|
ok 1 - renders a toast with Tailwind token classes and removes it on dismiss
|
|
---
|
|
duration_ms: 405.657041
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - torrent/ui/toastService
|
|
---
|
|
duration_ms: 407.637233
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 1
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 421.249301
|
|
|
|
→ Running tests/ui/app-chrome-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppChromeController binds upload button when elements hydrate later
|
|
ok 1 - AppChromeController binds upload button when elements hydrate later
|
|
---
|
|
duration_ms: 85.163895
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 95.801278
|
|
|
|
→ Running tests/ui/components/debug_hashtag_strip_helper.test.mjs
|
|
Global ResizeObserver type: function
|
|
Helper window ResizeObserver: undefined
|
|
TAP version 13
|
|
# Subtest: Debug HashtagStripHelper fallback
|
|
ok 1 - Debug HashtagStripHelper fallback
|
|
---
|
|
duration_ms: 97.617902
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 107.464703
|
|
|
|
→ Running tests/ui/components/hashtagStripHelper.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper uses ResizeObserver when available
|
|
ok 1 - HashtagStripHelper uses ResizeObserver when available
|
|
---
|
|
duration_ms: 102.1719
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with RAF
|
|
ok 2 - HashtagStripHelper falls back to window resize with RAF
|
|
---
|
|
duration_ms: 16.709276
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
ok 3 - HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
---
|
|
duration_ms: 13.250007
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper handles teardown correctly
|
|
ok 4 - HashtagStripHelper handles teardown correctly
|
|
---
|
|
duration_ms: 13.631848
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 165.201779
|
|
|
|
→ Running tests/ui/components/videoMenuRenderers.test.mjs
|
|
TAP version 13
|
|
# Subtest: createVideoMoreMenuPanel - basic rendering
|
|
ok 1 - createVideoMoreMenuPanel - basic rendering
|
|
---
|
|
duration_ms: 115.232424
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - pointer info rendering
|
|
ok 2 - createVideoMoreMenuPanel - pointer info rendering
|
|
---
|
|
duration_ms: 13.979456
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - mirror logic
|
|
ok 3 - createVideoMoreMenuPanel - mirror logic
|
|
---
|
|
duration_ms: 14.305202
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - blacklist logic
|
|
ok 4 - createVideoMoreMenuPanel - blacklist logic
|
|
---
|
|
duration_ms: 13.1981
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - permission logic
|
|
ok 5 - createVideoShareMenuPanel - permission logic
|
|
---
|
|
duration_ms: 16.861932
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - magnet/cdn logic
|
|
ok 6 - createVideoShareMenuPanel - magnet/cdn logic
|
|
---
|
|
duration_ms: 11.293431
|
|
type: 'test'
|
|
...
|
|
# Subtest: createChannelProfileMenuPanel - basic actions
|
|
ok 7 - createChannelProfileMenuPanel - basic actions
|
|
---
|
|
duration_ms: 11.908956
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoSettingsMenuPanel - capabilities
|
|
ok 8 - createVideoSettingsMenuPanel - capabilities
|
|
---
|
|
duration_ms: 17.77315
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 231.024629
|
|
|
|
→ Running tests/ui/creatorProfileController.test.mjs
|
|
TAP version 13
|
|
# Subtest: CreatorProfileController
|
|
# Subtest: resolveCreatorProfileFromSources prioritizes cached profile
|
|
ok 1 - resolveCreatorProfileFromSources prioritizes cached profile
|
|
---
|
|
duration_ms: 3.392451
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCreatorProfileFromSources falls back to fetched profile
|
|
ok 2 - resolveCreatorProfileFromSources falls back to fetched profile
|
|
---
|
|
duration_ms: 0.463439
|
|
type: 'test'
|
|
...
|
|
# Subtest: decorateVideoCreatorIdentity modifies video object
|
|
ok 3 - decorateVideoCreatorIdentity modifies video object
|
|
---
|
|
duration_ms: 0.649555
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchModalCreatorProfile fetches profile and updates modal
|
|
ok 4 - fetchModalCreatorProfile fetches profile and updates modal
|
|
---
|
|
duration_ms: 1.284733
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - CreatorProfileController
|
|
---
|
|
duration_ms: 8.40904
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.420127
|
|
|
|
→ Running tests/ui/dm/zapHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: formatZapAmount
|
|
# Subtest: formats standard amounts correctly
|
|
ok 1 - formats standard amounts correctly
|
|
---
|
|
duration_ms: 25.337496
|
|
type: 'test'
|
|
...
|
|
# Subtest: formats compact amounts correctly
|
|
ok 2 - formats compact amounts correctly
|
|
---
|
|
duration_ms: 0.839429
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles zero and small numbers
|
|
ok 3 - handles zero and small numbers
|
|
---
|
|
duration_ms: 0.520427
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 4 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.504795
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles string number inputs
|
|
ok 5 - handles string number inputs
|
|
---
|
|
duration_ms: 0.331537
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - formatZapAmount
|
|
---
|
|
duration_ms: 29.313696
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aggregateZapTotals
|
|
# Subtest: aggregates totals correctly
|
|
ok 1 - aggregates totals correctly
|
|
---
|
|
duration_ms: 0.417265
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles empty input
|
|
ok 2 - handles empty input
|
|
---
|
|
duration_ms: 0.337778
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-array input
|
|
ok 3 - handles non-array input
|
|
---
|
|
duration_ms: 0.36707
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing or invalid amounts
|
|
ok 4 - handles missing or invalid amounts
|
|
---
|
|
duration_ms: 0.473799
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing IDs
|
|
ok 5 - handles missing IDs
|
|
---
|
|
duration_ms: 0.409041
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - aggregateZapTotals
|
|
---
|
|
duration_ms: 2.506678
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeZapReceipt
|
|
# Subtest: normalizes valid receipt
|
|
ok 1 - normalizes valid receipt
|
|
---
|
|
duration_ms: 0.328237
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes receipt with amount fallback
|
|
ok 2 - normalizes receipt with amount fallback
|
|
---
|
|
duration_ms: 0.133238
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes empty receipt
|
|
ok 3 - normalizes empty receipt
|
|
---
|
|
duration_ms: 0.106043
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes undefined receipt
|
|
ok 4 - normalizes undefined receipt
|
|
---
|
|
duration_ms: 0.093936
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes invalid amount
|
|
ok 5 - normalizes invalid amount
|
|
---
|
|
duration_ms: 0.096339
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - normalizeZapReceipt
|
|
---
|
|
duration_ms: 0.968794
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
# tests 15
|
|
# suites 3
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 56.175236
|
|
|
|
→ Running tests/ui/engagement-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: EngagementController
|
|
# Subtest: handleRepostAction - should show error if no event ID is available
|
|
ok 1 - handleRepostAction - should show error if no event ID is available
|
|
---
|
|
duration_ms: 4.864384
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should call repostEvent with correct parameters
|
|
ok 2 - handleRepostAction - should call repostEvent with correct parameters
|
|
---
|
|
duration_ms: 1.405152
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should handle failure from repostEvent
|
|
ok 3 - handleRepostAction - should handle failure from repostEvent
|
|
---
|
|
duration_ms: 1.282098
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should use currentVideoPointer when in modal context
|
|
ok 4 - handleRepostAction - should use currentVideoPointer when in modal context
|
|
---
|
|
duration_ms: 1.114127
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should show error if video has no URL
|
|
ok 5 - handleMirrorAction - should show error if video has no URL
|
|
---
|
|
duration_ms: 2.124286
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
ok 6 - handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
---
|
|
duration_ms: 1.025652
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should prevent mirroring private videos
|
|
ok 7 - handleMirrorAction - should prevent mirroring private videos
|
|
---
|
|
duration_ms: 0.659222
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show error if no event ID
|
|
ok 8 - handleEnsurePresenceAction - should show error if no event ID
|
|
---
|
|
duration_ms: 1.170092
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should handle throttled response
|
|
ok 9 - handleEnsurePresenceAction - should handle throttled response
|
|
---
|
|
duration_ms: 1.577144
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
ok 10 - handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
---
|
|
duration_ms: 0.9783
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
ok 1 - EngagementController
|
|
---
|
|
duration_ms: 22.890573
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 56.840248
|
|
|
|
→ Running tests/ui/hashtag-strip-helper-bounce.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper triggers scroll hint when content overflows
|
|
ok 1 - HashtagStripHelper triggers scroll hint when content overflows
|
|
---
|
|
duration_ms: 103.936721
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper does not trigger scroll hint when no overflow
|
|
ok 2 - HashtagStripHelper does not trigger scroll hint when no overflow
|
|
---
|
|
duration_ms: 24.155962
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 141.01043
|
|
|
|
→ Running tests/ui/popoverEngine.test.mjs
|
|
TAP version 13
|
|
# Subtest: opens a popover in the overlay root and positions the panel
|
|
ok 1 - opens a popover in the overlay root and positions the panel
|
|
---
|
|
duration_ms: 422.895443
|
|
type: 'test'
|
|
...
|
|
# Subtest: positions bottom-end panels flush with the trigger's right edge
|
|
ok 2 - positions bottom-end panels flush with the trigger's right edge
|
|
---
|
|
duration_ms: 71.110401
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes on outside pointer events and restores focus
|
|
ok 3 - closes on outside pointer events and restores focus
|
|
---
|
|
duration_ms: 36.309993
|
|
type: 'test'
|
|
...
|
|
# Subtest: supports roving focus, home/end navigation, and typeahead
|
|
ok 4 - supports roving focus, home/end navigation, and typeahead
|
|
---
|
|
duration_ms: 82.317318
|
|
type: 'test'
|
|
...
|
|
# Subtest: escape closes the popover and restores trigger focus
|
|
ok 5 - escape closes the popover and restores trigger focus
|
|
---
|
|
duration_ms: 78.122556
|
|
type: 'test'
|
|
...
|
|
# Subtest: close respects restoreFocus option for contextual menus
|
|
ok 6 - close respects restoreFocus option for contextual menus
|
|
---
|
|
duration_ms: 47.60227
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensures only one popover is open at a time
|
|
ok 7 - ensures only one popover is open at a time
|
|
---
|
|
duration_ms: 86.41374
|
|
type: 'test'
|
|
...
|
|
# Subtest: applies token-based sizing and arrow positioning
|
|
ok 8 - applies token-based sizing and arrow positioning
|
|
---
|
|
duration_ms: 83.051066
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 925.642705
|
|
|
|
→ Running tests/ui/profile-modal-moderation-settings.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation settings save updates service and disables control
|
|
ok 1 - moderation settings save updates service and disables control
|
|
---
|
|
duration_ms: 251.619386
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation reset restores defaults and clearing inputs uses defaults
|
|
ok 2 - moderation reset restores defaults and clearing inputs uses defaults
|
|
---
|
|
duration_ms: 68.705967
|
|
type: 'test'
|
|
...
|
|
# Subtest: guest fallback uses config moderation defaults
|
|
ok 3 - guest fallback uses config moderation defaults
|
|
---
|
|
duration_ms: 61.686246
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 403.801748
|
|
|
|
→ Running tests/ui/profileModalController-addProfile.test.mjs
|
|
Success: Profile added. Select it when you're ready to switch.
|
|
Success: That profile is already saved on this device.
|
|
TAP version 13
|
|
# Subtest: handleAddProfile adds a new profile correctly
|
|
ok 1 - handleAddProfile adds a new profile correctly
|
|
---
|
|
duration_ms: 165.382274
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile prevents duplicates
|
|
ok 2 - handleAddProfile prevents duplicates
|
|
---
|
|
duration_ms: 26.066003
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles missing login result
|
|
ok 3 - handleAddProfile handles missing login result
|
|
---
|
|
duration_ms: 28.628361
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles errors gracefully
|
|
ok 4 - handleAddProfile handles errors gracefully
|
|
---
|
|
duration_ms: 20.553754
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 256.699095
|
|
|
|
→ Running tests/ui/reactionController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ReactionController
|
|
# Subtest: should subscribe to reactions
|
|
ok 1 - should subscribe to reactions
|
|
---
|
|
duration_ms: 2.784022
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle reaction update from subscription
|
|
ok 2 - should handle reaction update from subscription
|
|
---
|
|
duration_ms: 0.679903
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply optimistic update on handleReaction
|
|
ok 3 - should apply optimistic update on handleReaction
|
|
---
|
|
duration_ms: 0.958799
|
|
type: 'test'
|
|
...
|
|
# Subtest: should rollback optimistic update on publish failure
|
|
ok 4 - should rollback optimistic update on publish failure
|
|
---
|
|
duration_ms: 0.744422
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not react if user not logged in
|
|
ok 5 - should not react if user not logged in
|
|
---
|
|
duration_ms: 0.887995
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - ReactionController
|
|
---
|
|
duration_ms: 7.853105
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.312438
|
|
|
|
→ Running tests/ui/similar-content-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: cached thumbnails reuse existing src without lazy-loading
|
|
ok 1 - cached thumbnails reuse existing src without lazy-loading
|
|
---
|
|
duration_ms: 290.744639
|
|
type: 'test'
|
|
...
|
|
# Subtest: uncached thumbnails use fallback, cache on load, and retain blur state
|
|
ok 2 - uncached thumbnails use fallback, cache on load, and retain blur state
|
|
---
|
|
duration_ms: 53.878468
|
|
type: 'test'
|
|
...
|
|
# Subtest: primary clicks trigger onPlay while modifiers and right clicks do not
|
|
ok 3 - primary clicks trigger onPlay while modifiers and right clicks do not
|
|
---
|
|
duration_ms: 28.748248
|
|
type: 'test'
|
|
...
|
|
# Subtest: author identity fields render supplied values and datasets
|
|
ok 4 - author identity fields render supplied values and datasets
|
|
---
|
|
duration_ms: 16.718219
|
|
type: 'test'
|
|
...
|
|
# Subtest: view counter wiring exposes pointer datasets
|
|
ok 5 - view counter wiring exposes pointer datasets
|
|
---
|
|
duration_ms: 20.942985
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 431.088177
|
|
|
|
→ Running tests/ui/similarContentController.test.mjs
|
|
TAP version 13
|
|
# Subtest: SimilarContentController
|
|
# Subtest: extractDTagValue
|
|
# Subtest: should return the 'd' tag value
|
|
ok 1 - should return the 'd' tag value
|
|
---
|
|
duration_ms: 1.845681
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string if no 'd' tag
|
|
ok 2 - should return empty string if no 'd' tag
|
|
---
|
|
duration_ms: 0.517184
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - extractDTagValue
|
|
---
|
|
duration_ms: 3.436375
|
|
type: 'suite'
|
|
...
|
|
# Subtest: computeCandidates
|
|
# Subtest: should return empty array if no active video
|
|
ok 1 - should return empty array if no active video
|
|
---
|
|
duration_ms: 2.18146
|
|
type: 'test'
|
|
...
|
|
# Subtest: should compute similar candidates based on tags
|
|
ok 2 - should compute similar candidates based on tags
|
|
---
|
|
duration_ms: 3.099788
|
|
type: 'test'
|
|
...
|
|
# Subtest: should exclude blocked authors
|
|
ok 3 - should exclude blocked authors
|
|
---
|
|
duration_ms: 1.469122
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prioritize higher shared tag count
|
|
ok 4 - should prioritize higher shared tag count
|
|
---
|
|
duration_ms: 1.542924
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - computeCandidates
|
|
---
|
|
duration_ms: 9.276075
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateModal
|
|
# Subtest: should clear similar content if no active video
|
|
ok 1 - should clear similar content if no active video
|
|
---
|
|
duration_ms: 1.030796
|
|
type: 'test'
|
|
...
|
|
# Subtest: should set similar content if matches found
|
|
ok 2 - should set similar content if matches found
|
|
---
|
|
duration_ms: 1.578712
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear similar content if no matches found
|
|
ok 3 - should clear similar content if no matches found
|
|
---
|
|
duration_ms: 1.177554
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - updateModal
|
|
---
|
|
duration_ms: 4.371281
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - SimilarContentController
|
|
---
|
|
duration_ms: 18.619129
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 4
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 43.334866
|
|
|
|
→ Running tests/ui/storageService.test.mjs
|
|
TAP version 13
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: StorageService
|
|
# Subtest: should unlock storage with a valid signer
|
|
ok 1 - should unlock storage with a valid signer
|
|
---
|
|
duration_ms: 15.244972
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection r2-test-1
|
|
# Subtest: should save and retrieve an R2 connection
|
|
ok 2 - should save and retrieve an R2 connection
|
|
---
|
|
duration_ms: 7.706699
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection s3-generic-1
|
|
# Subtest: should save and retrieve a Generic S3 connection with extra fields
|
|
ok 3 - should save and retrieve a Generic S3 connection with extra fields
|
|
---
|
|
duration_ms: 4.282654
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail to get connection if locked
|
|
ok 4 - should fail to get connection if locked
|
|
---
|
|
duration_ms: 1.302654
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 182.099289
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 194.017337
|
|
|
|
→ Running tests/ui/tag-pill-list.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderTagPillStrip builds buttons with labels and icons
|
|
ok 1 - renderTagPillStrip builds buttons with labels and icons
|
|
---
|
|
duration_ms: 101.368304
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip applies preference state styling
|
|
ok 2 - renderTagPillStrip applies preference state styling
|
|
---
|
|
duration_ms: 12.317269
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip wires the activation callback
|
|
ok 3 - renderTagPillStrip wires the activation callback
|
|
---
|
|
duration_ms: 10.99929
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 139.591643
|
|
|
|
→ Running tests/ui/tag-preference-menu.test.mjs
|
|
TAP version 13
|
|
# Subtest: createTagPreferenceMenu renders heading and actions
|
|
ok 1 - createTagPreferenceMenu renders heading and actions
|
|
---
|
|
duration_ms: 93.583625
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu disables actions based on membership and login
|
|
ok 2 - createTagPreferenceMenu disables actions based on membership and login
|
|
---
|
|
duration_ms: 16.324925
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu forwards actions to callback
|
|
ok 3 - createTagPreferenceMenu forwards actions to callback
|
|
---
|
|
duration_ms: 13.896801
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 142.914022
|
|
|
|
→ Running tests/ui/tagPreferenceMenuController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TagPreferenceMenuController
|
|
# Subtest: ensurePopover
|
|
# Subtest: should create a new popover entry if one does not exist
|
|
ok 1 - should create a new popover entry if one does not exist
|
|
---
|
|
duration_ms: 2.708572
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return existing entry if one exists
|
|
ok 2 - should return existing entry if one exists
|
|
---
|
|
duration_ms: 0.647253
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return null if trigger or tag is missing
|
|
ok 3 - should return null if trigger or tag is missing
|
|
---
|
|
duration_ms: 1.145208
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - ensurePopover
|
|
---
|
|
duration_ms: 5.739292
|
|
type: 'suite'
|
|
...
|
|
# Subtest: requestMenu
|
|
# Subtest: should ensure popover, close others, and open the requested one
|
|
ok 1 - should ensure popover, close others, and open the requested one
|
|
---
|
|
duration_ms: 1.449248
|
|
type: 'test'
|
|
...
|
|
# Subtest: should close the popover if it is already open
|
|
ok 2 - should close the popover if it is already open
|
|
---
|
|
duration_ms: 0.745105
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - requestMenu
|
|
---
|
|
duration_ms: 2.485781
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleMenuAction
|
|
# Subtest: should call service method and notify update
|
|
ok 1 - should call service method and notify update
|
|
---
|
|
duration_ms: 0.986388
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle error and call showError
|
|
ok 2 - should handle error and call showError
|
|
---
|
|
duration_ms: 0.820665
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - handleMenuAction
|
|
---
|
|
duration_ms: 2.35139
|
|
type: 'suite'
|
|
...
|
|
# Subtest: persistPreferencesFromMenu
|
|
# Subtest: should call service.publish
|
|
ok 1 - should call service.publish
|
|
---
|
|
duration_ms: 0.629531
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reuse in-flight promise
|
|
ok 2 - should reuse in-flight promise
|
|
---
|
|
duration_ms: 0.650353
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - persistPreferencesFromMenu
|
|
---
|
|
duration_ms: 1.553569
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - TagPreferenceMenuController
|
|
---
|
|
duration_ms: 13.448678
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 5
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 35.420897
|
|
|
|
→ Running tests/ui/torrentStatusController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TorrentStatusController throws if accessor is missing
|
|
ok 1 - TorrentStatusController throws if accessor is missing
|
|
---
|
|
duration_ms: 1.845323
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController updates video modal and calls onRemovePoster
|
|
ok 2 - TorrentStatusController updates video modal and calls onRemovePoster
|
|
---
|
|
duration_ms: 0.864013
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController handles missing modal gracefully
|
|
ok 3 - TorrentStatusController handles missing modal gracefully
|
|
---
|
|
duration_ms: 0.39554
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.799472
|
|
|
|
→ Running tests/ui/uploadModal-integration.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Integration
|
|
# Subtest: should detect default R2 connection and show summary when loaded and unlocked
|
|
ok 1 - should detect default R2 connection and show summary when loaded and unlocked
|
|
---
|
|
duration_ms: 369.022598
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle locked state and unlock flow
|
|
ok 2 - should handle locked state and unlock flow
|
|
---
|
|
duration_ms: 101.404824
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - UploadModal Integration
|
|
---
|
|
duration_ms: 12727.904781
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12740.549852
|
|
|
|
→ Running tests/ui/uploadModal-reset.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Reset Logic
|
|
# Subtest: should reset upload state and inputs when resetUploads is called
|
|
ok 1 - should reset upload state and inputs when resetUploads is called
|
|
---
|
|
duration_ms: 59.33492
|
|
type: 'test'
|
|
...
|
|
# Subtest: should guard against zombie callbacks when upload is reset during process
|
|
ok 2 - should guard against zombie callbacks when upload is reset during process
|
|
---
|
|
duration_ms: 22.795241
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call resetUploads when close is called
|
|
ok 3 - should call resetUploads when close is called
|
|
---
|
|
duration_ms: 22.427127
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - UploadModal Reset Logic
|
|
---
|
|
duration_ms: 12568.053768
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 1
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12586.954759
|
|
|
|
→ Running tests/ui/url-health-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: UrlHealthController
|
|
# Subtest: probeUrl returns ok for valid URL
|
|
ok 1 - probeUrl returns ok for valid URL
|
|
---
|
|
duration_ms: 100.795579
|
|
type: 'test'
|
|
...
|
|
# Subtest: probeUrl returns error for 404
|
|
ok 2 - probeUrl returns error for 404
|
|
---
|
|
duration_ms: 21.365301
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleUrlHealthBadge updates badge
|
|
ok 3 - handleUrlHealthBadge updates badge
|
|
---
|
|
duration_ms: 74.93242
|
|
type: 'test'
|
|
...
|
|
# Subtest: getUrlHealthPlaceholderMarkup returns string
|
|
ok 4 - getUrlHealthPlaceholderMarkup returns string
|
|
---
|
|
duration_ms: 9.031095
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - UrlHealthController
|
|
---
|
|
duration_ms: 207.917686
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 216.569382
|
|
|
|
→ Running tests/ui/video-list-view-popular-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView renders sorted popular tag pills
|
|
ok 1 - VideoListView renders sorted popular tag pills
|
|
---
|
|
duration_ms: 293.231274
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView applies tag preference variants to popular tags
|
|
ok 2 - VideoListView applies tag preference variants to popular tags
|
|
---
|
|
duration_ms: 53.917544
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView hides popular tags when no tags are available
|
|
ok 3 - VideoListView hides popular tags when no tags are available
|
|
---
|
|
duration_ms: 35.381128
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView setModerationBlockHandler stores callable
|
|
ok 4 - VideoListView setModerationBlockHandler stores callable
|
|
---
|
|
duration_ms: 20.282644
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 428.708302
|
|
|
|
→ Running tests/ui/video-list-view-sorting.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView sorts cards by original posted timestamp
|
|
ok 1 - VideoListView sorts cards by original posted timestamp
|
|
---
|
|
duration_ms: 133.646408
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 151.83328
|
|
|
|
→ Running tests/unit/app_guard_logic.test.mjs
|
|
TAP version 13
|
|
# Subtest: Application.resetTorrentStats logic
|
|
# Subtest: does not throw when videoModal is null
|
|
ok 1 - does not throw when videoModal is null
|
|
---
|
|
duration_ms: 0.889552
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal is undefined
|
|
ok 2 - does not throw when videoModal is undefined
|
|
---
|
|
duration_ms: 1.362527
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal lacks resetStats
|
|
ok 3 - does not throw when videoModal lacks resetStats
|
|
---
|
|
duration_ms: 0.223793
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls resetStats when available
|
|
ok 4 - calls resetStats when available
|
|
---
|
|
duration_ms: 0.30534
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Application.resetTorrentStats logic
|
|
---
|
|
duration_ms: 4.543465
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.469639
|
|
|
|
→ Running tests/unit/client-count-resilience.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient resilience to COUNT timeouts
|
|
ok 1 - NostrClient resilience to COUNT timeouts
|
|
---
|
|
duration_ms: 3408.505115
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3416.184551
|
|
|
|
→ Running tests/unit/comment-avatar.test.mjs
|
|
TAP version 13
|
|
# Subtest: normalizeCommentAvatarKey handles inputs correctly
|
|
ok 1 - normalizeCommentAvatarKey handles inputs correctly
|
|
---
|
|
duration_ms: 1.252563
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCommentAvatarAsset resolves avatars correctly
|
|
ok 2 - resolveCommentAvatarAsset resolves avatars correctly
|
|
---
|
|
duration_ms: 2.352654
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerCommentAvatarFailure registers failures correctly
|
|
ok 3 - registerCommentAvatarFailure registers failures correctly
|
|
---
|
|
duration_ms: 0.426651
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.836989
|
|
|
|
→ Running tests/unit/editModalController.test.mjs
|
|
TAP version 13
|
|
# Subtest: EditModalController
|
|
# Subtest: open()
|
|
# Subtest: should resolve target and open modal if authorized
|
|
ok 1 - should resolve target and open modal if authorized
|
|
---
|
|
duration_ms: 2.731154
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 1.026462
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if user does not own video
|
|
ok 3 - should show error if user does not own video
|
|
---
|
|
duration_ms: 0.530437
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle modal load errors
|
|
ok 4 - should handle modal load errors
|
|
---
|
|
duration_ms: 1.017886
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - open()
|
|
---
|
|
duration_ms: 6.66048
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleSubmit()
|
|
# Subtest: should handle successful submission
|
|
ok 1 - should handle successful submission
|
|
---
|
|
duration_ms: 1.1416
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.548161
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle submission errors
|
|
ok 3 - should handle submission errors
|
|
---
|
|
duration_ms: 1.444811
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - handleSubmit()
|
|
---
|
|
duration_ms: 3.873199
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - EditModalController
|
|
---
|
|
duration_ms: 11.577189
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 3
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 32.243194
|
|
|
|
→ Running tests/unit/embed_player_modal.test.mjs
|
|
TAP version 13
|
|
# Subtest: EmbedPlayerModal interface
|
|
# Subtest: has expected methods
|
|
ok 1 - has expected methods
|
|
---
|
|
duration_ms: 1.157887
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetStats is no-op and does not throw
|
|
ok 2 - resetStats is no-op and does not throw
|
|
---
|
|
duration_ms: 1.552101
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - EmbedPlayerModal interface
|
|
---
|
|
duration_ms: 4.215746
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.198073
|
|
|
|
→ Running tests/unit/embed-accent.test.mjs
|
|
TAP version 13
|
|
# Subtest: embed accent color configuration
|
|
ok 1 - embed accent color configuration
|
|
---
|
|
duration_ms: 1.2803
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.904346
|
|
|
|
→ Running tests/unit/hashChangeHandler.test.mjs
|
|
TAP version 13
|
|
# Subtest: createHashChangeHandler
|
|
# Subtest: loads default view if hash is empty
|
|
ok 1 - loads default view if hash is empty
|
|
---
|
|
duration_ms: 1.211673
|
|
type: 'test'
|
|
...
|
|
# Subtest: redirects legacy view
|
|
ok 2 - redirects legacy view
|
|
---
|
|
duration_ms: 0.265712
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips redundant reload
|
|
ok 3 - skips redundant reload
|
|
---
|
|
duration_ms: 0.262624
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - createHashChangeHandler
|
|
---
|
|
duration_ms: 3.428799
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.990145
|
|
|
|
→ Running tests/unit/notificationController.test.mjs
|
|
TAP version 13
|
|
# Subtest: NotificationController
|
|
# Subtest: should instantiate correctly
|
|
ok 1 - should instantiate correctly
|
|
---
|
|
duration_ms: 2.373419
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should update text content and show container
|
|
ok 2 - showError should update text content and show container
|
|
---
|
|
duration_ms: 1.014005
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should hide container when msg is empty
|
|
ok 3 - showError should hide container when msg is empty
|
|
---
|
|
duration_ms: 1.07226
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateNotificationPortalVisibility should toggle active class on portal
|
|
ok 4 - updateNotificationPortalVisibility should toggle active class on portal
|
|
---
|
|
duration_ms: 0.954561
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSuccess should update text content and show container
|
|
ok 5 - showSuccess should update text content and show container
|
|
---
|
|
duration_ms: 0.770575
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should update text content and show container
|
|
ok 6 - showStatus should update text content and show container
|
|
---
|
|
duration_ms: 0.825398
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should handle spinner option
|
|
ok 7 - showStatus should handle spinner option
|
|
---
|
|
duration_ms: 0.635358
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - NotificationController
|
|
---
|
|
duration_ms: 9.42785
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.920724
|
|
|
|
→ Running tests/unit/searchFilters.test.mjs
|
|
TAP version 13
|
|
# Subtest: parseFilterQuery collects filters and text tokens
|
|
ok 1 - parseFilterQuery collects filters and text tokens
|
|
---
|
|
duration_ms: 3.003944
|
|
type: 'test'
|
|
...
|
|
# Subtest: serializeFiltersToQuery emits filter tokens in order
|
|
ok 2 - serializeFiltersToQuery emits filter tokens in order
|
|
---
|
|
duration_ms: 0.447594
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
ok 3 - video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
---
|
|
duration_ms: 0.757324
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher blocks nsfw when disallowed and requires url
|
|
ok 4 - video search filter matcher blocks nsfw when disallowed and requires url
|
|
---
|
|
duration_ms: 0.240866
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.641584
|
|
|
|
→ Running tests/unit/security-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: Security configuration: Development mode should be disabled in production
|
|
ok 1 - Security configuration: Development mode should be disabled in production
|
|
---
|
|
duration_ms: 1.342321
|
|
type: 'test'
|
|
...
|
|
# Subtest: Security configuration: Verbose diagnostics should be disabled in production
|
|
ok 2 - Security configuration: Verbose diagnostics should be disabled in production
|
|
---
|
|
duration_ms: 0.237175
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.885766
|
|
|
|
→ Running tests/unit/services/moderationDecorator.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationDecorator
|
|
# Subtest: deriveModerationReportType
|
|
# Subtest: should return empty string for null summary
|
|
ok 1 - should return empty string for null summary
|
|
---
|
|
duration_ms: 1.168231
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty types
|
|
ok 2 - should return empty string for empty types
|
|
---
|
|
duration_ms: 0.275257
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the type with highest trusted count
|
|
ok 3 - should return the type with highest trusted count
|
|
---
|
|
duration_ms: 0.219098
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - deriveModerationReportType
|
|
---
|
|
duration_ms: 2.721667
|
|
type: 'suite'
|
|
...
|
|
# Subtest: deriveModerationTrustedCount
|
|
# Subtest: should return trusted count for specific type
|
|
ok 1 - should return trusted count for specific type
|
|
---
|
|
duration_ms: 0.474441
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to totalTrusted if type not found
|
|
ok 2 - should fall back to totalTrusted if type not found
|
|
---
|
|
duration_ms: 0.187207
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - deriveModerationTrustedCount
|
|
---
|
|
duration_ms: 0.869863
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getReporterDisplayName
|
|
# Subtest: should return name from cache if available
|
|
ok 1 - should return name from cache if available
|
|
---
|
|
duration_ms: 0.411822
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return short formatted string if not in cache
|
|
ok 2 - should return short formatted string if not in cache
|
|
---
|
|
duration_ms: 1.561961
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - getReporterDisplayName
|
|
---
|
|
duration_ms: 2.578863
|
|
type: 'suite'
|
|
...
|
|
# Subtest: decorateVideo
|
|
# Subtest: should return the video object if input is invalid
|
|
ok 1 - should return the video object if input is invalid
|
|
---
|
|
duration_ms: 0.631533
|
|
type: 'test'
|
|
...
|
|
# Subtest: should decorate video with basic moderation
|
|
ok 2 - should decorate video with basic moderation
|
|
---
|
|
duration_ms: 0.582932
|
|
type: 'test'
|
|
...
|
|
# Subtest: should flag video as hidden if trusted mute count exceeds threshold
|
|
ok 3 - should flag video as hidden if trusted mute count exceeds threshold
|
|
---
|
|
duration_ms: 0.601795
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - decorateVideo
|
|
---
|
|
duration_ms: 2.085662
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateSettings
|
|
# Subtest: should update moderation settings and affect decoration
|
|
ok 1 - should update moderation settings and affect decoration
|
|
---
|
|
duration_ms: 0.665361
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - updateSettings
|
|
---
|
|
duration_ms: 0.782373
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - ModerationDecorator
|
|
---
|
|
duration_ms: 10.08175
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 6
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 33.219808
|
|
|
|
→ Running tests/unit/services/r2Service.storage-config.test.mjs
|
|
TAP version 13
|
|
[bitvid] [R2] Verifying access for Bucket: 'r2-meta-bucket' in Account: 'acc…23'
|
|
# Subtest: R2Service bucket selection
|
|
# Subtest: uses meta.bucket for ensureBucketExists and multipartUpload
|
|
ok 1 - uses meta.bucket for ensureBucketExists and multipartUpload
|
|
---
|
|
duration_ms: 29.449619
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses configured meta.bucket when verifying public access
|
|
ok 2 - uses configured meta.bucket when verifying public access
|
|
---
|
|
duration_ms: 2.025789
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - R2Service bucket selection
|
|
---
|
|
duration_ms: 32.980916
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 43.03298
|
|
|
|
→ Running tests/utils/cardSourceVisibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: cardSourceVisibility
|
|
# Subtest: updateVideoCardSourceVisibility
|
|
# Subtest: should handle null or undefined input gracefully
|
|
ok 1 - should handle null or undefined input gracefully
|
|
---
|
|
duration_ms: 5.021962
|
|
type: 'test'
|
|
...
|
|
# Subtest: should resolve card from object with .card property
|
|
ok 2 - should resolve card from object with .card property
|
|
---
|
|
duration_ms: 2.409523
|
|
type: 'test'
|
|
...
|
|
# Subtest: should always show card if owner is viewer
|
|
ok 3 - should always show card if owner is viewer
|
|
---
|
|
duration_ms: 1.548707
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is healthy
|
|
ok 4 - should show card if at least one source is healthy
|
|
---
|
|
duration_ms: 1.46814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is checking/pending
|
|
ok 5 - should show card if at least one source is checking/pending
|
|
---
|
|
duration_ms: 1.640373
|
|
type: 'test'
|
|
...
|
|
# Subtest: should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
ok 6 - should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
---
|
|
duration_ms: 1.01674
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recover from hidden state when source becomes healthy
|
|
ok 7 - should recover from hidden state when source becomes healthy
|
|
---
|
|
duration_ms: 0.923975
|
|
type: 'test'
|
|
...
|
|
# Subtest: should check closest .card if element is not .card itself
|
|
ok 8 - should check closest .card if element is not .card itself
|
|
---
|
|
duration_ms: 7.848442
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - updateVideoCardSourceVisibility
|
|
---
|
|
duration_ms: 23.203148
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - cardSourceVisibility
|
|
---
|
|
duration_ms: 24.028739
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 41.985378
|
|
|
|
→ Running tests/utils/domUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: domUtils
|
|
# Subtest: escapeHTML
|
|
# Subtest: should return empty string for null or undefined
|
|
ok 1 - should return empty string for null or undefined
|
|
---
|
|
duration_ms: 1.207588
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the string as is if no special characters are present
|
|
ok 2 - should return the string as is if no special characters are present
|
|
---
|
|
duration_ms: 0.267195
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape special characters
|
|
ok 3 - should escape special characters
|
|
---
|
|
duration_ms: 0.306803
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape multiple occurrences of special characters
|
|
ok 4 - should escape multiple occurrences of special characters
|
|
---
|
|
duration_ms: 0.285032
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle mixed content correctly
|
|
ok 5 - should handle mixed content correctly
|
|
---
|
|
duration_ms: 0.211362
|
|
type: 'test'
|
|
...
|
|
# Subtest: should convert non-string inputs to string and escape
|
|
ok 6 - should convert non-string inputs to string and escape
|
|
---
|
|
duration_ms: 0.161239
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - escapeHTML
|
|
---
|
|
duration_ms: 3.607323
|
|
type: 'suite'
|
|
...
|
|
# Subtest: removeTrackingScripts
|
|
# Subtest: should do nothing if root is null or undefined
|
|
ok 1 - should do nothing if root is null or undefined
|
|
---
|
|
duration_ms: 0.416444
|
|
type: 'test'
|
|
...
|
|
# Subtest: should do nothing if root has no querySelectorAll
|
|
ok 2 - should do nothing if root has no querySelectorAll
|
|
---
|
|
duration_ms: 0.402476
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts matching the tracking pattern
|
|
ok 3 - should remove scripts matching the tracking pattern
|
|
---
|
|
duration_ms: 21.125655
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not remove inline scripts (no src)
|
|
ok 4 - should not remove inline scripts (no src)
|
|
---
|
|
duration_ms: 2.434657
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src ends with tracking.js
|
|
ok 5 - should remove scripts where src ends with tracking.js
|
|
---
|
|
duration_ms: 1.095012
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src contains /tracking.js
|
|
ok 6 - should remove scripts where src contains /tracking.js
|
|
---
|
|
duration_ms: 0.823936
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - removeTrackingScripts
|
|
---
|
|
duration_ms: 27.109208
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - domUtils
|
|
---
|
|
duration_ms: 31.510368
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 50.801938
|
|
|
|
→ Running tests/utils/hex.test.mjs
|
|
TAP version 13
|
|
# Subtest: hex utils
|
|
# Subtest: normalizeHexString
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.903962
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty or whitespace-only strings
|
|
ok 2 - should return empty string for empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.357251
|
|
type: 'test'
|
|
...
|
|
# Subtest: should trim and lowercase valid hex strings
|
|
ok 3 - should trim and lowercase valid hex strings
|
|
---
|
|
duration_ms: 0.181751
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - normalizeHexString
|
|
---
|
|
duration_ms: 2.435622
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aliases
|
|
# Subtest: should export normalizeHexId as an alias
|
|
ok 1 - should export normalizeHexId as an alias
|
|
---
|
|
duration_ms: 0.239593
|
|
type: 'test'
|
|
...
|
|
# Subtest: should export normalizeHexPubkey as an alias
|
|
ok 2 - should export normalizeHexPubkey as an alias
|
|
---
|
|
duration_ms: 0.13684
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - aliases
|
|
---
|
|
duration_ms: 0.695803
|
|
type: 'suite'
|
|
...
|
|
# Subtest: HEX64_REGEX
|
|
# Subtest: should match valid 64-character hex strings
|
|
ok 1 - should match valid 64-character hex strings
|
|
---
|
|
duration_ms: 0.509313
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with incorrect length
|
|
ok 2 - should not match strings with incorrect length
|
|
---
|
|
duration_ms: 0.395945
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with non-hex characters
|
|
ok 3 - should not match strings with non-hex characters
|
|
---
|
|
duration_ms: 0.173425
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match empty strings
|
|
ok 4 - should not match empty strings
|
|
---
|
|
duration_ms: 0.228447
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - HEX64_REGEX
|
|
---
|
|
duration_ms: 1.976831
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeHexHash
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.336902
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for invalid hex
|
|
ok 2 - should return empty string for invalid hex
|
|
---
|
|
duration_ms: 0.12559
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return normalized hex for valid inputs
|
|
ok 3 - should return normalized hex for valid inputs
|
|
---
|
|
duration_ms: 0.134741
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - normalizeHexHash
|
|
---
|
|
duration_ms: 0.889232
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - hex utils
|
|
---
|
|
duration_ms: 7.070524
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 5
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.812818
|
|
|
|
→ Running tests/utils/linkPreviewSettings.test.mjs
|
|
TAP version 13
|
|
# Subtest: linkPreviewSettings
|
|
# Subtest: getLinkPreviewSettings
|
|
# Subtest: returns defaults when storage is empty
|
|
ok 1 - returns defaults when storage is empty
|
|
---
|
|
duration_ms: 2.796799
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns stored settings
|
|
ok 2 - returns stored settings
|
|
---
|
|
duration_ms: 1.11154
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns defaults when storage is invalid
|
|
ok 3 - returns defaults when storage is invalid
|
|
---
|
|
duration_ms: 0.971421
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizes settings from storage
|
|
ok 4 - sanitizes settings from storage
|
|
---
|
|
duration_ms: 0.879797
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getLinkPreviewSettings
|
|
---
|
|
duration_ms: 6.922258
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setLinkPreviewAutoFetch
|
|
# Subtest: updates settings and persists to storage
|
|
ok 1 - updates settings and persists to storage
|
|
---
|
|
duration_ms: 1.111348
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 2 - emits an event on change
|
|
---
|
|
duration_ms: 1.399773
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setLinkPreviewAutoFetch
|
|
---
|
|
duration_ms: 2.839141
|
|
type: 'suite'
|
|
...
|
|
# Subtest: allowLinkPreviewDomain
|
|
# Subtest: adds a domain and persists to storage
|
|
ok 1 - adds a domain and persists to storage
|
|
---
|
|
duration_ms: 0.720638
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles duplicates
|
|
ok 2 - handles duplicates
|
|
---
|
|
duration_ms: 0.606946
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes domains
|
|
ok 3 - normalizes domains
|
|
---
|
|
duration_ms: 0.562412
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 4 - emits an event on change
|
|
---
|
|
duration_ms: 0.707638
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects silent option
|
|
ok 5 - respects silent option
|
|
---
|
|
duration_ms: 0.454299
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - allowLinkPreviewDomain
|
|
---
|
|
duration_ms: 3.608567
|
|
type: 'suite'
|
|
...
|
|
# Subtest: isLinkPreviewDomainAllowed
|
|
# Subtest: returns true for allowed domains
|
|
ok 1 - returns true for allowed domains
|
|
---
|
|
duration_ms: 0.653908
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for disallowed domains
|
|
ok 2 - returns false for disallowed domains
|
|
---
|
|
duration_ms: 0.306067
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles normalization
|
|
ok 3 - handles normalization
|
|
---
|
|
duration_ms: 0.656964
|
|
type: 'test'
|
|
...
|
|
# Subtest: accepts settings object as second argument
|
|
ok 4 - accepts settings object as second argument
|
|
---
|
|
duration_ms: 0.32941
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 4 - isLinkPreviewDomainAllowed
|
|
---
|
|
duration_ms: 2.18166
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeToLinkPreviewSettings
|
|
# Subtest: calls callback on event emission
|
|
ok 1 - calls callback on event emission
|
|
---
|
|
duration_ms: 0.713977
|
|
type: 'test'
|
|
...
|
|
# Subtest: unsubscribes correctly
|
|
ok 2 - unsubscribes correctly
|
|
---
|
|
duration_ms: 0.713653
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - subscribeToLinkPreviewSettings
|
|
---
|
|
duration_ms: 1.57442
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - linkPreviewSettings
|
|
---
|
|
duration_ms: 18.548251
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 6
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 52.928594
|
|
|
|
→ Running tests/utils/lruCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: LRUCache
|
|
# Subtest: should initialize with default options
|
|
ok 1 - should initialize with default options
|
|
---
|
|
duration_ms: 2.716838
|
|
type: 'test'
|
|
...
|
|
# Subtest: should store and retrieve values
|
|
ok 2 - should store and retrieve values
|
|
---
|
|
duration_ms: 0.369782
|
|
type: 'test'
|
|
...
|
|
# Subtest: should evict oldest item when limit is reached
|
|
ok 3 - should evict oldest item when limit is reached
|
|
---
|
|
duration_ms: 0.30843
|
|
type: 'test'
|
|
...
|
|
# Subtest: should refresh recency on access
|
|
ok 4 - should refresh recency on access
|
|
---
|
|
duration_ms: 0.37939
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update value and refresh recency on set
|
|
ok 5 - should update value and refresh recency on set
|
|
---
|
|
duration_ms: 0.76343
|
|
type: 'test'
|
|
...
|
|
# Subtest: should track stats
|
|
ok 6 - should track stats
|
|
---
|
|
duration_ms: 0.453224
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 7 - should clear cache
|
|
---
|
|
duration_ms: 0.214459
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - LRUCache
|
|
---
|
|
duration_ms: 6.956508
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.811435
|
|
|
|
→ Running tests/utils/profileMedia.test.mjs
|
|
TAP version 13
|
|
# Subtest: sanitizeProfileMediaUrl handles non-string inputs
|
|
ok 1 - sanitizeProfileMediaUrl handles non-string inputs
|
|
---
|
|
duration_ms: 1.645432
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
ok 2 - sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.348239
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
ok 3 - sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
---
|
|
duration_ms: 0.861511
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows data:image/ URLs
|
|
ok 4 - sanitizeProfileMediaUrl allows data:image/ URLs
|
|
---
|
|
duration_ms: 0.184944
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows blob: URLs
|
|
ok 5 - sanitizeProfileMediaUrl allows blob: URLs
|
|
---
|
|
duration_ms: 0.282966
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects specific placeholder images
|
|
ok 6 - sanitizeProfileMediaUrl rejects specific placeholder images
|
|
---
|
|
duration_ms: 0.217379
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
ok 7 - sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
---
|
|
duration_ms: 0.42247
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
ok 8 - sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
---
|
|
duration_ms: 0.186053
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows relative paths
|
|
ok 9 - sanitizeProfileMediaUrl allows relative paths
|
|
---
|
|
duration_ms: 0.600866
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
ok 10 - sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
---
|
|
duration_ms: 1.046002
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
ok 11 - sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
---
|
|
duration_ms: 0.303909
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects unsupported patterns
|
|
ok 12 - sanitizeProfileMediaUrl rejects unsupported patterns
|
|
---
|
|
duration_ms: 0.185617
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.526803
|
|
|
|
→ Running tests/utils/video-deduper.test.mjs
|
|
TAP version 13
|
|
# Subtest: dedupeToNewestByRoot replaces entries with missing timestamps
|
|
ok 1 - dedupeToNewestByRoot replaces entries with missing timestamps
|
|
---
|
|
duration_ms: 1.432999
|
|
type: 'test'
|
|
...
|
|
# Subtest: dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
ok 2 - dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
---
|
|
duration_ms: 0.259814
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.44261
|
|
|
|
→ Running tests/utils/video-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectVideoTags dedupes across metadata sources and respects casing
|
|
ok 1 - collectVideoTags dedupes across metadata sources and respects casing
|
|
---
|
|
duration_ms: 16.378958
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
ok 2 - collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
---
|
|
duration_ms: 0.299715
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags handles malformed inputs safely
|
|
ok 3 - collectVideoTags handles malformed inputs safely
|
|
---
|
|
duration_ms: 0.244463
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.853538
|
|
|
|
→ Running tests/utils/videoPointer.test.mjs
|
|
TAP version 13
|
|
# Subtest: resolveVideoPointer returns address pointer with dTag
|
|
ok 1 - resolveVideoPointer returns address pointer with dTag
|
|
---
|
|
duration_ms: 2.255727
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns address pointer with videoRootId
|
|
ok 2 - resolveVideoPointer returns address pointer with videoRootId
|
|
---
|
|
duration_ms: 0.369401
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns event pointer with fallbackEventId
|
|
ok 3 - resolveVideoPointer returns event pointer with fallbackEventId
|
|
---
|
|
duration_ms: 0.300953
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over videoRootId
|
|
ok 4 - resolveVideoPointer prioritizes dTag over videoRootId
|
|
---
|
|
duration_ms: 0.195656
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
ok 5 - resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
---
|
|
duration_ms: 0.270327
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
ok 6 - resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
---
|
|
duration_ms: 0.193533
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer includes relay in pointer
|
|
ok 7 - resolveVideoPointer includes relay in pointer
|
|
---
|
|
duration_ms: 0.257446
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer normalizes inputs
|
|
ok 8 - resolveVideoPointer normalizes inputs
|
|
---
|
|
duration_ms: 0.22129
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer uses default kind when kind is missing or invalid
|
|
ok 9 - resolveVideoPointer uses default kind when kind is missing or invalid
|
|
---
|
|
duration_ms: 0.584458
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns null for invalid inputs
|
|
ok 10 - resolveVideoPointer returns null for invalid inputs
|
|
---
|
|
duration_ms: 0.587155
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.640553
|
|
|
|
→ Running tests/utils/videoTimestamps.test.mjs
|
|
TAP version 13
|
|
# Subtest: getVideoRootIdentifier
|
|
# Subtest: returns empty string for invalid inputs
|
|
ok 1 - returns empty string for invalid inputs
|
|
---
|
|
duration_ms: 2.014463
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns videoRootId when present
|
|
ok 2 - returns videoRootId when present
|
|
---
|
|
duration_ms: 0.198347
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is missing
|
|
ok 3 - returns id when videoRootId is missing
|
|
---
|
|
duration_ms: 0.318342
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is not a string
|
|
ok 4 - returns id when videoRootId is not a string
|
|
---
|
|
duration_ms: 0.171948
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getVideoRootIdentifier
|
|
---
|
|
duration_ms: 4.431556
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyRootTimestampToVideosMap
|
|
# Subtest: returns early if videosMap is not a Map
|
|
ok 1 - returns early if videosMap is not a Map
|
|
---
|
|
duration_ms: 0.277788
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for matching video ID
|
|
ok 2 - updates rootCreatedAt for matching video ID
|
|
---
|
|
duration_ms: 0.185742
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for other videos with same rootId
|
|
ok 3 - updates rootCreatedAt for other videos with same rootId
|
|
---
|
|
duration_ms: 0.32399
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips invalid stored objects in map
|
|
ok 4 - skips invalid stored objects in map
|
|
---
|
|
duration_ms: 0.323882
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyRootTimestampToVideosMap
|
|
---
|
|
duration_ms: 2.575068
|
|
type: 'test'
|
|
...
|
|
# Subtest: syncActiveVideoRootTimestamp
|
|
# Subtest: returns false for invalid timestamp
|
|
ok 1 - returns false for invalid timestamp
|
|
---
|
|
duration_ms: 0.312846
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for invalid activeVideo
|
|
ok 2 - returns false for invalid activeVideo
|
|
---
|
|
duration_ms: 0.1495
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if activeVideo has no root identifier
|
|
ok 3 - returns false if activeVideo has no root identifier
|
|
---
|
|
duration_ms: 0.112472
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if rootId mismatch
|
|
ok 4 - returns false if rootId mismatch
|
|
---
|
|
duration_ms: 0.152493
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if timestamp already matches
|
|
ok 5 - returns false if timestamp already matches
|
|
---
|
|
duration_ms: 0.112707
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates activeVideo and displayTags
|
|
ok 6 - updates activeVideo and displayTags
|
|
---
|
|
duration_ms: 0.476232
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls videoModal.updateMetadata if provided
|
|
ok 7 - calls videoModal.updateMetadata if provided
|
|
---
|
|
duration_ms: 0.229226
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 3 - syncActiveVideoRootTimestamp
|
|
---
|
|
duration_ms: 2.449948
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.930634
|
|
|
|
→ Running tests/validate-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: validateInstanceConfig succeeds with valid configuration
|
|
ok 1 - validateInstanceConfig succeeds with valid configuration
|
|
---
|
|
duration_ms: 2.098224
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when platform fee is positive without a platform override
|
|
ok 2 - validateInstanceConfig throws when platform fee is positive without a platform override
|
|
---
|
|
duration_ms: 0.955893
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
ok 3 - validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
---
|
|
duration_ms: 0.292534
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
ok 4 - validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
---
|
|
duration_ms: 0.213233
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
ok 5 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
---
|
|
duration_ms: 0.291785
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
ok 6 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
---
|
|
duration_ms: 0.286391
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
ok 7 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
---
|
|
duration_ms: 0.211987
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
ok 8 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
---
|
|
duration_ms: 0.236729
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
ok 9 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
---
|
|
duration_ms: 0.571987
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL is invalid
|
|
ok 10 - validateInstanceConfig throws when optional URL is invalid
|
|
---
|
|
duration_ms: 0.713381
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL has invalid protocol
|
|
ok 11 - validateInstanceConfig throws when optional URL has invalid protocol
|
|
---
|
|
duration_ms: 0.329522
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.729102
|
|
|
|
→ Running tests/video-card-source-visibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
ok 1 - updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
---
|
|
duration_ms: 89.075385
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
ok 2 - VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
---
|
|
duration_ms: 36.502115
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
ok 3 - VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 16.955191
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
ok 4 - VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 16.256456
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 172.06392
|
|
|
|
→ Running tests/video-modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 502.87495
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 37.72102
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 354.744125
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 108.421901
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 97.219484
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 84.574434
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 82.186859
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 90.47765
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 239.989205
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 68.068542
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1683.548383
|
|
|
|
→ Running tests/video-modal-comments.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 321.848249
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 22.825766
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 303.889989
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 105.512801
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 86.549504
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 83.679149
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 81.439088
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 84.796709
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 235.337019
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 68.053404
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section toggles visibility and renders hydrated comments
|
|
ok 11 - VideoModal comment section toggles visibility and renders hydrated comments
|
|
---
|
|
duration_ms: 87.461169
|
|
type: 'test'
|
|
...
|
|
# Subtest: Unauthenticated users can read comments while the composer stays disabled
|
|
ok 12 - Unauthenticated users can read comments while the composer stays disabled
|
|
---
|
|
duration_ms: 77.118227
|
|
type: 'test'
|
|
...
|
|
# Subtest: Guest users render loaded thread snapshots before composer auth enforcement
|
|
ok 13 - Guest users render loaded thread snapshots before composer auth enforcement
|
|
---
|
|
duration_ms: 67.845764
|
|
type: 'test'
|
|
...
|
|
# Subtest: Thread ready snapshots force comments visible before composer gating
|
|
ok 14 - Thread ready snapshots force comments visible before composer gating
|
|
---
|
|
duration_ms: 63.642221
|
|
type: 'test'
|
|
...
|
|
# Subtest: Controller renders synchronous loadThread snapshots immediately
|
|
ok 15 - Controller renders synchronous loadThread snapshots immediately
|
|
---
|
|
duration_ms: 60.057287
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController attaches profiles using normalized pubkeys
|
|
ok 16 - VideoModalCommentController attaches profiles using normalized pubkeys
|
|
---
|
|
duration_ms: 1.671374
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
ok 17 - VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
---
|
|
duration_ms: 0.529972
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment composer updates messaging and dispatches events
|
|
ok 18 - VideoModal comment composer updates messaging and dispatches events
|
|
---
|
|
duration_ms: 61.991403
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController load preserves current video for submissions
|
|
ok 19 - VideoModalCommentController load preserves current video for submissions
|
|
---
|
|
duration_ms: 1.010883
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
ok 20 - VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
---
|
|
duration_ms: 0.52248
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
ok 21 - VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
---
|
|
duration_ms: 0.652948
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
ok 22 - VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
---
|
|
duration_ms: 0.701599
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController publishes comment using event id fallback
|
|
ok 23 - VideoModalCommentController publishes comment using event id fallback
|
|
---
|
|
duration_ms: 0.518585
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController disposes safely during in-flight comment loads
|
|
ok 24 - VideoModalCommentController disposes safely during in-flight comment loads
|
|
---
|
|
duration_ms: 0.580508
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController prompts login when publish requires authentication
|
|
ok 25 - VideoModalCommentController prompts login when publish requires authentication
|
|
---
|
|
duration_ms: 0.656567
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController includes parent metadata when replying
|
|
ok 26 - VideoModalCommentController includes parent metadata when replying
|
|
---
|
|
duration_ms: 0.385317
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
ok 27 - VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
---
|
|
duration_ms: 71.355278
|
|
type: 'test'
|
|
...
|
|
1..27
|
|
# tests 27
|
|
# suites 0
|
|
# pass 27
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1958.536181
|
|
|
|
→ Running tests/video-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoModalController
|
|
# Subtest: ensureVideoModalReady throws if modal is missing
|
|
ok 1 - ensureVideoModalReady throws if modal is missing
|
|
---
|
|
duration_ms: 1.46273
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureVideoModalReady loads modal if needs rehydrate
|
|
ok 2 - ensureVideoModalReady loads modal if needs rehydrate
|
|
---
|
|
duration_ms: 0.54449
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster uses provided video
|
|
ok 3 - showModalWithPoster uses provided video
|
|
---
|
|
duration_ms: 0.76236
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster falls back to current video
|
|
ok 4 - showModalWithPoster falls back to current video
|
|
---
|
|
duration_ms: 0.413891
|
|
type: 'test'
|
|
...
|
|
# Subtest: forceRemoveModalPoster calls modal method
|
|
ok 5 - forceRemoveModalPoster calls modal method
|
|
---
|
|
duration_ms: 0.321309
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - VideoModalController
|
|
---
|
|
duration_ms: 5.308124
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.841129
|
|
|
|
→ Running tests/video-modal-controllers.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 320.189443
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 23.979255
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 311.888881
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 102.408063
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 86.674984
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 85.013453
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 82.843472
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 88.204017
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 236.907437
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 69.702478
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentsController lifecycle manages comment references
|
|
ok 11 - CommentsController lifecycle manages comment references
|
|
---
|
|
duration_ms: 73.180075
|
|
type: 'test'
|
|
...
|
|
# Subtest: ReactionsController delegates reaction updates
|
|
ok 12 - ReactionsController delegates reaction updates
|
|
---
|
|
duration_ms: 67.406397
|
|
type: 'test'
|
|
...
|
|
# Subtest: SimilarContentController toggles section visibility
|
|
ok 13 - SimilarContentController toggles section visibility
|
|
---
|
|
duration_ms: 64.807022
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationController reset clears moderation overlay references
|
|
ok 14 - ModerationController reset clears moderation overlay references
|
|
---
|
|
duration_ms: 63.062105
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal trims tag strip to fit modal width
|
|
ok 15 - VideoModal trims tag strip to fit modal width
|
|
---
|
|
duration_ms: 71.968499
|
|
type: 'test'
|
|
...
|
|
1..15
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1810.922895
|
|
|
|
→ Running tests/video-modal-moderation.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 287.035249
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 25.768152
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 324.659805
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 118.542016
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 97.589011
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 88.510206
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 89.938399
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 108.710938
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 246.597834
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 74.848888
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal blurs and restores playback when moderation overlay toggles
|
|
# Subtest: trusted reports blur the active video
|
|
ok 1 - trusted reports blur the active video
|
|
---
|
|
duration_ms: 10.14025
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute blur state matches moderation context
|
|
ok 2 - trusted mute blur state matches moderation context
|
|
---
|
|
duration_ms: 4.153405
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 11 - VideoModal blurs and restores playback when moderation overlay toggles
|
|
---
|
|
duration_ms: 87.14905
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 13
|
|
# suites 0
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1563.923551
|
|
|
|
→ Running tests/video-modal-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 361.805041
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 27.449571
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 327.075444
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 113.366201
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 92.557538
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 90.291915
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 91.031324
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 92.823748
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 269.205319
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 87.964655
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal renders tag metadata and toggles visibility
|
|
ok 11 - VideoModal renders tag metadata and toggles visibility
|
|
---
|
|
duration_ms: 107.288817
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1676.352879
|
|
|
|
→ Running tests/video-note-payload.test.mjs
|
|
TAP version 13
|
|
# Subtest: normalizes minimal payload with hosted URL
|
|
ok 1 - normalizes minimal payload with hosted URL
|
|
---
|
|
duration_ms: 3.142882
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes mode and boolean flags
|
|
ok 2 - normalizes mode and boolean flags
|
|
---
|
|
duration_ms: 0.455973
|
|
type: 'test'
|
|
...
|
|
# Subtest: augments magnets with ws/xs hints
|
|
ok 3 - augments magnets with ws/xs hints
|
|
---
|
|
duration_ms: 2.116389
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes nip71 metadata collections
|
|
ok 4 - normalizes nip71 metadata collections
|
|
---
|
|
duration_ms: 1.159729
|
|
type: 'test'
|
|
...
|
|
# Subtest: derives legacy duration fallback from imeta variants
|
|
ok 5 - derives legacy duration fallback from imeta variants
|
|
---
|
|
duration_ms: 0.445602
|
|
type: 'test'
|
|
...
|
|
# Subtest: reports validation errors for missing fields
|
|
ok 6 - reports validation errors for missing fields
|
|
---
|
|
duration_ms: 0.216036
|
|
type: 'test'
|
|
...
|
|
# Subtest: rejects insecure hosted URLs
|
|
ok 7 - rejects insecure hosted URLs
|
|
---
|
|
duration_ms: 0.387196
|
|
type: 'test'
|
|
...
|
|
# Subtest: allows publishing with only imeta variants
|
|
ok 8 - allows publishing with only imeta variants
|
|
---
|
|
duration_ms: 0.257762
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.964217
|
|
|
|
→ Running tests/video-schema-and-conversion.test.mjs
|
|
TAP version 13
|
|
# Subtest: video post schema documents nsfw and kids flags
|
|
ok 1 - video post schema documents nsfw and kids flags
|
|
---
|
|
duration_ms: 1.424396
|
|
type: 'test'
|
|
...
|
|
# Subtest: convertEventToVideo normalizes nsfw and kids booleans
|
|
ok 2 - convertEventToVideo normalizes nsfw and kids booleans
|
|
---
|
|
duration_ms: 1.048706
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.475363
|
|
|
|
→ Running tests/video-settings-menu-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoSettingsMenuController - requestMenu opens popover
|
|
ok 1 - VideoSettingsMenuController - requestMenu opens popover
|
|
---
|
|
duration_ms: 1.610977
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - closeMenu closes popover
|
|
ok 2 - VideoSettingsMenuController - closeMenu closes popover
|
|
---
|
|
duration_ms: 0.333023
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - requestMenu toggles if open
|
|
ok 3 - VideoSettingsMenuController - requestMenu toggles if open
|
|
---
|
|
duration_ms: 0.338306
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - closeAll closes all popovers
|
|
ok 4 - VideoSettingsMenuController - closeAll closes all popovers
|
|
---
|
|
duration_ms: 0.39607
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.865313
|
|
|
|
→ Running tests/webtorrent-handlers.test.mjs
|
|
TAP version 13
|
|
# Subtest: TorrentClient Handlers
|
|
# Subtest: handleTorrentStream (chrome) should set up video correctly
|
|
ok 1 - handleTorrentStream (chrome) should set up video correctly
|
|
---
|
|
duration_ms: 21.544172
|
|
type: 'test'
|
|
...
|
|
[bitvid] CORS warning detected. Attempting to remove the failing webseed/tracker.
|
|
[bitvid] Cleaned up webseeds => [ 'http://good.com/video.mp4' ]
|
|
[bitvid] Cleaned up trackers => [ 'ws://good.com' ]
|
|
# Subtest: handleTorrentStream (firefox) should set up video correctly with highWaterMark
|
|
ok 2 - handleTorrentStream (firefox) should set up video correctly with highWaterMark
|
|
---
|
|
duration_ms: 21.322296
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleTorrentStream (chrome) should handle CORS warning logic
|
|
ok 3 - handleTorrentStream (chrome) should handle CORS warning logic
|
|
---
|
|
duration_ms: 1.467507
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - TorrentClient Handlers
|
|
---
|
|
duration_ms: 46.468917
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 1
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 61.270452
|
|
|
|
→ Running tests/webtorrent-regression.test.mjs
|
|
TAP version 13
|
|
# Subtest: WebTorrent Regression Tests
|
|
# Subtest: probePeers should report healthy if webseed is present even with 0 peers
|
|
ok 1 - probePeers should report healthy if webseed is present even with 0 peers
|
|
---
|
|
duration_ms: 7.746552
|
|
type: 'test'
|
|
...
|
|
# Subtest: probePeers should report unhealthy if no webseed and 0 peers
|
|
ok 2 - probePeers should report unhealthy if no webseed and 0 peers
|
|
---
|
|
duration_ms: 51.396817
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - WebTorrent Regression Tests
|
|
---
|
|
duration_ms: 61.578047
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 69.316023
|
|
|
|
✔ All unit tests passed
|
|
TAP version 13
|
|
# Subtest: renderChannelVideosFromList decorates videos before storing
|
|
ok 1 - renderChannelVideosFromList decorates videos before storing
|
|
---
|
|
duration_ms: 350.234012
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderChannelVideosFromList applies moderation blur without existing metadata
|
|
ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata
|
|
---
|
|
duration_ms: 66.626133
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
ok 3 - applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
---
|
|
duration_ms: 15.821532
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation override clears channel blur via event wiring
|
|
ok 4 - moderation override clears channel blur via event wiring
|
|
---
|
|
duration_ms: 42.715117
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel header moderation badge reflects blur state and override actions
|
|
ok 5 - channel header moderation badge reflects blur state and override actions
|
|
---
|
|
duration_ms: 57.962342
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel video cards update moderation state in place when summary changes
|
|
ok 6 - channel video cards update moderation state in place when summary changes
|
|
---
|
|
duration_ms: 42.929462
|
|
type: 'test'
|
|
...
|
|
# Subtest: createFeedCoordinator - loadForYouVideos
|
|
# Subtest: loadForYouVideos executes successfully
|
|
ok 1 - loadForYouVideos executes successfully
|
|
---
|
|
duration_ms: 6.198219
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 7 - createFeedCoordinator - loadForYouVideos
|
|
---
|
|
duration_ms: 9.556235
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange defaults to for-you when logged in
|
|
ok 8 - handleHashChange defaults to for-you when logged in
|
|
---
|
|
duration_ms: 174.48226
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange defaults to most-recent-videos when logged out
|
|
ok 9 - handleHashChange defaults to most-recent-videos when logged out
|
|
---
|
|
duration_ms: 15.579232
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange respects explicit view regardless of login state
|
|
ok 10 - handleHashChange respects explicit view regardless of login state
|
|
---
|
|
duration_ms: 14.143491
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
ok 11 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
---
|
|
duration_ms: 148.065341
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
ok 12 - hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
---
|
|
duration_ms: 20.369456
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn returns false when no user pubkey is set
|
|
ok 13 - isUserLoggedIn returns false when no user pubkey is set
|
|
---
|
|
duration_ms: 3.343329
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn treats extension logins as authenticated
|
|
ok 14 - isUserLoggedIn treats extension logins as authenticated
|
|
---
|
|
duration_ms: 0.664438
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn guards against mismatched nostrClient state
|
|
ok 15 - isUserLoggedIn guards against mismatched nostrClient state
|
|
---
|
|
duration_ms: 0.55453
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn ignores anonymous session actor mismatches
|
|
ok 16 - isUserLoggedIn ignores anonymous session actor mismatches
|
|
---
|
|
duration_ms: 0.524823
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn rejects mismatched managed session actors
|
|
ok 17 - isUserLoggedIn rejects mismatched managed session actors
|
|
---
|
|
duration_ms: 0.574503
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationOverride decorates stored and current videos then refreshes UI
|
|
ok 18 - handleModerationOverride decorates stored and current videos then refreshes UI
|
|
---
|
|
duration_ms: 8.622695
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationOverride resumes deferred playback
|
|
ok 19 - handleModerationOverride resumes deferred playback
|
|
---
|
|
duration_ms: 1.083871
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
ok 20 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
---
|
|
duration_ms: 3.864502
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock returns false when viewer is logged out
|
|
ok 21 - handleModerationBlock returns false when viewer is logged out
|
|
---
|
|
duration_ms: 0.826885
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
ok 22 - handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
---
|
|
duration_ms: 5.867288
|
|
type: 'test'
|
|
...
|
|
# Subtest: orders similar videos by shared tags then timestamp
|
|
ok 23 - orders similar videos by shared tags then timestamp
|
|
---
|
|
duration_ms: 4.536119
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns no matches when the active video lacks tags
|
|
ok 24 - returns no matches when the active video lacks tags
|
|
---
|
|
duration_ms: 0.522575
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips candidates without tag metadata
|
|
ok 25 - skips candidates without tag metadata
|
|
---
|
|
duration_ms: 0.316687
|
|
type: 'test'
|
|
...
|
|
# Subtest: filters NSFW and private videos when NSFW content is disabled
|
|
ok 26 - filters NSFW and private videos when NSFW content is disabled
|
|
---
|
|
duration_ms: 0.349009
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip07SigningAdapter
|
|
# Subtest: uses explicit extension if provided
|
|
ok 1 - uses explicit extension if provided
|
|
---
|
|
duration_ms: 3.140542
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to window.nostr if no extension provided
|
|
ok 2 - falls back to window.nostr if no extension provided
|
|
---
|
|
duration_ms: 0.564442
|
|
type: 'test'
|
|
...
|
|
# Subtest: throws error if no extension available
|
|
ok 3 - throws error if no extension available
|
|
---
|
|
duration_ms: 1.364875
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizes explicit extension over window.nostr
|
|
ok 4 - prioritizes explicit extension over window.nostr
|
|
---
|
|
duration_ms: 0.723467
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 27 - createNip07SigningAdapter
|
|
---
|
|
duration_ms: 7.616196
|
|
type: 'suite'
|
|
...
|
|
# Subtest: NIP-04/44 Compliance: Encryption Preference
|
|
# Subtest: createNip46Cipher prefers nip44.v2 when available
|
|
ok 1 - createNip46Cipher prefers nip44.v2 when available
|
|
---
|
|
duration_ms: 27.324436
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Cipher falls back to nip04 if nip44 is missing
|
|
ok 2 - createNip46Cipher falls back to nip04 if nip44 is missing
|
|
---
|
|
duration_ms: 11.491127
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 28 - NIP-04/44 Compliance: Encryption Preference
|
|
---
|
|
duration_ms: 140.848015
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-04/44 Compliance: Decryption Fallback
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
ok 1 - decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
---
|
|
duration_ms: 37.149315
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip04 payload
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip04 payload
|
|
---
|
|
duration_ms: 36.082477
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 29 - NIP-04/44 Compliance: Decryption Fallback
|
|
---
|
|
duration_ms: 75.214397
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 Compliance: Retry Logic
|
|
# Subtest: runNip07WithRetry succeeds on first try
|
|
ok 1 - runNip07WithRetry succeeds on first try
|
|
---
|
|
duration_ms: 2.676447
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry retries on timeout error
|
|
ok 2 - runNip07WithRetry retries on timeout error
|
|
---
|
|
duration_ms: 20.803478
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry fails after max retries or if error is not timeout
|
|
ok 3 - runNip07WithRetry fails after max retries or if error is not timeout
|
|
---
|
|
duration_ms: 1.449836
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 30 - NIP-07 Compliance: Retry Logic
|
|
---
|
|
duration_ms: 26.703793
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-65 Compliance: Relay List Loading
|
|
# Subtest: loadRelayList requests Kind 10002
|
|
ok 1 - loadRelayList requests Kind 10002
|
|
---
|
|
duration_ms: 8.321214
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadRelayList parses r tags correctly
|
|
ok 2 - loadRelayList parses r tags correctly
|
|
---
|
|
duration_ms: 0.398801
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 31 - NIP-65 Compliance: Relay List Loading
|
|
---
|
|
duration_ms: 190.253713
|
|
type: 'test'
|
|
...
|
|
# Subtest: Video Note Compliance (Kind 30078 & NIP-71)
|
|
# Subtest: prepareVideoPublishPayload creates Kind 30078 event
|
|
ok 1 - prepareVideoPublishPayload creates Kind 30078 event
|
|
---
|
|
duration_ms: 3.753698
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
ok 2 - prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
---
|
|
duration_ms: 1.391866
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 32 - Video Note Compliance (Kind 30078 & NIP-71)
|
|
---
|
|
duration_ms: 61.242396
|
|
type: 'test'
|
|
...
|
|
# Subtest: js/designSystem/dynamicStyles.js
|
|
# Subtest: registerScope
|
|
# Subtest: should register a scope and return a string ID
|
|
ok 1 - should register a scope and return a string ID
|
|
---
|
|
duration_ms: 131.748474
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a style element or use adoptedStyleSheets
|
|
ok 2 - should create a style element or use adoptedStyleSheets
|
|
---
|
|
duration_ms: 15.115636
|
|
type: 'test'
|
|
...
|
|
# Subtest: should insert rules with the correct selector
|
|
ok 3 - should insert rules with the correct selector
|
|
---
|
|
duration_ms: 10.235861
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle "&" in selectors
|
|
ok 4 - should handle "&" in selectors
|
|
---
|
|
duration_ms: 9.943656
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - registerScope
|
|
---
|
|
duration_ms: 168.634587
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setVariables
|
|
# Subtest: should update CSS variables on the scope
|
|
ok 1 - should update CSS variables on the scope
|
|
---
|
|
duration_ms: 11.475109
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle removing variables
|
|
ok 2 - should handle removing variables
|
|
---
|
|
duration_ms: 11.315537
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setVariables
|
|
---
|
|
duration_ms: 23.07625
|
|
type: 'suite'
|
|
...
|
|
# Subtest: releaseScope
|
|
# Subtest: should remove rules and clean up
|
|
ok 1 - should remove rules and clean up
|
|
---
|
|
duration_ms: 9.755405
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for non-existent scope
|
|
ok 2 - should return false for non-existent scope
|
|
---
|
|
duration_ms: 17.440161
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - releaseScope
|
|
---
|
|
duration_ms: 27.445186
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Isolation
|
|
# Subtest: should manage scopes independently for different documents
|
|
ok 1 - should manage scopes independently for different documents
|
|
---
|
|
duration_ms: 17.387793
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 4 - Isolation
|
|
---
|
|
duration_ms: 17.533373
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Edge cases
|
|
# Subtest: should handle invalid selectors gracefully
|
|
ok 1 - should handle invalid selectors gracefully
|
|
---
|
|
duration_ms: 9.190086
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing document gracefully
|
|
ok 2 - should handle missing document gracefully
|
|
---
|
|
duration_ms: 6.725556
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fallback to <style> element if CSSStyleSheet is missing
|
|
ok 3 - should fallback to <style> element if CSSStyleSheet is missing
|
|
---
|
|
duration_ms: 15.921252
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 5 - Edge cases
|
|
---
|
|
duration_ms: 32.244697
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 33 - js/designSystem/dynamicStyles.js
|
|
---
|
|
duration_ms: 270.086546
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Documentation Accuracy Verification
|
|
# Subtest: setup
|
|
ok 1 - setup
|
|
---
|
|
duration_ms: 12.772524
|
|
type: 'test'
|
|
...
|
|
# Subtest: should list accepted video file extensions in docs matching the HTML accept attribute
|
|
ok 2 - should list accepted video file extensions in docs matching the HTML accept attribute
|
|
---
|
|
duration_ms: 1.091974
|
|
type: 'test'
|
|
...
|
|
# Subtest: should state Title is required in docs and be required in HTML
|
|
ok 3 - should state Title is required in docs and be required in HTML
|
|
---
|
|
duration_ms: 0.773875
|
|
type: 'test'
|
|
...
|
|
# Subtest: should mention 2GB limit recommendation in docs and HTML
|
|
ok 4 - should mention 2GB limit recommendation in docs and HTML
|
|
---
|
|
duration_ms: 0.672497
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 34 - Documentation Accuracy Verification
|
|
---
|
|
duration_ms: 17.839501
|
|
type: 'suite'
|
|
...
|
|
# Subtest: explore diversity sorter increases tag diversity in the top results
|
|
ok 35 - explore diversity sorter increases tag diversity in the top results
|
|
---
|
|
duration_ms: 3.362298
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore diversity sorter logs why when MMR re-orders similar candidates
|
|
ok 36 - explore diversity sorter logs why when MMR re-orders similar candidates
|
|
---
|
|
duration_ms: 0.764452
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore disinterest filter drops videos with disinterested tags
|
|
ok 37 - explore disinterest filter drops videos with disinterested tags
|
|
---
|
|
duration_ms: 2.597539
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer penalizes disinterest overlap and logs why metadata
|
|
ok 38 - explore scorer penalizes disinterest overlap and logs why metadata
|
|
---
|
|
duration_ms: 2.674225
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer rewards novelty and new tag fraction
|
|
ok 39 - explore scorer rewards novelty and new tag fraction
|
|
---
|
|
duration_ms: 2.991503
|
|
type: 'test'
|
|
...
|
|
# Subtest: kids scorer correctly identifies dominant positive component
|
|
ok 40 - kids scorer correctly identifies dominant positive component
|
|
---
|
|
duration_ms: 3.466556
|
|
type: 'test'
|
|
...
|
|
# Subtest: kids scorer picks educational-boost when dominant
|
|
ok 41 - kids scorer picks educational-boost when dominant
|
|
---
|
|
duration_ms: 0.472791
|
|
type: 'test'
|
|
...
|
|
# Subtest: tag preference stage filters by interests and excludes disinterests
|
|
ok 42 - tag preference stage filters by interests and excludes disinterests
|
|
---
|
|
duration_ms: 3.818065
|
|
type: 'test'
|
|
...
|
|
# Subtest: tag preference stage accepts interests from nip71 hashtags
|
|
ok 43 - tag preference stage accepts interests from nip71 hashtags
|
|
---
|
|
duration_ms: 0.452979
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides videos muted by trusted when threshold met
|
|
ok 44 - moderation stage hides videos muted by trusted when threshold met
|
|
---
|
|
duration_ms: 7.801329
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides videos when trusted reports exceed threshold
|
|
ok 45 - moderation stage hides videos when trusted reports exceed threshold
|
|
---
|
|
duration_ms: 1.480288
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime hide threshold changes
|
|
ok 46 - moderation stage respects runtime hide threshold changes
|
|
---
|
|
duration_ms: 0.96984
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports trusted mute hide resolver functions
|
|
ok 47 - moderation stage supports trusted mute hide resolver functions
|
|
---
|
|
duration_ms: 1.067954
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage bypasses hard hides on home feed
|
|
ok 48 - moderation stage bypasses hard hides on home feed
|
|
---
|
|
duration_ms: 0.735331
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides admin-whitelisted videos once thresholds fire
|
|
ok 49 - moderation stage hides admin-whitelisted videos once thresholds fire
|
|
---
|
|
duration_ms: 0.940316
|
|
type: 'test'
|
|
...
|
|
# Subtest: submitReport emits NIP-56 compliant report tags
|
|
ok 50 - submitReport emits NIP-56 compliant report tags
|
|
---
|
|
duration_ms: 17.293353
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# Subtest: default trust seeds derive from config
|
|
ok 51 - default trust seeds derive from config
|
|
---
|
|
duration_ms: 2.79005
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted mute counts
|
|
ok 52 - trusted seeds contribute to trusted mute counts
|
|
---
|
|
duration_ms: 5.113434
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted report counts
|
|
ok 53 - trusted seeds contribute to trusted report counts
|
|
---
|
|
duration_ms: 4.381148
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seed updates recompute guest report summaries
|
|
ok 54 - trusted seed updates recompute guest report summaries
|
|
---
|
|
duration_ms: 0.933734
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderator seeds populate trusted contacts
|
|
ok 55 - moderator seeds populate trusted contacts
|
|
---
|
|
duration_ms: 0.584752
|
|
type: 'test'
|
|
...
|
|
# Subtest: bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
ok 56 - bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
---
|
|
duration_ms: 96.57167
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute lists from seeds hide authors for anonymous viewers
|
|
ok 57 - trusted mute lists from seeds hide authors for anonymous viewers
|
|
---
|
|
duration_ms: 16.339884
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# [bitvid] [moderationService] moderation threshold crossed
|
|
# Subtest: trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
ok 58 - trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
---
|
|
duration_ms: 7.764584
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount ignores reports from muted or blocked reporters
|
|
ok 59 - trustedReportCount ignores reports from muted or blocked reporters
|
|
---
|
|
duration_ms: 2.76825
|
|
type: 'test'
|
|
...
|
|
# Subtest: blocking and unblocking reporters recomputes trusted summaries
|
|
ok 60 - blocking and unblocking reporters recomputes trusted summaries
|
|
---
|
|
duration_ms: 2.346941
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
ok 61 - trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
---
|
|
duration_ms: 3.776732
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard renders moderation badges and respects viewer override
|
|
ok 62 - VideoCard renders moderation badges and respects viewer override
|
|
---
|
|
duration_ms: 192.749391
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides content when hide metadata is present and override unmasks it
|
|
ok 63 - VideoCard hides content when hide metadata is present and override unmasks it
|
|
---
|
|
duration_ms: 46.727997
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs viewer-muted creators
|
|
ok 64 - VideoCard blurs viewer-muted creators
|
|
---
|
|
duration_ms: 24.478558
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
ok 65 - VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
---
|
|
duration_ms: 31.471526
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard block action restores trusted mute hide state after override
|
|
ok 66 - VideoCard block action restores trusted mute hide state after override
|
|
---
|
|
duration_ms: 58.587334
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyModerationContextDatasets clears blur when overrides are active
|
|
ok 67 - applyModerationContextDatasets clears blur when overrides are active
|
|
---
|
|
duration_ms: 9.42498
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
ok 68 - buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
---
|
|
duration_ms: 0.280525
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNsecAdapter wires signing and cipher capabilities
|
|
ok 69 - createNsecAdapter wires signing and cipher capabilities
|
|
---
|
|
duration_ms: 86.087128
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip07Adapter maps extension methods and permissions
|
|
ok 70 - createNip07Adapter maps extension methods and permissions
|
|
---
|
|
duration_ms: 4.209776
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Adapter wraps the remote signer client
|
|
ok 71 - createNip46Adapter wraps the remote signer client
|
|
---
|
|
duration_ms: 0.92875
|
|
type: 'test'
|
|
...
|
|
# Subtest: CACHE_POLICIES structure
|
|
ok 72 - CACHE_POLICIES structure
|
|
---
|
|
duration_ms: 1.484052
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_POST policy
|
|
ok 73 - VIDEO_POST policy
|
|
---
|
|
duration_ms: 0.265666
|
|
type: 'test'
|
|
...
|
|
# Subtest: WATCH_HISTORY policy
|
|
ok 74 - WATCH_HISTORY policy
|
|
---
|
|
duration_ms: 0.192528
|
|
type: 'test'
|
|
...
|
|
# Subtest: SUBSCRIPTION_LIST policy
|
|
ok 75 - SUBSCRIPTION_LIST policy
|
|
---
|
|
duration_ms: 0.153447
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_COMMENT policy
|
|
ok 76 - VIDEO_COMMENT policy
|
|
---
|
|
duration_ms: 0.190803
|
|
type: 'test'
|
|
...
|
|
# Subtest: NostrClient
|
|
# Subtest: Initialization
|
|
# Subtest: should initialize with default state
|
|
ok 1 - should initialize with default state
|
|
---
|
|
duration_ms: 4.614041
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Initialization
|
|
---
|
|
duration_ms: 5.844868
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchListIncrementally
|
|
# Subtest: should fetch events and deduplicate results
|
|
ok 1 - should fetch events and deduplicate results
|
|
---
|
|
duration_ms: 3.512117
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle incremental updates using lastSeen
|
|
ok 2 - should handle incremental updates using lastSeen
|
|
---
|
|
duration_ms: 1.114028
|
|
type: 'test'
|
|
...
|
|
# Subtest: should override lastSeen with explicit since parameter
|
|
ok 3 - should override lastSeen with explicit since parameter
|
|
---
|
|
duration_ms: 0.907234
|
|
type: 'test'
|
|
...
|
|
# Subtest: should force full fetch if since is 0
|
|
ok 4 - should force full fetch if since is 0
|
|
---
|
|
duration_ms: 0.835186
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - fetchListIncrementally
|
|
---
|
|
duration_ms: 6.744869
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeVideos
|
|
# Subtest: should subscribe to video events and buffer them
|
|
ok 1 - should subscribe to video events and buffer them
|
|
---
|
|
duration_ms: 302.184095
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - subscribeVideos
|
|
---
|
|
duration_ms: 302.524897
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideos
|
|
# Subtest: should delegate to subscribeVideos and return result on eose
|
|
ok 1 - should delegate to subscribeVideos and return result on eose
|
|
---
|
|
duration_ms: 3.101449
|
|
type: 'test'
|
|
...
|
|
# Subtest: should respect since parameter if provided
|
|
ok 2 - should respect since parameter if provided
|
|
---
|
|
duration_ms: 1.840883
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - fetchVideos
|
|
---
|
|
duration_ms: 5.31861
|
|
type: 'suite'
|
|
...
|
|
# Subtest: publishVideo
|
|
# Subtest: should throw if not logged in
|
|
ok 1 - should throw if not logged in
|
|
---
|
|
duration_ms: 2.248637
|
|
type: 'test'
|
|
...
|
|
# Subtest: should sign and publish a valid video
|
|
ok 2 - should sign and publish a valid video
|
|
---
|
|
duration_ms: 4.445981
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - publishVideo
|
|
---
|
|
duration_ms: 6.910231
|
|
type: 'suite'
|
|
...
|
|
# Subtest: editVideo
|
|
# Subtest: should throw if not owner
|
|
ok 1 - should throw if not owner
|
|
---
|
|
duration_ms: 0.967964
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 6 - editVideo
|
|
---
|
|
duration_ms: 1.126447
|
|
type: 'suite'
|
|
...
|
|
# Subtest: revertVideo
|
|
# Subtest: should publish a deletion marker event
|
|
ok 1 - should publish a deletion marker event
|
|
---
|
|
duration_ms: 0.562943
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 7 - revertVideo
|
|
---
|
|
duration_ms: 0.700815
|
|
type: 'suite'
|
|
...
|
|
1..7
|
|
ok 77 - NostrClient
|
|
---
|
|
duration_ms: 330.52548
|
|
type: 'suite'
|
|
...
|
|
# Subtest: publishComment prefers active signer when available
|
|
ok 78 - publishComment prefers active signer when available
|
|
---
|
|
duration_ms: 11.213503
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment rejects when active signer is unavailable
|
|
ok 79 - publishComment rejects when active signer is unavailable
|
|
---
|
|
duration_ms: 0.451102
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment accepts legacy targets with only an event id
|
|
ok 80 - publishComment accepts legacy targets with only an event id
|
|
---
|
|
duration_ms: 1.282159
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment derives root and parent metadata from parent comment tags
|
|
ok 81 - publishComment derives root and parent metadata from parent comment tags
|
|
---
|
|
duration_ms: 1.55076
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches comments even when tag casing and whitespace differ
|
|
ok 82 - listVideoComments matches comments even when tag casing and whitespace differ
|
|
---
|
|
duration_ms: 2.515411
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches uppercase definition addresses without lowering
|
|
ok 83 - listVideoComments matches uppercase definition addresses without lowering
|
|
---
|
|
duration_ms: 0.958282
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment emits only uppercase video event pointer when address and parent are absent
|
|
ok 84 - publishComment emits only uppercase video event pointer when address and parent are absent
|
|
---
|
|
duration_ms: 0.900529
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
ok 85 - listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
---
|
|
duration_ms: 1.254319
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments emits uppercase root filters when only the identifier is known
|
|
ok 86 - listVideoComments emits uppercase root filters when only the identifier is known
|
|
---
|
|
duration_ms: 1.163976
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments supports legacy targets without a definition address
|
|
ok 87 - listVideoComments supports legacy targets without a definition address
|
|
---
|
|
duration_ms: 0.875511
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
ok 88 - subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
---
|
|
duration_ms: 17.007274
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments supports video targets without a definition address
|
|
ok 89 - subscribeVideoComments supports video targets without a definition address
|
|
---
|
|
duration_ms: 1.176938
|
|
type: 'test'
|
|
...
|
|
# Subtest: countDiagnostics
|
|
# Subtest: isVerboseDiagnosticsEnabled
|
|
# Subtest: should return true by default (due to override)
|
|
ok 1 - should return true by default (due to override)
|
|
---
|
|
duration_ms: 1.441141
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
ok 2 - should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
---
|
|
duration_ms: 0.430057
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
ok 3 - should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
---
|
|
duration_ms: 0.383313
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to isVerboseDevMode if window flag is not boolean
|
|
ok 4 - should fall back to isVerboseDevMode if window flag is not boolean
|
|
---
|
|
duration_ms: 0.391295
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - isVerboseDiagnosticsEnabled
|
|
---
|
|
duration_ms: 3.635459
|
|
type: 'suite'
|
|
...
|
|
# Subtest: logRelayCountFailure
|
|
# Subtest: should log warning for new relay URL
|
|
ok 1 - should log warning for new relay URL
|
|
---
|
|
duration_ms: 1.314325
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress 'Failed to connect to relay' errors
|
|
ok 2 - should suppress 'Failed to connect to relay' errors
|
|
---
|
|
duration_ms: 0.417167
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throttle duplicate warnings for the same relay
|
|
ok 3 - should throttle duplicate warnings for the same relay
|
|
---
|
|
duration_ms: 0.3739
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle empty or non-string relay URLs
|
|
ok 4 - should handle empty or non-string relay URLs
|
|
---
|
|
duration_ms: 0.413074
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - logRelayCountFailure
|
|
---
|
|
duration_ms: 2.909318
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Other Loggers
|
|
# Subtest: should log timeout cleanup failure once
|
|
ok 1 - should log timeout cleanup failure once
|
|
---
|
|
duration_ms: 0.489504
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log rebroadcast failure once
|
|
ok 2 - should log rebroadcast failure once
|
|
---
|
|
duration_ms: 0.365244
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log view count failure once
|
|
ok 3 - should log view count failure once
|
|
---
|
|
duration_ms: 0.340934
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - Other Loggers
|
|
---
|
|
duration_ms: 1.5313
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Verbose Mode Disabled
|
|
# Subtest: should not log even for new keys when disabled
|
|
ok 1 - should not log even for new keys when disabled
|
|
---
|
|
duration_ms: 0.522676
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not consume throttle key when disabled
|
|
ok 2 - should not consume throttle key when disabled
|
|
---
|
|
duration_ms: 0.624818
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - Verbose Mode Disabled
|
|
---
|
|
duration_ms: 1.377499
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 90 - countDiagnostics
|
|
---
|
|
duration_ms: 15.479821
|
|
type: 'suite'
|
|
...
|
|
# Subtest: decryptionSchemeCache
|
|
# Subtest: stores and retrieves a scheme
|
|
ok 1 - stores and retrieves a scheme
|
|
---
|
|
duration_ms: 1.876372
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null for unknown pubkey
|
|
ok 2 - returns null for unknown pubkey
|
|
---
|
|
duration_ms: 0.546173
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 3 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.337273
|
|
type: 'test'
|
|
...
|
|
# Subtest: expires entries after TTL (2 hours)
|
|
ok 4 - expires entries after TTL (2 hours)
|
|
---
|
|
duration_ms: 0.391443
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not expire entries before TTL
|
|
ok 5 - does not expire entries before TTL
|
|
---
|
|
duration_ms: 0.427737
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears cache
|
|
ok 6 - clears cache
|
|
---
|
|
duration_ms: 0.349006
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 91 - decryptionSchemeCache
|
|
---
|
|
duration_ms: 5.836831
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Default NostrClient
|
|
# Subtest: should be an instance of NostrClient
|
|
ok 1 - should be an instance of NostrClient
|
|
---
|
|
duration_ms: 1.413076
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be configured with default relays
|
|
ok 2 - should be configured with default relays
|
|
---
|
|
duration_ms: 1.519522
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default read relays
|
|
ok 3 - should be initialized with default read relays
|
|
---
|
|
duration_ms: 0.235099
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default write relays
|
|
ok 4 - should be initialized with default write relays
|
|
---
|
|
duration_ms: 0.257783
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be registered as the default client
|
|
ok 5 - should be registered as the default client
|
|
---
|
|
duration_ms: 0.230238
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 92 - Default NostrClient
|
|
---
|
|
duration_ms: 5.809477
|
|
type: 'suite'
|
|
...
|
|
# Subtest: DM relay duplication is deduped
|
|
ok 93 - DM relay duplication is deduped
|
|
---
|
|
duration_ms: 199.637634
|
|
type: 'test'
|
|
...
|
|
# Subtest: out-of-order DM delivery keeps newest messages first
|
|
ok 94 - out-of-order DM delivery keeps newest messages first
|
|
---
|
|
duration_ms: 98.663738
|
|
type: 'test'
|
|
...
|
|
# Subtest: DM reconnect replays do not duplicate messages or reset seen state
|
|
ok 95 - DM reconnect replays do not duplicate messages or reset seen state
|
|
---
|
|
duration_ms: 178.695583
|
|
type: 'test'
|
|
...
|
|
# Subtest: dmDecryptDiagnostics
|
|
# Subtest: summarizeDmEventForLog
|
|
# Subtest: should return a default object when event is null or undefined
|
|
ok 1 - should return a default object when event is null or undefined
|
|
---
|
|
duration_ms: 2.781965
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return a default object when event is not an object
|
|
ok 2 - should return a default object when event is not an object
|
|
---
|
|
duration_ms: 0.32127
|
|
type: 'test'
|
|
...
|
|
# Subtest: should summarize a valid event correctly
|
|
ok 3 - should summarize a valid event correctly
|
|
---
|
|
duration_ms: 0.249759
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite created_at
|
|
ok 4 - should handle non-finite created_at
|
|
---
|
|
duration_ms: 0.396533
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite kind
|
|
ok 5 - should handle non-finite kind
|
|
---
|
|
duration_ms: 0.3024
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid content
|
|
ok 6 - should handle missing or invalid content
|
|
---
|
|
duration_ms: 0.219634
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid tags
|
|
ok 7 - should handle missing or invalid tags
|
|
---
|
|
duration_ms: 0.270644
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - summarizeDmEventForLog
|
|
---
|
|
duration_ms: 6.367935
|
|
type: 'suite'
|
|
...
|
|
# Subtest: sanitizeDecryptError
|
|
# Subtest: should return null when error is null or undefined
|
|
ok 1 - should return null when error is null or undefined
|
|
---
|
|
duration_ms: 0.352635
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle string errors
|
|
ok 2 - should handle string errors
|
|
---
|
|
duration_ms: 0.263077
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with standard properties
|
|
ok 3 - should handle Error objects with standard properties
|
|
---
|
|
duration_ms: 0.210601
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with missing properties
|
|
ok 4 - should handle Error objects with missing properties
|
|
---
|
|
duration_ms: 0.168198
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with non-string properties
|
|
ok 5 - should handle Error objects with non-string properties
|
|
---
|
|
duration_ms: 0.182361
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - sanitizeDecryptError
|
|
---
|
|
duration_ms: 1.514233
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 96 - dmDecryptDiagnostics
|
|
---
|
|
duration_ms: 8.860031
|
|
type: 'suite'
|
|
...
|
|
# Subtest: dmDecryptWorkerClient
|
|
# Subtest: should support worker environment
|
|
ok 1 - should support worker environment
|
|
---
|
|
duration_ms: 5.778351
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker is unavailable
|
|
ok 2 - should reject if Worker is unavailable
|
|
---
|
|
duration_ms: 3.003716
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if inputs are invalid
|
|
ok 3 - should reject if inputs are invalid
|
|
---
|
|
duration_ms: 2.593276
|
|
type: 'test'
|
|
...
|
|
# Subtest: should successfully decrypt message
|
|
ok 4 - should successfully decrypt message
|
|
---
|
|
duration_ms: 10.402692
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error response
|
|
ok 5 - should handle worker error response
|
|
---
|
|
duration_ms: 5.853558
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error event
|
|
ok 6 - should handle worker error event
|
|
---
|
|
duration_ms: 3.053887
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 7 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 102.566885
|
|
type: 'test'
|
|
...
|
|
# Subtest: should initialize worker lazily and reuse instance
|
|
ok 8 - should initialize worker lazily and reuse instance
|
|
---
|
|
duration_ms: 3.956024
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recreate worker if creation fails
|
|
ok 9 - should recreate worker if creation fails
|
|
---
|
|
duration_ms: 2.036635
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 97 - dmDecryptWorkerClient
|
|
---
|
|
duration_ms: 142.459456
|
|
type: 'suite'
|
|
...
|
|
# Subtest: decryptDM prefers nip44 decryptors when available
|
|
ok 98 - decryptDM prefers nip44 decryptors when available
|
|
---
|
|
duration_ms: 3.657474
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM falls back to nip04 when nip44 fails
|
|
ok 99 - decryptDM falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.51062
|
|
type: 'test'
|
|
...
|
|
# Subtest: dmSignalEvents
|
|
# Subtest: publishDmReadReceipt should succeed
|
|
ok 1 - publishDmReadReceipt should succeed
|
|
---
|
|
duration_ms: 8.948256
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmReadReceipt should fail if session actor
|
|
ok 2 - publishDmReadReceipt should fail if session actor
|
|
---
|
|
duration_ms: 0.839264
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmTypingIndicator should succeed
|
|
ok 3 - publishDmTypingIndicator should succeed
|
|
---
|
|
duration_ms: 6.561344
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail if no signer
|
|
ok 4 - should fail if no signer
|
|
---
|
|
duration_ms: 0.736624
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 100 - dmSignalEvents
|
|
---
|
|
duration_ms: 158.357819
|
|
type: 'suite'
|
|
...
|
|
# Subtest: editVideo preserves existing d tag
|
|
ok 101 - editVideo preserves existing d tag
|
|
---
|
|
duration_ms: 15.496943
|
|
type: 'test'
|
|
...
|
|
# Subtest: editVideo falls back to base event id when d tag missing
|
|
ok 102 - editVideo falls back to base event id when d tag missing
|
|
---
|
|
duration_ms: 2.518977
|
|
type: 'test'
|
|
...
|
|
# Subtest: EventsCacheStore
|
|
# Subtest: persistSnapshot should store events and tombstones
|
|
ok 1 - persistSnapshot should store events and tombstones
|
|
---
|
|
duration_ms: 19.874687
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should only update changed items
|
|
ok 2 - persistSnapshot should only update changed items
|
|
---
|
|
duration_ms: 2.89139
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should delete removed items
|
|
ok 3 - persistSnapshot should delete removed items
|
|
---
|
|
duration_ms: 3.127929
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should respect dirty keys optimization
|
|
ok 4 - persistSnapshot should respect dirty keys optimization
|
|
---
|
|
duration_ms: 2.803893
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 103 - EventsCacheStore
|
|
---
|
|
duration_ms: 30.80497
|
|
type: 'suite'
|
|
...
|
|
# Subtest: EventsMap functionality
|
|
# Subtest: indexes events by author on set
|
|
ok 1 - indexes events by author on set
|
|
---
|
|
duration_ms: 1.434111
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on delete
|
|
ok 2 - updates index on delete
|
|
---
|
|
duration_ms: 0.373624
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on overwrite with different object
|
|
ok 3 - updates index on overwrite with different object
|
|
---
|
|
duration_ms: 0.294959
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears index on clear
|
|
ok 4 - clears index on clear
|
|
---
|
|
duration_ms: 0.205109
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes pubkeys
|
|
ok 5 - normalizes pubkeys
|
|
---
|
|
duration_ms: 0.252324
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-event objects gracefully
|
|
ok 6 - handles non-event objects gracefully
|
|
---
|
|
duration_ms: 0.192874
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 104 - EventsMap functionality
|
|
---
|
|
duration_ms: 4.9626
|
|
type: 'test'
|
|
...
|
|
# Subtest: nostr login + remote signing + publish + watch history integration
|
|
ok 105 - nostr login + remote signing + publish + watch history integration
|
|
---
|
|
duration_ms: 185.509108
|
|
type: 'test'
|
|
...
|
|
# Subtest: maxListenerDiagnostics
|
|
# Subtest: collectCandidateStrings
|
|
# Subtest: should return empty array for null/undefined/falsy
|
|
ok 1 - should return empty array for null/undefined/falsy
|
|
---
|
|
duration_ms: 2.696082
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return array with string for string input
|
|
ok 2 - should return array with string for string input
|
|
---
|
|
duration_ms: 0.574345
|
|
type: 'test'
|
|
...
|
|
# Subtest: should extract relevant fields from object
|
|
ok 3 - should extract relevant fields from object
|
|
---
|
|
duration_ms: 0.577329
|
|
type: 'test'
|
|
...
|
|
# Subtest: should ignore non-string fields in object
|
|
ok 4 - should ignore non-string fields in object
|
|
---
|
|
duration_ms: 0.41315
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - collectCandidateStrings
|
|
---
|
|
duration_ms: 5.416133
|
|
type: 'suite'
|
|
...
|
|
# Subtest: shouldSuppressWarning
|
|
# Subtest: should NOT suppress anything if verbose mode is enabled
|
|
ok 1 - should NOT suppress anything if verbose mode is enabled
|
|
---
|
|
duration_ms: 0.736272
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by code string
|
|
ok 2 - should suppress warning by code string
|
|
---
|
|
duration_ms: 0.312962
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object code property
|
|
ok 3 - should suppress warning by object code property
|
|
---
|
|
duration_ms: 0.52129
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by message snippet
|
|
ok 4 - should suppress warning by message snippet
|
|
---
|
|
duration_ms: 0.307734
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object message property snippet
|
|
ok 5 - should suppress warning by object message property snippet
|
|
---
|
|
duration_ms: 0.354132
|
|
type: 'test'
|
|
...
|
|
# Subtest: should NOT suppress unrelated warnings
|
|
ok 6 - should NOT suppress unrelated warnings
|
|
---
|
|
duration_ms: 0.38258
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle multiple arguments
|
|
ok 7 - should handle multiple arguments
|
|
---
|
|
duration_ms: 0.339538
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - shouldSuppressWarning
|
|
---
|
|
duration_ms: 3.551447
|
|
type: 'suite'
|
|
...
|
|
# Subtest: process.emitWarning patch
|
|
# Subtest: should have patched process.emitWarning
|
|
ok 1 - should have patched process.emitWarning
|
|
---
|
|
duration_ms: 0.274781
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - process.emitWarning patch
|
|
---
|
|
duration_ms: 0.43866
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 106 - maxListenerDiagnostics
|
|
---
|
|
duration_ms: 11.57512
|
|
type: 'suite'
|
|
...
|
|
# Subtest: nip04WorkerClient
|
|
# Subtest: should encrypt message successfully via worker
|
|
ok 1 - should encrypt message successfully via worker
|
|
---
|
|
duration_ms: 13.312936
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker returns error
|
|
ok 2 - should reject when worker returns error
|
|
---
|
|
duration_ms: 4.813728
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker emits error event
|
|
ok 3 - should reject when worker emits error event
|
|
---
|
|
duration_ms: 4.028139
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 4 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 102.952429
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject immediately if inputs are missing
|
|
ok 5 - should reject immediately if inputs are missing
|
|
---
|
|
duration_ms: 2.468304
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker API is unavailable
|
|
ok 6 - should reject if Worker API is unavailable
|
|
---
|
|
duration_ms: 2.013833
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker creation failure
|
|
ok 7 - should handle worker creation failure
|
|
---
|
|
duration_ms: 2.03196
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 107 - nip04WorkerClient
|
|
---
|
|
duration_ms: 135.369964
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Nip07Adapter Race Condition
|
|
# Subtest: should detect capabilities dynamically even if injected late
|
|
ok 1 - should detect capabilities dynamically even if injected late
|
|
---
|
|
duration_ms: 3.252734
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call the injected method even if added late
|
|
ok 2 - should call the injected method even if added late
|
|
---
|
|
duration_ms: 2.529618
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 108 - Nip07Adapter Race Condition
|
|
---
|
|
duration_ms: 7.461951
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Nip46Connector
|
|
# Subtest: createKeyPair
|
|
# Subtest: should generate a new key pair if none provided
|
|
ok 1 - should generate a new key pair if none provided
|
|
---
|
|
duration_ms: 3.568848
|
|
type: 'test'
|
|
...
|
|
# Subtest: should use existing keys if provided
|
|
ok 2 - should use existing keys if provided
|
|
---
|
|
duration_ms: 0.445359
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - createKeyPair
|
|
---
|
|
duration_ms: 5.226086
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareHandshake
|
|
# Subtest: should parse connection string and return details
|
|
ok 1 - should parse connection string and return details
|
|
---
|
|
duration_ms: 1.354174
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - prepareHandshake
|
|
---
|
|
duration_ms: 1.563193
|
|
type: 'suite'
|
|
...
|
|
# Subtest: connect
|
|
# Subtest: should connect directly if remote pubkey is known
|
|
ok 1 - should connect directly if remote pubkey is known
|
|
---
|
|
duration_ms: 2.335878
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - connect
|
|
---
|
|
duration_ms: 2.502431
|
|
type: 'suite'
|
|
...
|
|
# Subtest: reconnectStored
|
|
# Subtest: should throw if no stored session
|
|
ok 1 - should throw if no stored session
|
|
---
|
|
duration_ms: 1.632952
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reconnect using stored session
|
|
ok 2 - should reconnect using stored session
|
|
---
|
|
duration_ms: 0.695846
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - reconnectStored
|
|
---
|
|
duration_ms: 2.55016
|
|
type: 'suite'
|
|
...
|
|
# Subtest: disconnect
|
|
# Subtest: should clear stored session and emit change
|
|
ok 1 - should clear stored session and emit change
|
|
---
|
|
duration_ms: 0.550451
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - disconnect
|
|
---
|
|
duration_ms: 0.747983
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 109 - Nip46Connector
|
|
---
|
|
duration_ms: 13.789567
|
|
type: 'suite'
|
|
...
|
|
# Subtest: registerSigner stores and resolves signer entries
|
|
ok 110 - registerSigner stores and resolves signer entries
|
|
---
|
|
duration_ms: 1.787255
|
|
type: 'test'
|
|
...
|
|
# Subtest: setActiveSigner notifies listeners and resolves by pubkey
|
|
ok 111 - setActiveSigner notifies listeners and resolves by pubkey
|
|
---
|
|
duration_ms: 0.546213
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent lowercases provided MIME types
|
|
ok 112 - mirrorVideoEvent lowercases provided MIME types
|
|
---
|
|
duration_ms: 5.79339
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent lowercases inferred MIME types
|
|
ok 113 - mirrorVideoEvent lowercases inferred MIME types
|
|
---
|
|
duration_ms: 0.707186
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent includes hash tags when provided
|
|
ok 114 - mirrorVideoEvent includes hash tags when provided
|
|
---
|
|
duration_ms: 2.013222
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
ok 115 - publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
---
|
|
duration_ms: 8.077621
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
ok 116 - publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
---
|
|
duration_ms: 0.517679
|
|
type: 'test'
|
|
...
|
|
# Subtest: revertVideo preserves existing d tag
|
|
ok 117 - revertVideo preserves existing d tag
|
|
---
|
|
duration_ms: 9.625665
|
|
type: 'test'
|
|
...
|
|
# Subtest: revertVideo falls back to original event id when d tag missing
|
|
ok 118 - revertVideo falls back to original event id when d tag missing
|
|
---
|
|
duration_ms: 1.421904
|
|
type: 'test'
|
|
...
|
|
# Subtest: SessionActor
|
|
# Subtest: encrypts and decrypts private key
|
|
ok 1 - encrypts and decrypts private key
|
|
---
|
|
duration_ms: 328.458924
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails to decrypt with wrong passphrase
|
|
ok 2 - fails to decrypt with wrong passphrase
|
|
---
|
|
duration_ms: 303.576605
|
|
type: 'test'
|
|
...
|
|
# Subtest: persists and reads session actor
|
|
ok 3 - persists and reads session actor
|
|
---
|
|
duration_ms: 1.676763
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears stored session actor
|
|
ok 4 - clears stored session actor
|
|
---
|
|
duration_ms: 0.28433
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 119 - SessionActor
|
|
---
|
|
duration_ms: 636.556755
|
|
type: 'test'
|
|
...
|
|
# Subtest: js/nostr/sessionActor.js
|
|
# Subtest: Encryption and Decryption Roundtrip
|
|
ok 1 - Encryption and Decryption Roundtrip
|
|
---
|
|
duration_ms: 305.727805
|
|
type: 'test'
|
|
...
|
|
# Subtest: Decryption fails with wrong passphrase
|
|
ok 2 - Decryption fails with wrong passphrase
|
|
---
|
|
duration_ms: 303.484999
|
|
type: 'test'
|
|
...
|
|
# Subtest: Persistence and Retrieval
|
|
ok 3 - Persistence and Retrieval
|
|
---
|
|
duration_ms: 300.756698
|
|
type: 'test'
|
|
...
|
|
# Subtest: Clear Stored Session Actor
|
|
ok 4 - Clear Stored Session Actor
|
|
---
|
|
duration_ms: 0.84364
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 120 - js/nostr/sessionActor.js
|
|
---
|
|
duration_ms: 914.378687
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: processes requests sequentially
|
|
ok 121 - queueSignEvent: processes requests sequentially
|
|
---
|
|
duration_ms: 106.305602
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles timeouts
|
|
ok 122 - queueSignEvent: handles timeouts
|
|
---
|
|
duration_ms: 22.210308
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles permission denied errors
|
|
ok 123 - queueSignEvent: handles permission denied errors
|
|
---
|
|
duration_ms: 0.92339
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles signer disconnected
|
|
ok 124 - queueSignEvent: handles signer disconnected
|
|
---
|
|
duration_ms: 0.591956
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: fails if signer is missing or invalid
|
|
ok 125 - queueSignEvent: fails if signer is missing or invalid
|
|
---
|
|
duration_ms: 0.625485
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: continues queue processing after failure
|
|
ok 126 - queueSignEvent: continues queue processing after failure
|
|
---
|
|
duration_ms: 0.716257
|
|
type: 'test'
|
|
...
|
|
# Subtest: setActiveSigner hydrates extension capabilities from window.nostr
|
|
ok 127 - setActiveSigner hydrates extension capabilities from window.nostr
|
|
---
|
|
duration_ms: 2.531939
|
|
type: 'test'
|
|
...
|
|
# Subtest: SyncMetadataStore
|
|
# Subtest: should load from localStorage on initialization
|
|
ok 1 - should load from localStorage on initialization
|
|
---
|
|
duration_ms: 2.149517
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update last seen and save to localStorage
|
|
ok 2 - should update last seen and save to localStorage
|
|
---
|
|
duration_ms: 0.67814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should only update if timestamp is newer
|
|
ok 3 - should only update if timestamp is newer
|
|
---
|
|
duration_ms: 0.456079
|
|
type: 'test'
|
|
...
|
|
# Subtest: should get per-relay last seen
|
|
ok 4 - should get per-relay last seen
|
|
---
|
|
duration_ms: 1.751132
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing localStorage gracefully
|
|
ok 5 - should handle missing localStorage gracefully
|
|
---
|
|
duration_ms: 0.53041
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 128 - SyncMetadataStore
|
|
---
|
|
duration_ms: 7.505245
|
|
type: 'suite'
|
|
...
|
|
# Subtest: toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
ok 129 - toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
---
|
|
duration_ms: 1.732682
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
ok 130 - toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
---
|
|
duration_ms: 0.673898
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
ok 131 - toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
---
|
|
duration_ms: 0.858863
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
ok 132 - toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
---
|
|
duration_ms: 0.440452
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: normalizeToolkitCandidate validation
|
|
ok 133 - toolkit: normalizeToolkitCandidate validation
|
|
---
|
|
duration_ms: 2.997371
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
ok 134 - toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
---
|
|
duration_ms: 11.434771
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoEventBuffer
|
|
# Subtest: Push and Flush
|
|
ok 1 - Push and Flush
|
|
---
|
|
duration_ms: 4.228774
|
|
type: 'test'
|
|
...
|
|
# Subtest: Latest Wins
|
|
ok 2 - Latest Wins
|
|
---
|
|
duration_ms: 0.521427
|
|
type: 'test'
|
|
...
|
|
# Subtest: Tombstone Handling
|
|
ok 3 - Tombstone Handling
|
|
---
|
|
duration_ms: 0.515109
|
|
type: 'test'
|
|
...
|
|
# Subtest: Cleanup
|
|
ok 4 - Cleanup
|
|
---
|
|
duration_ms: 0.452554
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 135 - VideoEventBuffer
|
|
---
|
|
duration_ms: 7.653289
|
|
type: 'test'
|
|
...
|
|
# Subtest: videoPayloadBuilder
|
|
# Subtest: extractVideoPublishPayload
|
|
# Subtest: extracts videoData and nip71Metadata
|
|
ok 1 - extracts videoData and nip71Metadata
|
|
---
|
|
duration_ms: 2.394599
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles legacyFormData structure
|
|
ok 2 - handles legacyFormData structure
|
|
---
|
|
duration_ms: 0.212422
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags
|
|
ok 3 - normalizes boolean flags
|
|
---
|
|
duration_ms: 0.19611
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags (kids only)
|
|
ok 4 - normalizes boolean flags (kids only)
|
|
---
|
|
duration_ms: 0.235378
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - extractVideoPublishPayload
|
|
---
|
|
duration_ms: 4.412064
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload
|
|
# Subtest: throws if pubkey is missing
|
|
ok 1 - throws if pubkey is missing
|
|
---
|
|
duration_ms: 1.462473
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates a valid event structure
|
|
ok 2 - generates a valid event structure
|
|
---
|
|
duration_ms: 3.247615
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates unique d tag and videoRootId if not provided
|
|
ok 3 - generates unique d tag and videoRootId if not provided
|
|
---
|
|
duration_ms: 0.423282
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses provided seriesIdentifier as d tag
|
|
ok 4 - uses provided seriesIdentifier as d tag
|
|
---
|
|
duration_ms: 0.378271
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolves infoHash from magnet
|
|
ok 5 - resolves infoHash from magnet
|
|
---
|
|
duration_ms: 0.643193
|
|
type: 'test'
|
|
...
|
|
# Subtest: includes NIP-71 tags
|
|
ok 6 - includes NIP-71 tags
|
|
---
|
|
duration_ms: 0.805932
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - prepareVideoPublishPayload
|
|
---
|
|
duration_ms: 7.395182
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 136 - videoPayloadBuilder
|
|
---
|
|
duration_ms: 12.572939
|
|
type: 'suite'
|
|
...
|
|
# pool.list calls: 2
|
|
# pool.get calls: 0
|
|
# Subtest: hydrateVideoHistoryBatch optimizes network calls
|
|
ok 137 - hydrateVideoHistoryBatch optimizes network calls
|
|
---
|
|
duration_ms: 6.431739
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPostedAtBatch uses batch hydration
|
|
ok 138 - resolveVideoPostedAtBatch uses batch hydration
|
|
---
|
|
duration_ms: 0.883102
|
|
type: 'test'
|
|
...
|
|
# Subtest: attachmentService
|
|
# Subtest: prepareAttachmentUpload
|
|
# Subtest: should prepare upload without encryption
|
|
ok 1 - should prepare upload without encryption
|
|
---
|
|
duration_ms: 3.521002
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prepare upload with encryption
|
|
ok 2 - should prepare upload with encryption
|
|
---
|
|
duration_ms: 11.170021
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - prepareAttachmentUpload
|
|
---
|
|
duration_ms: 15.85716
|
|
type: 'suite'
|
|
...
|
|
# Subtest: downloadAttachment
|
|
# Subtest: should download attachment
|
|
ok 1 - should download attachment
|
|
---
|
|
duration_ms: 1.50935
|
|
type: 'test'
|
|
...
|
|
# Subtest: should verify hash
|
|
ok 2 - should verify hash
|
|
---
|
|
duration_ms: 1.104446
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on hash mismatch
|
|
ok 3 - should throw on hash mismatch
|
|
---
|
|
duration_ms: 1.59218
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - downloadAttachment
|
|
---
|
|
duration_ms: 4.518884
|
|
type: 'suite'
|
|
...
|
|
# Subtest: caching
|
|
# Subtest: should cache downloaded attachments
|
|
ok 1 - should cache downloaded attachments
|
|
---
|
|
duration_ms: 1.066022
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 2 - should clear cache
|
|
---
|
|
duration_ms: 1.290132
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - caching
|
|
---
|
|
duration_ms: 2.590658
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 139 - attachmentService
|
|
---
|
|
duration_ms: 25.029905
|
|
type: 'suite'
|
|
...
|
|
# Subtest: authUtils
|
|
# Subtest: normalizeProviderId
|
|
# Subtest: returns trimmed string if valid
|
|
ok 1 - returns trimmed string if valid
|
|
---
|
|
duration_ms: 1.117595
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if empty
|
|
ok 2 - returns 'nip07' fallback if empty
|
|
---
|
|
duration_ms: 0.188997
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if null
|
|
ok 3 - returns 'nip07' fallback if null
|
|
---
|
|
duration_ms: 0.160072
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if undefined
|
|
ok 4 - returns 'nip07' fallback if undefined
|
|
---
|
|
duration_ms: 0.169187
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if not a string
|
|
ok 5 - returns 'nip07' fallback if not a string
|
|
---
|
|
duration_ms: 0.147437
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - normalizeProviderId
|
|
---
|
|
duration_ms: 3.159883
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAuthType
|
|
# Subtest: prioritizes authTypeCandidate
|
|
ok 1 - prioritizes authTypeCandidate
|
|
---
|
|
duration_ms: 0.300871
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.authType
|
|
ok 2 - falls back to providerResult.authType
|
|
---
|
|
duration_ms: 0.161158
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.providerId
|
|
ok 3 - falls back to providerResult.providerId
|
|
---
|
|
duration_ms: 0.208985
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerId
|
|
ok 4 - falls back to providerId
|
|
---
|
|
duration_ms: 0.184423
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' if all else fails
|
|
ok 5 - returns 'nip07' if all else fails
|
|
---
|
|
duration_ms: 0.153421
|
|
type: 'test'
|
|
...
|
|
# Subtest: trims whitespace from results
|
|
ok 6 - trims whitespace from results
|
|
---
|
|
duration_ms: 0.139805
|
|
type: 'test'
|
|
...
|
|
# Subtest: ignores empty strings in candidates
|
|
ok 7 - ignores empty strings in candidates
|
|
---
|
|
duration_ms: 0.157317
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - normalizeAuthType
|
|
---
|
|
duration_ms: 2.252365
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 140 - authUtils
|
|
---
|
|
duration_ms: 6.513857
|
|
type: 'test'
|
|
...
|
|
# Subtest: DiscussionCountService
|
|
# Subtest: initialization sets defaults
|
|
ok 1 - initialization sets defaults
|
|
---
|
|
duration_ms: 1.510282
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if videos array is empty or invalid
|
|
ok 2 - refreshCounts returns early if videos array is empty or invalid
|
|
---
|
|
duration_ms: 0.678504
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if dependencies are missing
|
|
ok 3 - refreshCounts returns early if dependencies are missing
|
|
---
|
|
duration_ms: 1.212671
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles happy path (fetches and updates DOM)
|
|
ok 4 - refreshCounts handles happy path (fetches and updates DOM)
|
|
---
|
|
duration_ms: 41.873284
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts uses cached count if available
|
|
ok 5 - refreshCounts uses cached count if available
|
|
---
|
|
duration_ms: 1.391165
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles API errors gracefully
|
|
ok 6 - refreshCounts handles API errors gracefully
|
|
---
|
|
duration_ms: 3.034169
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles partial results
|
|
ok 7 - refreshCounts handles partial results
|
|
---
|
|
duration_ms: 2.872435
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles unsupported relays (empty perRelay)
|
|
ok 8 - refreshCounts handles unsupported relays (empty perRelay)
|
|
---
|
|
duration_ms: 2.386777
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 141 - DiscussionCountService
|
|
---
|
|
duration_ms: 168.455587
|
|
type: 'suite'
|
|
...
|
|
# Subtest: exploreDataService optimization
|
|
# Subtest: toLightweightVideo extracts necessary fields
|
|
ok 1 - toLightweightVideo extracts necessary fields
|
|
---
|
|
duration_ms: 2.690804
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags works with lightweight object
|
|
ok 2 - collectVideoTags works with lightweight object
|
|
---
|
|
duration_ms: 13.849965
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildVideoAddressPointer works with lightweight object
|
|
ok 3 - buildVideoAddressPointer works with lightweight object
|
|
---
|
|
duration_ms: 0.510899
|
|
type: 'test'
|
|
...
|
|
# Subtest: toLightweightVideo handles invalid input
|
|
ok 4 - toLightweightVideo handles invalid input
|
|
---
|
|
duration_ms: 0.166339
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 142 - exploreDataService optimization
|
|
---
|
|
duration_ms: 19.127898
|
|
type: 'test'
|
|
...
|
|
# Subtest: exploreDataService - buildWatchHistoryTagCounts
|
|
# Subtest: should return empty Map if watchHistoryService is missing
|
|
ok 1 - should return empty Map if watchHistoryService is missing
|
|
---
|
|
duration_ms: 1.598493
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing loadLatest method gracefully
|
|
ok 2 - should handle missing loadLatest method gracefully
|
|
---
|
|
duration_ms: 0.440259
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle loadLatest failure gracefully
|
|
ok 3 - should handle loadLatest failure gracefully
|
|
---
|
|
duration_ms: 9.788222
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return counts from worker on success
|
|
ok 4 - should return counts from worker on success
|
|
---
|
|
duration_ms: 2.280319
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error gracefully
|
|
ok 5 - should handle worker error gracefully
|
|
---
|
|
duration_ms: 1.53884
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 143 - exploreDataService - buildWatchHistoryTagCounts
|
|
---
|
|
duration_ms: 24.120801
|
|
type: 'suite'
|
|
...
|
|
# Subtest: LinkPreviewService
|
|
# Subtest: initializes IndexedDB
|
|
ok 1 - initializes IndexedDB
|
|
---
|
|
duration_ms: 17.520315
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetches and caches preview
|
|
ok 2 - fetches and caches preview
|
|
---
|
|
duration_ms: 27.518197
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null on fetch failure
|
|
ok 3 - returns null on fetch failure
|
|
---
|
|
duration_ms: 2.277903
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects TTL
|
|
ok 4 - respects TTL
|
|
---
|
|
duration_ms: 13.525521
|
|
type: 'test'
|
|
...
|
|
# Subtest: deletePreview removes from cache
|
|
ok 5 - deletePreview removes from cache
|
|
---
|
|
duration_ms: 2.91061
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 144 - LinkPreviewService
|
|
---
|
|
duration_ms: 66.875529
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: handles moderation override
|
|
ok 145 - ModerationActionController: handles moderation override
|
|
---
|
|
duration_ms: 2.457346
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: blocks user and updates state
|
|
ok 146 - ModerationActionController: blocks user and updates state
|
|
---
|
|
duration_ms: 1.290364
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: prevents blocking self
|
|
ok 147 - ModerationActionController: prevents blocking self
|
|
---
|
|
duration_ms: 0.35758
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: requires login to block
|
|
ok 148 - ModerationActionController: requires login to block
|
|
---
|
|
duration_ms: 0.357201
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: handles hide action
|
|
ok 149 - ModerationActionController: handles hide action
|
|
---
|
|
duration_ms: 0.425757
|
|
type: 'test'
|
|
...
|
|
# Subtest: NostrService
|
|
# Subtest: loadVideos
|
|
# Subtest: should load cached videos and start subscription
|
|
ok 1 - should load cached videos and start subscription
|
|
---
|
|
duration_ms: 4.909178
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - loadVideos
|
|
---
|
|
duration_ms: 6.740849
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideosByAuthors
|
|
# Subtest: should fetch videos from relays for specific authors
|
|
ok 1 - should fetch videos from relays for specific authors
|
|
---
|
|
duration_ms: 4.191186
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - fetchVideosByAuthors
|
|
---
|
|
duration_ms: 4.440625
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 150 - NostrService
|
|
---
|
|
duration_ms: 12.401411
|
|
type: 'suite'
|
|
...
|
|
# (node:4523) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
# (Use `node --trace-warnings ...` to show where the warning was created)
|
|
# Subtest: PlaybackService
|
|
# Subtest: Initialization sets defaults and dependencies
|
|
ok 1 - Initialization sets defaults and dependencies
|
|
---
|
|
duration_ms: 2.784286
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoElement respects localStorage and binds listener
|
|
ok 2 - prepareVideoElement respects localStorage and binds listener
|
|
---
|
|
duration_ms: 7.077606
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
ok 3 - registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
---
|
|
duration_ms: 2.533751
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
ok 4 - registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
---
|
|
duration_ms: 1.281283
|
|
type: 'test'
|
|
...
|
|
# Subtest: createSession returns a PlaybackSession
|
|
ok 5 - createSession returns a PlaybackSession
|
|
---
|
|
duration_ms: 0.974636
|
|
type: 'test'
|
|
...
|
|
# Subtest: PlaybackSession Flow
|
|
# Subtest: URL Probe Success starts playback
|
|
ok 1 - URL Probe Success starts playback
|
|
---
|
|
duration_ms: 14.447968
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Probe Failure triggers fallback
|
|
ok 2 - URL Probe Failure triggers fallback
|
|
---
|
|
duration_ms: 4.106503
|
|
type: 'test'
|
|
...
|
|
# Subtest: Watchdog Stall triggers fallback
|
|
ok 3 - Watchdog Stall triggers fallback
|
|
---
|
|
duration_ms: 5.66608
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 6 - PlaybackSession Flow
|
|
---
|
|
duration_ms: 24.949007
|
|
type: 'suite'
|
|
...
|
|
1..6
|
|
ok 151 - PlaybackService
|
|
---
|
|
duration_ms: 207.379143
|
|
type: 'suite'
|
|
...
|
|
# (node:4530) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
# (Use `node --trace-warnings ...` to show where the warning was created)
|
|
# Subtest: PlaybackService Forced Source Logic
|
|
# Subtest: Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
ok 1 - Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
---
|
|
duration_ms: 17.371625
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
ok 2 - Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
---
|
|
duration_ms: 6.712185
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
ok 3 - Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
---
|
|
duration_ms: 1.608541
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
ok 4 - Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
---
|
|
duration_ms: 2.464967
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
ok 5 - Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
---
|
|
duration_ms: 1.896656
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 152 - PlaybackService Forced Source Logic
|
|
---
|
|
duration_ms: 147.278322
|
|
type: 'suite'
|
|
...
|
|
# (node:4537) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
# (Use `node --trace-warnings ...` to show where the warning was created)
|
|
# Subtest: PlaybackService Ordering
|
|
# Subtest: Playback Execution Order
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, succeeds
|
|
ok 1 - urlFirstEnabled=true: Tries URL first, succeeds
|
|
---
|
|
duration_ms: 11.109014
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
ok 2 - urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
---
|
|
duration_ms: 1.628581
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
ok 3 - urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
---
|
|
duration_ms: 0.889081
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
ok 4 - urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
---
|
|
duration_ms: 2.288998
|
|
type: 'test'
|
|
...
|
|
# Subtest: forcedSource=torrent overrides urlFirstEnabled=true
|
|
ok 5 - forcedSource=torrent overrides urlFirstEnabled=true
|
|
---
|
|
duration_ms: 0.917058
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Playback Execution Order
|
|
---
|
|
duration_ms: 17.943095
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 153 - PlaybackService Ordering
|
|
---
|
|
duration_ms: 19.686733
|
|
type: 'suite'
|
|
...
|
|
# Subtest: profileMetadataService
|
|
# Subtest: fetchProfileMetadataBatch
|
|
# Subtest: should return empty map if no pubkeys provided
|
|
ok 1 - should return empty map if no pubkeys provided
|
|
---
|
|
duration_ms: 2.134507
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fetch profiles for provided pubkeys
|
|
ok 2 - should fetch profiles for provided pubkeys
|
|
---
|
|
duration_ms: 3.053662
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle relay failures gracefully
|
|
ok 3 - should handle relay failures gracefully
|
|
---
|
|
duration_ms: 0.749427
|
|
type: 'test'
|
|
...
|
|
# Subtest: should parse profile content correctly
|
|
ok 4 - should parse profile content correctly
|
|
---
|
|
duration_ms: 0.692563
|
|
type: 'test'
|
|
...
|
|
# Subtest: should deduplicate concurrent requests (inflight)
|
|
ok 5 - should deduplicate concurrent requests (inflight)
|
|
---
|
|
duration_ms: 9.089362
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - fetchProfileMetadataBatch
|
|
---
|
|
duration_ms: 17.330134
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchProfileMetadata
|
|
# Subtest: should return null for invalid pubkey
|
|
ok 1 - should return null for invalid pubkey
|
|
---
|
|
duration_ms: 0.628131
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return single profile result
|
|
ok 2 - should return single profile result
|
|
---
|
|
duration_ms: 0.669173
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - fetchProfileMetadata
|
|
---
|
|
duration_ms: 1.50916
|
|
type: 'suite'
|
|
...
|
|
# Subtest: ensureProfileMetadataSubscription
|
|
# Subtest: should return null if nostr pool is missing
|
|
ok 1 - should return null if nostr pool is missing
|
|
---
|
|
duration_ms: 0.691926
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a subscription via relaySubscriptionService
|
|
ok 2 - should create a subscription via relaySubscriptionService
|
|
---
|
|
duration_ms: 14.22565
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle onProfile callback
|
|
ok 3 - should handle onProfile callback
|
|
---
|
|
duration_ms: 1.035205
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - ensureProfileMetadataSubscription
|
|
---
|
|
duration_ms: 16.286286
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 154 - profileMetadataService
|
|
---
|
|
duration_ms: 36.103524
|
|
type: 'suite'
|
|
...
|
|
# Subtest: js/services/r2Service.js
|
|
# Subtest: Default Settings
|
|
ok 1 - Default Settings
|
|
---
|
|
duration_ms: 3.283431
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Valid Input
|
|
ok 2 - handleCloudflareSettingsSubmit - Valid Input
|
|
---
|
|
duration_ms: 0.771703
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
ok 3 - handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
---
|
|
duration_ms: 0.944555
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Missing Fields
|
|
ok 4 - handleCloudflareSettingsSubmit - Missing Fields
|
|
---
|
|
duration_ms: 0.587143
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
ok 5 - ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
---
|
|
duration_ms: 1.001658
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
ok 6 - ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
---
|
|
duration_ms: 0.502705
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Maps meta bucket into settings
|
|
ok 7 - resolveConnection - Maps meta bucket into settings
|
|
---
|
|
duration_ms: 1.112852
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Returns null without StorageService entries
|
|
ok 8 - resolveConnection - Returns null without StorageService entries
|
|
---
|
|
duration_ms: 0.700273
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 155 - js/services/r2Service.js
|
|
---
|
|
duration_ms: 12.208545
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: initializes with default values
|
|
ok 156 - RelayHealthService: initializes with default values
|
|
---
|
|
duration_ms: 1.861039
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: manages telemetry opt-in
|
|
ok 157 - RelayHealthService: manages telemetry opt-in
|
|
---
|
|
duration_ms: 0.322624
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: getRelayUrls fetches from relayManager
|
|
ok 158 - RelayHealthService: getRelayUrls fetches from relayManager
|
|
---
|
|
duration_ms: 1.292306
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: ensureRelayState creates default state
|
|
ok 159 - RelayHealthService: ensureRelayState creates default state
|
|
---
|
|
duration_ms: 0.283366
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay success flow
|
|
ok 160 - RelayHealthService: checkRelay success flow
|
|
---
|
|
duration_ms: 1.049736
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay failure flow
|
|
ok 161 - RelayHealthService: checkRelay failure flow
|
|
---
|
|
duration_ms: 0.623199
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay handles missing nostrClient
|
|
ok 162 - RelayHealthService: checkRelay handles missing nostrClient
|
|
---
|
|
duration_ms: 0.350049
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: refresh checks all relays
|
|
ok 163 - RelayHealthService: refresh checks all relays
|
|
---
|
|
duration_ms: 0.791981
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: emits telemetry if opted in
|
|
ok 164 - RelayHealthService: emits telemetry if opted in
|
|
---
|
|
duration_ms: 0.707264
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
ok 165 - RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
---
|
|
duration_ms: 12.207141
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: failure threshold triggers user warning
|
|
ok 166 - RelayHealthService: failure threshold triggers user warning
|
|
---
|
|
duration_ms: 0.884388
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: user warning respects cooldown
|
|
ok 167 - RelayHealthService: user warning respects cooldown
|
|
---
|
|
duration_ms: 0.400673
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: relay disconnect/error events trigger failure
|
|
ok 168 - RelayHealthService: relay disconnect/error events trigger failure
|
|
---
|
|
duration_ms: 0.336749
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
ok 169 - RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
---
|
|
duration_ms: 0.281914
|
|
type: 'test'
|
|
...
|
|
# Subtest: s3Service
|
|
# Subtest: validateS3Connection
|
|
# Subtest: should validate correct configuration
|
|
ok 1 - should validate correct configuration
|
|
---
|
|
duration_ms: 2.230938
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on missing required fields
|
|
ok 2 - should throw on missing required fields
|
|
---
|
|
duration_ms: 0.844939
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - validateS3Connection
|
|
---
|
|
duration_ms: 4.465871
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getCorsOrigins
|
|
# Subtest: should return current origin
|
|
ok 1 - should return current origin
|
|
---
|
|
duration_ms: 115.468338
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle localhost
|
|
ok 2 - should handle localhost
|
|
---
|
|
duration_ms: 11.419583
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - getCorsOrigins
|
|
---
|
|
duration_ms: 127.24885
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 170 - s3Service
|
|
---
|
|
duration_ms: 132.664686
|
|
type: 'suite'
|
|
...
|
|
# Subtest: S3UploadService
|
|
# Subtest: constructor initializes listeners
|
|
ok 1 - constructor initializes listeners
|
|
---
|
|
duration_ms: 1.685906
|
|
type: 'test'
|
|
...
|
|
# Subtest: Event Emitter Logic
|
|
ok 2 - Event Emitter Logic
|
|
---
|
|
duration_ms: 1.874942
|
|
type: 'test'
|
|
...
|
|
# Subtest: emit handles listener errors safely
|
|
ok 3 - emit handles listener errors safely
|
|
---
|
|
duration_ms: 0.568865
|
|
type: 'test'
|
|
...
|
|
# Subtest: verifyConnection
|
|
ok 4 - verifyConnection
|
|
---
|
|
duration_ms: 0.759037
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareUpload
|
|
ok 5 - prepareUpload
|
|
---
|
|
duration_ms: 0.581691
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadFile
|
|
# Subtest: validates parameters
|
|
ok 1 - validates parameters
|
|
---
|
|
duration_ms: 1.254526
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads successfully
|
|
ok 2 - uploads successfully
|
|
---
|
|
duration_ms: 0.78075
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - uploadFile
|
|
---
|
|
duration_ms: 2.616555
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadVideo
|
|
# Subtest: fails if npub missing
|
|
ok 1 - fails if npub missing
|
|
---
|
|
duration_ms: 0.965784
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if title missing
|
|
ok 2 - fails if title missing
|
|
---
|
|
duration_ms: 0.403417
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if file missing
|
|
ok 3 - fails if file missing
|
|
---
|
|
duration_ms: 0.280392
|
|
type: 'test'
|
|
...
|
|
# Subtest: successful upload flow
|
|
ok 4 - successful upload flow
|
|
---
|
|
duration_ms: 1.081052
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads thumbnail if provided
|
|
ok 5 - uploads thumbnail if provided
|
|
---
|
|
duration_ms: 0.837523
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles validation errors from normalizeVideoNotePayload
|
|
ok 6 - handles validation errors from normalizeVideoNotePayload
|
|
---
|
|
duration_ms: 0.580003
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles upload exception
|
|
ok 7 - handles upload exception
|
|
---
|
|
duration_ms: 0.687732
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 7 - uploadVideo
|
|
---
|
|
duration_ms: 6.175422
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 171 - S3UploadService
|
|
---
|
|
duration_ms: 16.918594
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
# at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
# at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
# at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
# at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
# at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
# at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:150:11)
|
|
# at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
# at Test.run (node:internal/test_runner/test:1047:25)
|
|
# at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
# at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
# at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
# at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
# at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
# at runAsyncRetry (file:///app/js/services/trustBootstrap.js:160:13)
|
|
# [bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl failed
|
|
# at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:164:13)
|
|
# at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
# at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
# at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
# at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
# at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:171:30)
|
|
# at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
# at Test.run (node:internal/test_runner/test:1047:25)
|
|
# at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
# Subtest: trustBootstrap
|
|
# Subtest: should return early if feature is disabled
|
|
ok 1 - should return early if feature is disabled
|
|
---
|
|
duration_ms: 2.910923
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply seeds when accessControl is ready
|
|
ok 2 - should apply seeds when accessControl is ready
|
|
---
|
|
duration_ms: 1.847228
|
|
type: 'test'
|
|
...
|
|
# Subtest: should subscribe to accessControl changes
|
|
ok 3 - should subscribe to accessControl changes
|
|
---
|
|
duration_ms: 0.781159
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle accessControl timeout and apply seeds anyway
|
|
ok 4 - should handle accessControl timeout and apply seeds anyway
|
|
---
|
|
duration_ms: 4.62087
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recompute summaries after applying seeds
|
|
ok 5 - should recompute summaries after applying seeds
|
|
---
|
|
duration_ms: 0.68575
|
|
type: 'test'
|
|
...
|
|
# Subtest: should wait for relays if hydration fails initially
|
|
ok 6 - should wait for relays if hydration fails initially
|
|
---
|
|
duration_ms: 301.451232
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 172 - trustBootstrap
|
|
---
|
|
duration_ms: 314.639599
|
|
type: 'suite'
|
|
...
|
|
# Subtest: AppState
|
|
# Subtest: getters and setters work for simple values
|
|
ok 1 - getters and setters work for simple values
|
|
---
|
|
duration_ms: 2.493872
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppStateKey fires on change
|
|
ok 2 - subscribeToAppStateKey fires on change
|
|
---
|
|
duration_ms: 0.623031
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppState fires on any change
|
|
ok 3 - subscribeToAppState fires on any change
|
|
---
|
|
duration_ms: 0.41206
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState updates state and notifies
|
|
ok 4 - setModalState updates state and notifies
|
|
---
|
|
duration_ms: 0.707106
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState clears everything
|
|
ok 5 - resetAppState clears everything
|
|
---
|
|
duration_ms: 0.316355
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap only accepts Maps or null
|
|
ok 6 - setVideosMap only accepts Maps or null
|
|
---
|
|
duration_ms: 0.390502
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 173 - AppState
|
|
---
|
|
duration_ms: 7.460908
|
|
type: 'suite'
|
|
...
|
|
# Subtest: persistSavedProfiles preserves custom authType strings
|
|
ok 174 - persistSavedProfiles preserves custom authType strings
|
|
---
|
|
duration_ms: 3.137173
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage retains custom provider authType
|
|
ok 175 - loadSavedProfilesFromStorage retains custom provider authType
|
|
---
|
|
duration_ms: 0.668611
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
ok 176 - loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
---
|
|
duration_ms: 0.448746
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage trims stored authType values
|
|
ok 177 - loadSavedProfilesFromStorage trims stored authType values
|
|
---
|
|
duration_ms: 0.272977
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
ok 178 - loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
---
|
|
duration_ms: 0.284584
|
|
type: 'test'
|
|
...
|
|
# Subtest: js/state/cache.js
|
|
# Subtest: Saved Profiles Persistence
|
|
ok 1 - Saved Profiles Persistence
|
|
---
|
|
duration_ms: 3.202559
|
|
type: 'test'
|
|
...
|
|
# Subtest: Active Profile Pubkey
|
|
ok 2 - Active Profile Pubkey
|
|
---
|
|
duration_ms: 0.727082
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Caching
|
|
ok 3 - URL Health Caching
|
|
---
|
|
duration_ms: 0.786058
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Expiration
|
|
ok 4 - URL Health Expiration
|
|
---
|
|
duration_ms: 9.986242
|
|
type: 'test'
|
|
...
|
|
# Subtest: Moderation Settings
|
|
ok 5 - Moderation Settings
|
|
---
|
|
duration_ms: 1.50225
|
|
type: 'test'
|
|
...
|
|
# Subtest: Legacy Moderation Overrides Support
|
|
# Subtest: ignores legacy v1 overrides
|
|
ok 1 - ignores legacy v1 overrides
|
|
---
|
|
duration_ms: 0.825025
|
|
type: 'test'
|
|
...
|
|
# Subtest: loads v2 overrides
|
|
ok 2 - loads v2 overrides
|
|
---
|
|
duration_ms: 0.97508
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - Legacy Moderation Overrides Support
|
|
---
|
|
duration_ms: 2.7815
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 179 - js/state/cache.js
|
|
---
|
|
duration_ms: 21.97444
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [ProfileCache] Expired watchHistory for 1111111111111111111111111111111111111111111111111111111111111111
|
|
# Subtest: ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
ok 180 - ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
---
|
|
duration_ms: 2.270944
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolves storage keys correctly
|
|
ok 181 - ProfileCache: resolves storage keys correctly
|
|
---
|
|
duration_ms: 0.758135
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: persists data to localStorage and memory
|
|
ok 182 - ProfileCache: persists data to localStorage and memory
|
|
---
|
|
duration_ms: 2.175913
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: loads from localStorage if memory miss
|
|
ok 183 - ProfileCache: loads from localStorage if memory miss
|
|
---
|
|
duration_ms: 0.38504
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: handles active profile switching
|
|
ok 184 - ProfileCache: handles active profile switching
|
|
---
|
|
duration_ms: 0.529749
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile normalizes and saves
|
|
ok 185 - ProfileCache: setProfile normalizes and saves
|
|
---
|
|
duration_ms: 1.161226
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: emits events on active profile change
|
|
ok 186 - ProfileCache: emits events on active profile change
|
|
---
|
|
duration_ms: 0.511323
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: respects TTL expiration
|
|
ok 187 - ProfileCache: respects TTL expiration
|
|
---
|
|
duration_ms: 1.692892
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile sanitizes XSS in media URLs
|
|
ok 188 - ProfileCache: setProfile sanitizes XSS in media URLs
|
|
---
|
|
duration_ms: 1.280569
|
|
type: 'test'
|
|
...
|
|
# Subtest: profile settings store clones values and tracks entries
|
|
ok 189 - profile settings store clones values and tracks entries
|
|
---
|
|
duration_ms: 3.622042
|
|
type: 'test'
|
|
...
|
|
# Subtest: profile settings store ignores falsy keys and survives clone failures
|
|
ok 190 - profile settings store ignores falsy keys and survives clone failures
|
|
---
|
|
duration_ms: 0.43411
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns generic message when error missing
|
|
ok 191 - returns generic message when error missing
|
|
---
|
|
duration_ms: 2.727248
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies HTTPS requirement errors
|
|
ok 192 - identifies HTTPS requirement errors
|
|
---
|
|
duration_ms: 0.39482
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies disabled service worker errors
|
|
ok 193 - identifies disabled service worker errors
|
|
---
|
|
duration_ms: 0.379115
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies Brave specific guidance
|
|
ok 194 - identifies Brave specific guidance
|
|
---
|
|
duration_ms: 0.321344
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies blocked script errors
|
|
ok 195 - identifies blocked script errors
|
|
---
|
|
duration_ms: 0.273982
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies controller claim timeout
|
|
ok 196 - identifies controller claim timeout
|
|
---
|
|
duration_ms: 0.273285
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent/ui/styleHelpers
|
|
# Subtest: returns null when no element is provided
|
|
ok 1 - returns null when no element is provided
|
|
---
|
|
duration_ms: 1.298128
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns the original element without mutations
|
|
ok 2 - returns the original element without mutations
|
|
---
|
|
duration_ms: 105.010025
|
|
type: 'test'
|
|
...
|
|
# Subtest: provides an empty, frozen fallback map
|
|
ok 3 - provides an empty, frozen fallback map
|
|
---
|
|
duration_ms: 1.775226
|
|
type: 'test'
|
|
...
|
|
# Subtest: no-ops when removing styles
|
|
ok 4 - no-ops when removing styles
|
|
---
|
|
duration_ms: 10.135923
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 197 - torrent/ui/styleHelpers
|
|
---
|
|
duration_ms: 120.065194
|
|
type: 'suite'
|
|
...
|
|
# Subtest: torrent/ui/toastService
|
|
# Subtest: renders a toast with Tailwind token classes and removes it on dismiss
|
|
ok 1 - renders a toast with Tailwind token classes and removes it on dismiss
|
|
---
|
|
duration_ms: 386.676968
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 198 - torrent/ui/toastService
|
|
---
|
|
duration_ms: 388.569635
|
|
type: 'suite'
|
|
...
|
|
# Subtest: AppChromeController binds upload button when elements hydrate later
|
|
ok 199 - AppChromeController binds upload button when elements hydrate later
|
|
---
|
|
duration_ms: 120.094047
|
|
type: 'test'
|
|
...
|
|
# Subtest: CreatorProfileController
|
|
# Subtest: resolveCreatorProfileFromSources prioritizes cached profile
|
|
ok 1 - resolveCreatorProfileFromSources prioritizes cached profile
|
|
---
|
|
duration_ms: 1.721585
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCreatorProfileFromSources falls back to fetched profile
|
|
ok 2 - resolveCreatorProfileFromSources falls back to fetched profile
|
|
---
|
|
duration_ms: 0.319186
|
|
type: 'test'
|
|
...
|
|
# Subtest: decorateVideoCreatorIdentity modifies video object
|
|
ok 3 - decorateVideoCreatorIdentity modifies video object
|
|
---
|
|
duration_ms: 0.679501
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchModalCreatorProfile fetches profile and updates modal
|
|
ok 4 - fetchModalCreatorProfile fetches profile and updates modal
|
|
---
|
|
duration_ms: 1.341938
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 200 - CreatorProfileController
|
|
---
|
|
duration_ms: 5.988875
|
|
type: 'test'
|
|
...
|
|
# Subtest: EngagementController
|
|
# Subtest: handleRepostAction - should show error if no event ID is available
|
|
ok 1 - handleRepostAction - should show error if no event ID is available
|
|
---
|
|
duration_ms: 3.79583
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should call repostEvent with correct parameters
|
|
ok 2 - handleRepostAction - should call repostEvent with correct parameters
|
|
---
|
|
duration_ms: 0.976036
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should handle failure from repostEvent
|
|
ok 3 - handleRepostAction - should handle failure from repostEvent
|
|
---
|
|
duration_ms: 0.556188
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should use currentVideoPointer when in modal context
|
|
ok 4 - handleRepostAction - should use currentVideoPointer when in modal context
|
|
---
|
|
duration_ms: 0.462771
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should show error if video has no URL
|
|
ok 5 - handleMirrorAction - should show error if video has no URL
|
|
---
|
|
duration_ms: 0.725236
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
ok 6 - handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
---
|
|
duration_ms: 0.71674
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should prevent mirroring private videos
|
|
ok 7 - handleMirrorAction - should prevent mirroring private videos
|
|
---
|
|
duration_ms: 0.616561
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show error if no event ID
|
|
ok 8 - handleEnsurePresenceAction - should show error if no event ID
|
|
---
|
|
duration_ms: 0.656981
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should handle throttled response
|
|
ok 9 - handleEnsurePresenceAction - should handle throttled response
|
|
---
|
|
duration_ms: 0.715144
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
ok 10 - handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
---
|
|
duration_ms: 0.470788
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
ok 201 - EngagementController
|
|
---
|
|
duration_ms: 13.000138
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper triggers scroll hint when content overflows
|
|
ok 202 - HashtagStripHelper triggers scroll hint when content overflows
|
|
---
|
|
duration_ms: 148.70503
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper does not trigger scroll hint when no overflow
|
|
ok 203 - HashtagStripHelper does not trigger scroll hint when no overflow
|
|
---
|
|
duration_ms: 16.096791
|
|
type: 'test'
|
|
...
|
|
# Subtest: opens a popover in the overlay root and positions the panel
|
|
ok 204 - opens a popover in the overlay root and positions the panel
|
|
---
|
|
duration_ms: 523.695901
|
|
type: 'test'
|
|
...
|
|
# Subtest: positions bottom-end panels flush with the trigger's right edge
|
|
ok 205 - positions bottom-end panels flush with the trigger's right edge
|
|
---
|
|
duration_ms: 85.714005
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes on outside pointer events and restores focus
|
|
ok 206 - closes on outside pointer events and restores focus
|
|
---
|
|
duration_ms: 48.001733
|
|
type: 'test'
|
|
...
|
|
# Subtest: supports roving focus, home/end navigation, and typeahead
|
|
ok 207 - supports roving focus, home/end navigation, and typeahead
|
|
---
|
|
duration_ms: 80.447634
|
|
type: 'test'
|
|
...
|
|
# Subtest: escape closes the popover and restores trigger focus
|
|
ok 208 - escape closes the popover and restores trigger focus
|
|
---
|
|
duration_ms: 57.489712
|
|
type: 'test'
|
|
...
|
|
# Subtest: close respects restoreFocus option for contextual menus
|
|
ok 209 - close respects restoreFocus option for contextual menus
|
|
---
|
|
duration_ms: 58.813542
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensures only one popover is open at a time
|
|
ok 210 - ensures only one popover is open at a time
|
|
---
|
|
duration_ms: 122.003728
|
|
type: 'test'
|
|
...
|
|
# Subtest: applies token-based sizing and arrow positioning
|
|
ok 211 - applies token-based sizing and arrow positioning
|
|
---
|
|
duration_ms: 73.364108
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation settings save updates service and disables control
|
|
ok 212 - moderation settings save updates service and disables control
|
|
---
|
|
duration_ms: 210.658952
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation reset restores defaults and clearing inputs uses defaults
|
|
ok 213 - moderation reset restores defaults and clearing inputs uses defaults
|
|
---
|
|
duration_ms: 37.011113
|
|
type: 'test'
|
|
...
|
|
# Subtest: guest fallback uses config moderation defaults
|
|
ok 214 - guest fallback uses config moderation defaults
|
|
---
|
|
duration_ms: 31.542208
|
|
type: 'test'
|
|
...
|
|
# Success: Profile added. Select it when you're ready to switch.
|
|
# Success: That profile is already saved on this device.
|
|
# Subtest: handleAddProfile adds a new profile correctly
|
|
ok 215 - handleAddProfile adds a new profile correctly
|
|
---
|
|
duration_ms: 186.017645
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile prevents duplicates
|
|
ok 216 - handleAddProfile prevents duplicates
|
|
---
|
|
duration_ms: 37.205337
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles missing login result
|
|
ok 217 - handleAddProfile handles missing login result
|
|
---
|
|
duration_ms: 18.491167
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles errors gracefully
|
|
ok 218 - handleAddProfile handles errors gracefully
|
|
---
|
|
duration_ms: 19.567177
|
|
type: 'test'
|
|
...
|
|
# Subtest: ReactionController
|
|
# Subtest: should subscribe to reactions
|
|
ok 1 - should subscribe to reactions
|
|
---
|
|
duration_ms: 3.7752
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle reaction update from subscription
|
|
ok 2 - should handle reaction update from subscription
|
|
---
|
|
duration_ms: 0.809198
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply optimistic update on handleReaction
|
|
ok 3 - should apply optimistic update on handleReaction
|
|
---
|
|
duration_ms: 1.242105
|
|
type: 'test'
|
|
...
|
|
# Subtest: should rollback optimistic update on publish failure
|
|
ok 4 - should rollback optimistic update on publish failure
|
|
---
|
|
duration_ms: 0.68989
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not react if user not logged in
|
|
ok 5 - should not react if user not logged in
|
|
---
|
|
duration_ms: 0.464169
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 219 - ReactionController
|
|
---
|
|
duration_ms: 8.831315
|
|
type: 'suite'
|
|
...
|
|
# Subtest: cached thumbnails reuse existing src without lazy-loading
|
|
ok 220 - cached thumbnails reuse existing src without lazy-loading
|
|
---
|
|
duration_ms: 388.524686
|
|
type: 'test'
|
|
...
|
|
# Subtest: uncached thumbnails use fallback, cache on load, and retain blur state
|
|
ok 221 - uncached thumbnails use fallback, cache on load, and retain blur state
|
|
---
|
|
duration_ms: 56.257043
|
|
type: 'test'
|
|
...
|
|
# Subtest: primary clicks trigger onPlay while modifiers and right clicks do not
|
|
ok 222 - primary clicks trigger onPlay while modifiers and right clicks do not
|
|
---
|
|
duration_ms: 22.196902
|
|
type: 'test'
|
|
...
|
|
# Subtest: author identity fields render supplied values and datasets
|
|
ok 223 - author identity fields render supplied values and datasets
|
|
---
|
|
duration_ms: 16.741072
|
|
type: 'test'
|
|
...
|
|
# Subtest: view counter wiring exposes pointer datasets
|
|
ok 224 - view counter wiring exposes pointer datasets
|
|
---
|
|
duration_ms: 25.486588
|
|
type: 'test'
|
|
...
|
|
# Subtest: SimilarContentController
|
|
# Subtest: extractDTagValue
|
|
# Subtest: should return the 'd' tag value
|
|
ok 1 - should return the 'd' tag value
|
|
---
|
|
duration_ms: 3.540585
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string if no 'd' tag
|
|
ok 2 - should return empty string if no 'd' tag
|
|
---
|
|
duration_ms: 0.93229
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - extractDTagValue
|
|
---
|
|
duration_ms: 7.326776
|
|
type: 'suite'
|
|
...
|
|
# Subtest: computeCandidates
|
|
# Subtest: should return empty array if no active video
|
|
ok 1 - should return empty array if no active video
|
|
---
|
|
duration_ms: 3.055599
|
|
type: 'test'
|
|
...
|
|
# Subtest: should compute similar candidates based on tags
|
|
ok 2 - should compute similar candidates based on tags
|
|
---
|
|
duration_ms: 2.526895
|
|
type: 'test'
|
|
...
|
|
# Subtest: should exclude blocked authors
|
|
ok 3 - should exclude blocked authors
|
|
---
|
|
duration_ms: 0.708492
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prioritize higher shared tag count
|
|
ok 4 - should prioritize higher shared tag count
|
|
---
|
|
duration_ms: 1.240232
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - computeCandidates
|
|
---
|
|
duration_ms: 7.945133
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateModal
|
|
# Subtest: should clear similar content if no active video
|
|
ok 1 - should clear similar content if no active video
|
|
---
|
|
duration_ms: 1.142633
|
|
type: 'test'
|
|
...
|
|
# Subtest: should set similar content if matches found
|
|
ok 2 - should set similar content if matches found
|
|
---
|
|
duration_ms: 0.996783
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear similar content if no matches found
|
|
ok 3 - should clear similar content if no matches found
|
|
---
|
|
duration_ms: 0.609552
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - updateModal
|
|
---
|
|
duration_ms: 3.281583
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 225 - SimilarContentController
|
|
---
|
|
duration_ms: 20.60612
|
|
type: 'suite'
|
|
...
|
|
# [bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: StorageService
|
|
# Subtest: should unlock storage with a valid signer
|
|
ok 1 - should unlock storage with a valid signer
|
|
---
|
|
duration_ms: 35.603001
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# [bitvid] [StorageService] Saved connection r2-test-1
|
|
# Subtest: should save and retrieve an R2 connection
|
|
ok 2 - should save and retrieve an R2 connection
|
|
---
|
|
duration_ms: 7.51317
|
|
type: 'test'
|
|
...
|
|
# [bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# [bitvid] [StorageService] Saved connection s3-generic-1
|
|
# Subtest: should save and retrieve a Generic S3 connection with extra fields
|
|
ok 3 - should save and retrieve a Generic S3 connection with extra fields
|
|
---
|
|
duration_ms: 3.425111
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail to get connection if locked
|
|
ok 4 - should fail to get connection if locked
|
|
---
|
|
duration_ms: 1.195423
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 226 - StorageService
|
|
---
|
|
duration_ms: 207.366706
|
|
type: 'suite'
|
|
...
|
|
# Subtest: renderTagPillStrip builds buttons with labels and icons
|
|
ok 227 - renderTagPillStrip builds buttons with labels and icons
|
|
---
|
|
duration_ms: 128.387432
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip applies preference state styling
|
|
ok 228 - renderTagPillStrip applies preference state styling
|
|
---
|
|
duration_ms: 12.758982
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip wires the activation callback
|
|
ok 229 - renderTagPillStrip wires the activation callback
|
|
---
|
|
duration_ms: 10.48436
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu renders heading and actions
|
|
ok 230 - createTagPreferenceMenu renders heading and actions
|
|
---
|
|
duration_ms: 137.173753
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu disables actions based on membership and login
|
|
ok 231 - createTagPreferenceMenu disables actions based on membership and login
|
|
---
|
|
duration_ms: 16.832837
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu forwards actions to callback
|
|
ok 232 - createTagPreferenceMenu forwards actions to callback
|
|
---
|
|
duration_ms: 14.478815
|
|
type: 'test'
|
|
...
|
|
# Subtest: TagPreferenceMenuController
|
|
# Subtest: ensurePopover
|
|
# Subtest: should create a new popover entry if one does not exist
|
|
ok 1 - should create a new popover entry if one does not exist
|
|
---
|
|
duration_ms: 3.344054
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return existing entry if one exists
|
|
ok 2 - should return existing entry if one exists
|
|
---
|
|
duration_ms: 0.635958
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return null if trigger or tag is missing
|
|
ok 3 - should return null if trigger or tag is missing
|
|
---
|
|
duration_ms: 0.63729
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - ensurePopover
|
|
---
|
|
duration_ms: 6.054862
|
|
type: 'suite'
|
|
...
|
|
# Subtest: requestMenu
|
|
# Subtest: should ensure popover, close others, and open the requested one
|
|
ok 1 - should ensure popover, close others, and open the requested one
|
|
---
|
|
duration_ms: 1.687397
|
|
type: 'test'
|
|
...
|
|
# Subtest: should close the popover if it is already open
|
|
ok 2 - should close the popover if it is already open
|
|
---
|
|
duration_ms: 0.741946
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - requestMenu
|
|
---
|
|
duration_ms: 2.730693
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleMenuAction
|
|
# Subtest: should call service method and notify update
|
|
ok 1 - should call service method and notify update
|
|
---
|
|
duration_ms: 0.926755
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle error and call showError
|
|
ok 2 - should handle error and call showError
|
|
---
|
|
duration_ms: 1.054688
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - handleMenuAction
|
|
---
|
|
duration_ms: 2.212723
|
|
type: 'suite'
|
|
...
|
|
# Subtest: persistPreferencesFromMenu
|
|
# Subtest: should call service.publish
|
|
ok 1 - should call service.publish
|
|
---
|
|
duration_ms: 0.929231
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reuse in-flight promise
|
|
ok 2 - should reuse in-flight promise
|
|
---
|
|
duration_ms: 0.816076
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - persistPreferencesFromMenu
|
|
---
|
|
duration_ms: 1.968681
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 233 - TagPreferenceMenuController
|
|
---
|
|
duration_ms: 14.100494
|
|
type: 'suite'
|
|
...
|
|
# Subtest: TorrentStatusController throws if accessor is missing
|
|
ok 234 - TorrentStatusController throws if accessor is missing
|
|
---
|
|
duration_ms: 1.920427
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController updates video modal and calls onRemovePoster
|
|
ok 235 - TorrentStatusController updates video modal and calls onRemovePoster
|
|
---
|
|
duration_ms: 0.913224
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController handles missing modal gracefully
|
|
ok 236 - TorrentStatusController handles missing modal gracefully
|
|
---
|
|
duration_ms: 0.435359
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal Integration
|
|
# Subtest: should detect default R2 connection and show summary when loaded and unlocked
|
|
ok 1 - should detect default R2 connection and show summary when loaded and unlocked
|
|
---
|
|
duration_ms: 88.374799
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle locked state and unlock flow
|
|
ok 2 - should handle locked state and unlock flow
|
|
---
|
|
duration_ms: 71.035522
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 237 - UploadModal Integration
|
|
---
|
|
duration_ms: 12461.931063
|
|
type: 'suite'
|
|
...
|
|
# Subtest: UploadModal Reset Logic
|
|
# Subtest: should reset upload state and inputs when resetUploads is called
|
|
ok 1 - should reset upload state and inputs when resetUploads is called
|
|
---
|
|
duration_ms: 84.937916
|
|
type: 'test'
|
|
...
|
|
# Subtest: should guard against zombie callbacks when upload is reset during process
|
|
ok 2 - should guard against zombie callbacks when upload is reset during process
|
|
---
|
|
duration_ms: 49.261559
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call resetUploads when close is called
|
|
ok 3 - should call resetUploads when close is called
|
|
---
|
|
duration_ms: 29.758134
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 238 - UploadModal Reset Logic
|
|
---
|
|
duration_ms: 12454.644426
|
|
type: 'suite'
|
|
...
|
|
# Subtest: UrlHealthController
|
|
# Subtest: probeUrl returns ok for valid URL
|
|
ok 1 - probeUrl returns ok for valid URL
|
|
---
|
|
duration_ms: 145.966788
|
|
type: 'test'
|
|
...
|
|
# Subtest: probeUrl returns error for 404
|
|
ok 2 - probeUrl returns error for 404
|
|
---
|
|
duration_ms: 20.968229
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleUrlHealthBadge updates badge
|
|
ok 3 - handleUrlHealthBadge updates badge
|
|
---
|
|
duration_ms: 74.556101
|
|
type: 'test'
|
|
...
|
|
# Subtest: getUrlHealthPlaceholderMarkup returns string
|
|
ok 4 - getUrlHealthPlaceholderMarkup returns string
|
|
---
|
|
duration_ms: 12.433907
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 239 - UrlHealthController
|
|
---
|
|
duration_ms: 256.475682
|
|
type: 'suite'
|
|
...
|
|
# Subtest: VideoListView renders sorted popular tag pills
|
|
ok 240 - VideoListView renders sorted popular tag pills
|
|
---
|
|
duration_ms: 212.956198
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView applies tag preference variants to popular tags
|
|
ok 241 - VideoListView applies tag preference variants to popular tags
|
|
---
|
|
duration_ms: 31.804097
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView hides popular tags when no tags are available
|
|
ok 242 - VideoListView hides popular tags when no tags are available
|
|
---
|
|
duration_ms: 16.99555
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView setModerationBlockHandler stores callable
|
|
ok 243 - VideoListView setModerationBlockHandler stores callable
|
|
---
|
|
duration_ms: 7.56809
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView sorts cards by original posted timestamp
|
|
ok 244 - VideoListView sorts cards by original posted timestamp
|
|
---
|
|
duration_ms: 191.237388
|
|
type: 'test'
|
|
...
|
|
# Subtest: Application.resetTorrentStats logic
|
|
# Subtest: does not throw when videoModal is null
|
|
ok 1 - does not throw when videoModal is null
|
|
---
|
|
duration_ms: 1.177807
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal is undefined
|
|
ok 2 - does not throw when videoModal is undefined
|
|
---
|
|
duration_ms: 0.220906
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal lacks resetStats
|
|
ok 3 - does not throw when videoModal lacks resetStats
|
|
---
|
|
duration_ms: 0.24469
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls resetStats when available
|
|
ok 4 - calls resetStats when available
|
|
---
|
|
duration_ms: 0.285872
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 245 - Application.resetTorrentStats logic
|
|
---
|
|
duration_ms: 3.751519
|
|
type: 'test'
|
|
...
|
|
# Subtest: NostrClient resilience to COUNT timeouts
|
|
ok 246 - NostrClient resilience to COUNT timeouts
|
|
---
|
|
duration_ms: 3410.213123
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeCommentAvatarKey handles inputs correctly
|
|
ok 247 - normalizeCommentAvatarKey handles inputs correctly
|
|
---
|
|
duration_ms: 1.879695
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCommentAvatarAsset resolves avatars correctly
|
|
ok 248 - resolveCommentAvatarAsset resolves avatars correctly
|
|
---
|
|
duration_ms: 2.549098
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerCommentAvatarFailure registers failures correctly
|
|
ok 249 - registerCommentAvatarFailure registers failures correctly
|
|
---
|
|
duration_ms: 0.807453
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModalController
|
|
# Subtest: open()
|
|
# Subtest: should resolve target and open modal if authorized
|
|
ok 1 - should resolve target and open modal if authorized
|
|
---
|
|
duration_ms: 2.860263
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.775133
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if user does not own video
|
|
ok 3 - should show error if user does not own video
|
|
---
|
|
duration_ms: 0.611814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle modal load errors
|
|
ok 4 - should handle modal load errors
|
|
---
|
|
duration_ms: 0.86793
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - open()
|
|
---
|
|
duration_ms: 6.441332
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleSubmit()
|
|
# Subtest: should handle successful submission
|
|
ok 1 - should handle successful submission
|
|
---
|
|
duration_ms: 1.077154
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.508282
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle submission errors
|
|
ok 3 - should handle submission errors
|
|
---
|
|
duration_ms: 1.760887
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - handleSubmit()
|
|
---
|
|
duration_ms: 3.628034
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 250 - EditModalController
|
|
---
|
|
duration_ms: 11.017249
|
|
type: 'suite'
|
|
...
|
|
# Subtest: embed accent color configuration
|
|
ok 251 - embed accent color configuration
|
|
---
|
|
duration_ms: 1.592274
|
|
type: 'test'
|
|
...
|
|
# Subtest: EmbedPlayerModal interface
|
|
# Subtest: has expected methods
|
|
ok 1 - has expected methods
|
|
---
|
|
duration_ms: 1.114341
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetStats is no-op and does not throw
|
|
ok 2 - resetStats is no-op and does not throw
|
|
---
|
|
duration_ms: 0.438636
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 252 - EmbedPlayerModal interface
|
|
---
|
|
duration_ms: 3.24567
|
|
type: 'test'
|
|
...
|
|
# Subtest: createHashChangeHandler
|
|
# Subtest: loads default view if hash is empty
|
|
ok 1 - loads default view if hash is empty
|
|
---
|
|
duration_ms: 2.676675
|
|
type: 'test'
|
|
...
|
|
# Subtest: redirects legacy view
|
|
ok 2 - redirects legacy view
|
|
---
|
|
duration_ms: 0.426208
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips redundant reload
|
|
ok 3 - skips redundant reload
|
|
---
|
|
duration_ms: 0.522536
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 253 - createHashChangeHandler
|
|
---
|
|
duration_ms: 6.960365
|
|
type: 'test'
|
|
...
|
|
# Subtest: NotificationController
|
|
# Subtest: should instantiate correctly
|
|
ok 1 - should instantiate correctly
|
|
---
|
|
duration_ms: 2.941558
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should update text content and show container
|
|
ok 2 - showError should update text content and show container
|
|
---
|
|
duration_ms: 1.377037
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should hide container when msg is empty
|
|
ok 3 - showError should hide container when msg is empty
|
|
---
|
|
duration_ms: 0.830572
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateNotificationPortalVisibility should toggle active class on portal
|
|
ok 4 - updateNotificationPortalVisibility should toggle active class on portal
|
|
---
|
|
duration_ms: 0.680462
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSuccess should update text content and show container
|
|
ok 5 - showSuccess should update text content and show container
|
|
---
|
|
duration_ms: 0.792501
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should update text content and show container
|
|
ok 6 - showStatus should update text content and show container
|
|
---
|
|
duration_ms: 1.190476
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should handle spinner option
|
|
ok 7 - showStatus should handle spinner option
|
|
---
|
|
duration_ms: 0.862749
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 254 - NotificationController
|
|
---
|
|
duration_ms: 10.742208
|
|
type: 'suite'
|
|
...
|
|
# Subtest: parseFilterQuery collects filters and text tokens
|
|
ok 255 - parseFilterQuery collects filters and text tokens
|
|
---
|
|
duration_ms: 4.366637
|
|
type: 'test'
|
|
...
|
|
# Subtest: serializeFiltersToQuery emits filter tokens in order
|
|
ok 256 - serializeFiltersToQuery emits filter tokens in order
|
|
---
|
|
duration_ms: 0.543835
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
ok 257 - video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
---
|
|
duration_ms: 0.839765
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher blocks nsfw when disallowed and requires url
|
|
ok 258 - video search filter matcher blocks nsfw when disallowed and requires url
|
|
---
|
|
duration_ms: 0.264927
|
|
type: 'test'
|
|
...
|
|
# Subtest: Security configuration: Development mode should be disabled in production
|
|
ok 259 - Security configuration: Development mode should be disabled in production
|
|
---
|
|
duration_ms: 1.682853
|
|
type: 'test'
|
|
...
|
|
# Subtest: Security configuration: Verbose diagnostics should be disabled in production
|
|
ok 260 - Security configuration: Verbose diagnostics should be disabled in production
|
|
---
|
|
duration_ms: 0.231596
|
|
type: 'test'
|
|
...
|
|
# Subtest: cardSourceVisibility
|
|
# Subtest: updateVideoCardSourceVisibility
|
|
# Subtest: should handle null or undefined input gracefully
|
|
ok 1 - should handle null or undefined input gracefully
|
|
---
|
|
duration_ms: 6.517719
|
|
type: 'test'
|
|
...
|
|
# Subtest: should resolve card from object with .card property
|
|
ok 2 - should resolve card from object with .card property
|
|
---
|
|
duration_ms: 2.323187
|
|
type: 'test'
|
|
...
|
|
# Subtest: should always show card if owner is viewer
|
|
ok 3 - should always show card if owner is viewer
|
|
---
|
|
duration_ms: 1.061809
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is healthy
|
|
ok 4 - should show card if at least one source is healthy
|
|
---
|
|
duration_ms: 1.180285
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is checking/pending
|
|
ok 5 - should show card if at least one source is checking/pending
|
|
---
|
|
duration_ms: 1.402412
|
|
type: 'test'
|
|
...
|
|
# Subtest: should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
ok 6 - should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
---
|
|
duration_ms: 0.763206
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recover from hidden state when source becomes healthy
|
|
ok 7 - should recover from hidden state when source becomes healthy
|
|
---
|
|
duration_ms: 0.829118
|
|
type: 'test'
|
|
...
|
|
# Subtest: should check closest .card if element is not .card itself
|
|
ok 8 - should check closest .card if element is not .card itself
|
|
---
|
|
duration_ms: 8.122142
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - updateVideoCardSourceVisibility
|
|
---
|
|
duration_ms: 23.79188
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 261 - cardSourceVisibility
|
|
---
|
|
duration_ms: 24.546735
|
|
type: 'suite'
|
|
...
|
|
# Subtest: domUtils
|
|
# Subtest: escapeHTML
|
|
# Subtest: should return empty string for null or undefined
|
|
ok 1 - should return empty string for null or undefined
|
|
---
|
|
duration_ms: 1.464714
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the string as is if no special characters are present
|
|
ok 2 - should return the string as is if no special characters are present
|
|
---
|
|
duration_ms: 0.303492
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape special characters
|
|
ok 3 - should escape special characters
|
|
---
|
|
duration_ms: 0.194952
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape multiple occurrences of special characters
|
|
ok 4 - should escape multiple occurrences of special characters
|
|
---
|
|
duration_ms: 0.183855
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle mixed content correctly
|
|
ok 5 - should handle mixed content correctly
|
|
---
|
|
duration_ms: 0.27726
|
|
type: 'test'
|
|
...
|
|
# Subtest: should convert non-string inputs to string and escape
|
|
ok 6 - should convert non-string inputs to string and escape
|
|
---
|
|
duration_ms: 0.185122
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - escapeHTML
|
|
---
|
|
duration_ms: 3.911667
|
|
type: 'suite'
|
|
...
|
|
# Subtest: removeTrackingScripts
|
|
# Subtest: should do nothing if root is null or undefined
|
|
ok 1 - should do nothing if root is null or undefined
|
|
---
|
|
duration_ms: 0.321208
|
|
type: 'test'
|
|
...
|
|
# Subtest: should do nothing if root has no querySelectorAll
|
|
ok 2 - should do nothing if root has no querySelectorAll
|
|
---
|
|
duration_ms: 0.152362
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts matching the tracking pattern
|
|
ok 3 - should remove scripts matching the tracking pattern
|
|
---
|
|
duration_ms: 25.344111
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not remove inline scripts (no src)
|
|
ok 4 - should not remove inline scripts (no src)
|
|
---
|
|
duration_ms: 2.023777
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src ends with tracking.js
|
|
ok 5 - should remove scripts where src ends with tracking.js
|
|
---
|
|
duration_ms: 0.717756
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src contains /tracking.js
|
|
ok 6 - should remove scripts where src contains /tracking.js
|
|
---
|
|
duration_ms: 0.671588
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - removeTrackingScripts
|
|
---
|
|
duration_ms: 29.725299
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 262 - domUtils
|
|
---
|
|
duration_ms: 34.552937
|
|
type: 'suite'
|
|
...
|
|
# Subtest: hex utils
|
|
# Subtest: normalizeHexString
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 1.182484
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty or whitespace-only strings
|
|
ok 2 - should return empty string for empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.322248
|
|
type: 'test'
|
|
...
|
|
# Subtest: should trim and lowercase valid hex strings
|
|
ok 3 - should trim and lowercase valid hex strings
|
|
---
|
|
duration_ms: 0.16455
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - normalizeHexString
|
|
---
|
|
duration_ms: 3.004354
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aliases
|
|
# Subtest: should export normalizeHexId as an alias
|
|
ok 1 - should export normalizeHexId as an alias
|
|
---
|
|
duration_ms: 0.197083
|
|
type: 'test'
|
|
...
|
|
# Subtest: should export normalizeHexPubkey as an alias
|
|
ok 2 - should export normalizeHexPubkey as an alias
|
|
---
|
|
duration_ms: 0.138313
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - aliases
|
|
---
|
|
duration_ms: 0.514431
|
|
type: 'suite'
|
|
...
|
|
# Subtest: HEX64_REGEX
|
|
# Subtest: should match valid 64-character hex strings
|
|
ok 1 - should match valid 64-character hex strings
|
|
---
|
|
duration_ms: 0.528693
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with incorrect length
|
|
ok 2 - should not match strings with incorrect length
|
|
---
|
|
duration_ms: 0.180494
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with non-hex characters
|
|
ok 3 - should not match strings with non-hex characters
|
|
---
|
|
duration_ms: 0.157585
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match empty strings
|
|
ok 4 - should not match empty strings
|
|
---
|
|
duration_ms: 0.124059
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - HEX64_REGEX
|
|
---
|
|
duration_ms: 1.231643
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeHexHash
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.340891
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for invalid hex
|
|
ok 2 - should return empty string for invalid hex
|
|
---
|
|
duration_ms: 0.175839
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return normalized hex for valid inputs
|
|
ok 3 - should return normalized hex for valid inputs
|
|
---
|
|
duration_ms: 0.250846
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - normalizeHexHash
|
|
---
|
|
duration_ms: 0.989127
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 263 - hex utils
|
|
---
|
|
duration_ms: 6.688774
|
|
type: 'suite'
|
|
...
|
|
# Subtest: linkPreviewSettings
|
|
# Subtest: getLinkPreviewSettings
|
|
# Subtest: returns defaults when storage is empty
|
|
ok 1 - returns defaults when storage is empty
|
|
---
|
|
duration_ms: 5.302509
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns stored settings
|
|
ok 2 - returns stored settings
|
|
---
|
|
duration_ms: 2.804879
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns defaults when storage is invalid
|
|
ok 3 - returns defaults when storage is invalid
|
|
---
|
|
duration_ms: 0.828749
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizes settings from storage
|
|
ok 4 - sanitizes settings from storage
|
|
---
|
|
duration_ms: 0.557287
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getLinkPreviewSettings
|
|
---
|
|
duration_ms: 11.396375
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setLinkPreviewAutoFetch
|
|
# Subtest: updates settings and persists to storage
|
|
ok 1 - updates settings and persists to storage
|
|
---
|
|
duration_ms: 1.538157
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 2 - emits an event on change
|
|
---
|
|
duration_ms: 1.185831
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setLinkPreviewAutoFetch
|
|
---
|
|
duration_ms: 2.979782
|
|
type: 'suite'
|
|
...
|
|
# Subtest: allowLinkPreviewDomain
|
|
# Subtest: adds a domain and persists to storage
|
|
ok 1 - adds a domain and persists to storage
|
|
---
|
|
duration_ms: 0.756068
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles duplicates
|
|
ok 2 - handles duplicates
|
|
---
|
|
duration_ms: 0.530555
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes domains
|
|
ok 3 - normalizes domains
|
|
---
|
|
duration_ms: 0.567285
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 4 - emits an event on change
|
|
---
|
|
duration_ms: 0.591984
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects silent option
|
|
ok 5 - respects silent option
|
|
---
|
|
duration_ms: 0.428656
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - allowLinkPreviewDomain
|
|
---
|
|
duration_ms: 3.329823
|
|
type: 'suite'
|
|
...
|
|
# Subtest: isLinkPreviewDomainAllowed
|
|
# Subtest: returns true for allowed domains
|
|
ok 1 - returns true for allowed domains
|
|
---
|
|
duration_ms: 1.783386
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for disallowed domains
|
|
ok 2 - returns false for disallowed domains
|
|
---
|
|
duration_ms: 0.484738
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles normalization
|
|
ok 3 - handles normalization
|
|
---
|
|
duration_ms: 0.630805
|
|
type: 'test'
|
|
...
|
|
# Subtest: accepts settings object as second argument
|
|
ok 4 - accepts settings object as second argument
|
|
---
|
|
duration_ms: 0.615301
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 4 - isLinkPreviewDomainAllowed
|
|
---
|
|
duration_ms: 3.8393
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeToLinkPreviewSettings
|
|
# Subtest: calls callback on event emission
|
|
ok 1 - calls callback on event emission
|
|
---
|
|
duration_ms: 2.669138
|
|
type: 'test'
|
|
...
|
|
# Subtest: unsubscribes correctly
|
|
ok 2 - unsubscribes correctly
|
|
---
|
|
duration_ms: 1.30425
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - subscribeToLinkPreviewSettings
|
|
---
|
|
duration_ms: 4.438213
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 264 - linkPreviewSettings
|
|
---
|
|
duration_ms: 27.601216
|
|
type: 'suite'
|
|
...
|
|
# Subtest: LRUCache
|
|
# Subtest: should initialize with default options
|
|
ok 1 - should initialize with default options
|
|
---
|
|
duration_ms: 1.632087
|
|
type: 'test'
|
|
...
|
|
# Subtest: should store and retrieve values
|
|
ok 2 - should store and retrieve values
|
|
---
|
|
duration_ms: 0.393686
|
|
type: 'test'
|
|
...
|
|
# Subtest: should evict oldest item when limit is reached
|
|
ok 3 - should evict oldest item when limit is reached
|
|
---
|
|
duration_ms: 0.421783
|
|
type: 'test'
|
|
...
|
|
# Subtest: should refresh recency on access
|
|
ok 4 - should refresh recency on access
|
|
---
|
|
duration_ms: 0.260162
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update value and refresh recency on set
|
|
ok 5 - should update value and refresh recency on set
|
|
---
|
|
duration_ms: 0.272177
|
|
type: 'test'
|
|
...
|
|
# Subtest: should track stats
|
|
ok 6 - should track stats
|
|
---
|
|
duration_ms: 0.325781
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 7 - should clear cache
|
|
---
|
|
duration_ms: 0.369736
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 265 - LRUCache
|
|
---
|
|
duration_ms: 5.72808
|
|
type: 'suite'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles non-string inputs
|
|
ok 266 - sanitizeProfileMediaUrl handles non-string inputs
|
|
---
|
|
duration_ms: 2.229473
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
ok 267 - sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.349463
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
ok 268 - sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
---
|
|
duration_ms: 0.86152
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows data:image/ URLs
|
|
ok 269 - sanitizeProfileMediaUrl allows data:image/ URLs
|
|
---
|
|
duration_ms: 0.175642
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows blob: URLs
|
|
ok 270 - sanitizeProfileMediaUrl allows blob: URLs
|
|
---
|
|
duration_ms: 0.152169
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects specific placeholder images
|
|
ok 271 - sanitizeProfileMediaUrl rejects specific placeholder images
|
|
---
|
|
duration_ms: 0.135103
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
ok 272 - sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
---
|
|
duration_ms: 0.351838
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
ok 273 - sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
---
|
|
duration_ms: 0.153773
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows relative paths
|
|
ok 274 - sanitizeProfileMediaUrl allows relative paths
|
|
---
|
|
duration_ms: 0.157099
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
ok 275 - sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
---
|
|
duration_ms: 0.670497
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
ok 276 - sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
---
|
|
duration_ms: 0.189886
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects unsupported patterns
|
|
ok 277 - sanitizeProfileMediaUrl rejects unsupported patterns
|
|
---
|
|
duration_ms: 0.219572
|
|
type: 'test'
|
|
...
|
|
# Subtest: dedupeToNewestByRoot replaces entries with missing timestamps
|
|
ok 278 - dedupeToNewestByRoot replaces entries with missing timestamps
|
|
---
|
|
duration_ms: 1.700973
|
|
type: 'test'
|
|
...
|
|
# Subtest: dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
ok 279 - dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
---
|
|
duration_ms: 0.262838
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags dedupes across metadata sources and respects casing
|
|
ok 280 - collectVideoTags dedupes across metadata sources and respects casing
|
|
---
|
|
duration_ms: 16.237847
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
ok 281 - collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
---
|
|
duration_ms: 0.388412
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags handles malformed inputs safely
|
|
ok 282 - collectVideoTags handles malformed inputs safely
|
|
---
|
|
duration_ms: 0.232333
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns address pointer with dTag
|
|
ok 283 - resolveVideoPointer returns address pointer with dTag
|
|
---
|
|
duration_ms: 2.990855
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns address pointer with videoRootId
|
|
ok 284 - resolveVideoPointer returns address pointer with videoRootId
|
|
---
|
|
duration_ms: 0.379857
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns event pointer with fallbackEventId
|
|
ok 285 - resolveVideoPointer returns event pointer with fallbackEventId
|
|
---
|
|
duration_ms: 0.280218
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over videoRootId
|
|
ok 286 - resolveVideoPointer prioritizes dTag over videoRootId
|
|
---
|
|
duration_ms: 0.185781
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
ok 287 - resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
---
|
|
duration_ms: 0.189737
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
ok 288 - resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
---
|
|
duration_ms: 0.169395
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer includes relay in pointer
|
|
ok 289 - resolveVideoPointer includes relay in pointer
|
|
---
|
|
duration_ms: 0.236497
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer normalizes inputs
|
|
ok 290 - resolveVideoPointer normalizes inputs
|
|
---
|
|
duration_ms: 0.165222
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer uses default kind when kind is missing or invalid
|
|
ok 291 - resolveVideoPointer uses default kind when kind is missing or invalid
|
|
---
|
|
duration_ms: 0.218549
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns null for invalid inputs
|
|
ok 292 - resolveVideoPointer returns null for invalid inputs
|
|
---
|
|
duration_ms: 0.19427
|
|
type: 'test'
|
|
...
|
|
# Subtest: getVideoRootIdentifier
|
|
# Subtest: returns empty string for invalid inputs
|
|
ok 1 - returns empty string for invalid inputs
|
|
---
|
|
duration_ms: 1.174713
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns videoRootId when present
|
|
ok 2 - returns videoRootId when present
|
|
---
|
|
duration_ms: 0.203587
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is missing
|
|
ok 3 - returns id when videoRootId is missing
|
|
---
|
|
duration_ms: 0.162021
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is not a string
|
|
ok 4 - returns id when videoRootId is not a string
|
|
---
|
|
duration_ms: 0.224889
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 293 - getVideoRootIdentifier
|
|
---
|
|
duration_ms: 3.585578
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyRootTimestampToVideosMap
|
|
# Subtest: returns early if videosMap is not a Map
|
|
ok 1 - returns early if videosMap is not a Map
|
|
---
|
|
duration_ms: 0.28578
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for matching video ID
|
|
ok 2 - updates rootCreatedAt for matching video ID
|
|
---
|
|
duration_ms: 0.237092
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for other videos with same rootId
|
|
ok 3 - updates rootCreatedAt for other videos with same rootId
|
|
---
|
|
duration_ms: 0.237867
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips invalid stored objects in map
|
|
ok 4 - skips invalid stored objects in map
|
|
---
|
|
duration_ms: 0.179197
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 294 - applyRootTimestampToVideosMap
|
|
---
|
|
duration_ms: 1.708246
|
|
type: 'test'
|
|
...
|
|
# Subtest: syncActiveVideoRootTimestamp
|
|
# Subtest: returns false for invalid timestamp
|
|
ok 1 - returns false for invalid timestamp
|
|
---
|
|
duration_ms: 0.326152
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for invalid activeVideo
|
|
ok 2 - returns false for invalid activeVideo
|
|
---
|
|
duration_ms: 0.15995
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if activeVideo has no root identifier
|
|
ok 3 - returns false if activeVideo has no root identifier
|
|
---
|
|
duration_ms: 0.185806
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if rootId mismatch
|
|
ok 4 - returns false if rootId mismatch
|
|
---
|
|
duration_ms: 0.2424
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if timestamp already matches
|
|
ok 5 - returns false if timestamp already matches
|
|
---
|
|
duration_ms: 0.168526
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates activeVideo and displayTags
|
|
ok 6 - updates activeVideo and displayTags
|
|
---
|
|
duration_ms: 0.682823
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls videoModal.updateMetadata if provided
|
|
ok 7 - calls videoModal.updateMetadata if provided
|
|
---
|
|
duration_ms: 0.326218
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 295 - syncActiveVideoRootTimestamp
|
|
---
|
|
duration_ms: 3.629393
|
|
type: 'test'
|
|
...
|
|
# watch-history-telemetry tests passed
|
|
# Subtest: tests/watchHistory/watch-history-telemetry.test.mjs
|
|
ok 124 - tests/watchHistory/watch-history-telemetry.test.mjs
|
|
---
|
|
duration_ms: 333.568159
|
|
type: 'test'
|
|
...
|
|
1..296
|
|
# tests 680
|
|
# suites 105
|
|
# pass 680
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 44304.038848
|
|
# start of coverage report
|
|
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
# file | line % | branch % | funcs % | uncovered lines
|
|
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
# config | | | |
|
|
# instance-config.js | 100.00 | 100.00 | 100.00 |
|
|
# js | | | |
|
|
# accessControl.js | 17.60 | 55.56 | 10.26 | 21-23 25-32 34-53 55-65 67-86 88-103 130-131 145-146 155-159 161-163 167-243 246-333 336-351 354-369 372-387 390-417 420-433 436-450 453-457 460-461 464-466 469-477 480-481 484-485 488-489 492-493 496-505 508-517 520-529 532-553 556-573 576-601 604-623 626-660 663-682 685-691 694-705 708-793 796-797
|
|
# adminListStore.js | 9.01 | 25.00 | 3.45 | 28-35 37-46 48-50 54-63 65-75 81 84-127 132-149 151-162 164-191 193-195 197-226 228-234 239-240 243-244 250-255 260-262 265-270 274-291 294-319 321-356 358-438 440-458 460-506 508-522 524-583 585-604 606-614 616-672 674-705 707-826 828-946 949-1016 1019-1026
|
|
# app.js | 22.64 | 96.77 | 2.93 | 212-213 216-217 220-221 224-225 228-229 232-233 236-237 240-241 244-245 248-249 252-255 258-545 702-703 706-709 712-715 718-725 728-729 732-733 736-737 740-741 744-746 749-764 767-775 778-779 782-808 811-815 818-821 824-830 833-851 854-973 976-1025 1028-1033 1036-1041 1044-1074 1077-1100 1103-1136 1139-1143 1146-1147 1150-1195 1198-1217 1220-1253 1256-1265 1268-1272 1275-1276 1279-1280 1283-1289 1292-1293 1296-1297 1300-1303 1306-1323 1326-1328 1331-1333 1336-1359 1362-1374 1377-1379 1382-1384 1387-1389 1392-1394 1397-1399 1402-1404 1410-1412 1415-1417 1420-1422 1425-1427 1430-1456 1459-1475 1478-1496 1499-1506 1509-1513 1516-1518 1521-1523 1526-1528 1531-1533 1537-1570 1573-1599 1602-1604 1607-1610 1613-1654 1657-1669 1672-1673 1676-1678 1681-1715 1718-1743 1746-1784 1787-1803 1806-1923 1926-1937 1940-1963 1966-1988 1991-2013 2016-2060 2063-2072 2075-2089 2092-2108 2111-2137 2140-2154 2157-2182 2185-2186 2189-2202 2205-2211 2214-2277 2280-2310 2313-2332 2335-2378 2381-2402 2405-2428 2431-2454 2457-2480 2483-2498 2501-2599 2602-2608 2614-2646 2649-2681 2684-2731 2737-2738 2741-2742 2745-2755 2758-2759 2762-2765 2768-2774 2777-2787 2790-2911 2914-2915 2918-2974 2977-3007 3010-3019 3022-3039 3042-3057 3060-3109 3112-3165 3171-3223 3226-3228 3231-3233 3236-3238 3241-3243 3246-3248 3251-3253 3256-3258 3261-3263 3266-3268 3271-3273 3276-3278 3281-3283 3286-3288 3291-3293 3296-3298 3301-3303 3306-3307 3310-3311 3314-3315 3318-3319 3357-3369 3372-3373 3376-3377 3380-3381 3424-3426 3429-3545 3548-3634 3637-3639 3642-3644 3647-3649 3652-3654 3657-3659 3662-3664 3667-3669 3672-3674 3684-3686 3689-3691 3694-3696 3699-3701 3704-3706 3709-3711 3714-3716 3719-3721 3724-3726 3729-3731 3734-3736 3739-3741 3744-3746 3749-3751 3754-3756 3759-3761 3764-3766 3769-3771 3774-3776 3779-3781 3784-3786 3790-3792 3795-3797 3800-3802 3805-3807 3810-3812 3815-3817 3820-3822 3825-3827 3830-3832 3835-3837 3840-3842 3848-3850 3856-3858 3864-3866 3872-3874 3880-3882 3885-3887 3890-3892 3895-3897 3900-3902 3905-3907 3910-3912 3915-3917 3920-3922 3925-3927 3930-3932 3935-3937 3940-3942 3945-3947 3953-3955 3958-3960 3963-3965 3968-3970 3973-3975 3982-3984 3992-3994 3997-3999 4002-4004 4007-4009 4012-4014 4017-4019 4022-4024 4027-4029 4032-4034 4037-4039 4042-4044 4047-4049 4052-4054 4057-4059 4062-4064 4067-4069 4072-4074 4077-4079 4082-4084 4087-4089 4092-4094 4097-4099 4102-4104 4107-4109 4112-4114 4117-4119 4122-4124 4127-4129 4132-4134 4137-4139 4142-4144 4147-4149 4152-4154 4157-4159 4162-4164 4167-4169 4172-4174 4177-4179 4182-4184 4187-4189 4192-4194 4197-4199 4202-4204 4207-4286 4289-4292 4295-4303 4306-4309 4312-4340 4343-4359 4362-4365 4368-4372 4375-4376 4379-4380 4383-4384 4387-4388 4391-4394 4397-4402 4405-4408 4411-4414 4417-4420 4428-4431 4434-4491 4494-4610 4616-4619 4622-4625 4628-4631 4634-4637 4640-4687 4693-4732 4738-4740 4743-4745 4748-4750 4753-4755 4758-4760 4767-4769 4773-4775 4778-4780 4783-4785 4788-4790 4793-4795 4798-4800 4803-4805 4808-4810 4816-4817 4820-4821 4824-4827 4830-4833 4836-4839 4842-4845 4848-4851 4854-4857 4860-4865 4868-4869 4876-4877 4883-4884 4887-4888 4891-4892 4895-4898 4901-4906 4909-4912 4915-4918 4921-4932 4935-5177 5180-5183 5186-5201 5204-5207 5213-5233
|
|
# app | | | |
|
|
# authSessionCoordinator.js | 9.18 | 66.67 | 2.86 | 57-74 78-127 132-749 753-775 779-783 787-799 803-823 827-838 842-854 858-1001 1005-1024 1035-1179 1183-1193 1197-1201 1205-1218 1222 1226-1229 1233-1260 1264-1271 1275-1343 1347-1417 1421-1488 1492-1586 1590 1594 1598-1650 1654-1714 1718 1722 1726-1728 1732-1735 1739
|
|
# bindCoordinator.js | 100.00 | 75.00 | 100.00 |
|
|
# feedCoordinator.js | 16.14 | 46.15 | 8.93 | 51-116 123-192 199-333 340-407 411-482 486-507 511-588 592-649 653-666 670-790 794-919 923-954 971-975 983-987 989-993 995-998 1015-1016 1039-1040 1053-1073 1081 1085 1089-1099 1107-1116 1125 1129-1145 1149 1153 1157 1161 1165 1169-1205 1209-1240 1244-1261 1265-1267 1271 1275-1338 1342 1346-1358 1362-1369 1373-1399 1403-1485 1489-1493 1497-1519 1523-1539 1543-1556 1560-1569 1573-1608 1612 1616-1646 1650 1654-1704 1708-1750 1754-1763
|
|
# modalCoordinator.js | 19.32 | 100.00 | 3.33 | 36-54 58-59 63 67 74-76 80 84 88-90 94-96 100-102 106-108 112-123 127-192 196-275 279 283 287-321 325-344 348-364 368-374 378-381 385-401 405-418 422-444 448-466 470-591 595-605 609-611 615-644
|
|
# moderationCoordinator.js | 22.53 | 100.00 | 6.25 | 29-91 95-162 166 170 174 178 182-185 189-201 205-241 245-259 263-283 287-292 296-301 305-310 314-321
|
|
# playbackCoordinator.js | 9.70 | 100.00 | 4.17 | 46-81 85-105 109-157 161-168 172-182 186-189 193-209 213-263 267-275 279-284 288 292-308 312-330 334-443 451-539 543-858 862-891 895-925 929-965 969-1001 1005-1083 1087-1111 1115-1213
|
|
# routerCoordinator.js | 28.41 | 100.00 | 25.00 | 18-45 49-66 70-86
|
|
# uiCoordinator.js | 65.48 | 72.00 | 71.43 | 20-31 35-53 57-85 184-185 188-189 221-223 236-238 254-256 269-273 280-308
|
|
# applicationContext.js | 66.67 | 100.00 | 50.00 | 15-20 23-24
|
|
# attachments | | | |
|
|
# attachmentUtils.js | 16.67 | 100.00 | 0.00 | 16-24 26-32 34-40 43-101 104-125 128-143 146-160
|
|
# auth | | | |
|
|
# signingAdapter.js | 100.00 | 100.00 | 100.00 |
|
|
# channelProfile.js | 22.68 | 45.45 | 25.17 | 102-122 124-145 158-159 164-205 209-210 221-225 229-240 252-253 258-259 271-272 283 301-305 331-336 339-340 346-347 351-352 364-365 378-379 385-389 399-406 408-414 440-442 461-462 464-465 469-472 480-482 487-492 503-504 508-509 515-516 520-521 543-544 552-553 649-651 668-670 682-683 720-721 724-732 734-735 738-742 744-745 751-752 759-760 767-768 793-794 806-807 812-814 817-868 870-910 925-926 932-933 936-937 1004-1005 1054-1059 1066-1067 1080-1092 1099-1100 1108-1112 1121-1122 1126-1127 1132-1133 1137-1138 1142-1143 1161-1162 1167-1168 1172-1173 1178-1179 1223-1239 1242-1281 1318-1324 1326-1343 1364-1382 1384-1407 1409-1437 1439-1488 1490-1537 1539-1602 1604-1642 1644-1652 1654-1737 1739-1750 1752-1756 1758-1769 1771-1787 1789-1819 1821-1841 1843-1863 1865-1885 1887-1907 1909-1929 1931-1951 1953-1973 1975-1995 1997-2017 2019-2046 2048-2115 2117-2125 2127-2156 2158-2167 2169-2174 2176-2227 2229-2258 2260-2297 2299-2334 2336-2342 2344-2438 2440-2455 2457-2477 2479-2502 2504-2519 2521-2574 2576-2751 2753-2772 2774-2856 2858-2862 2864-2941 2943-2994 2996-3262 3264-3290 3292-3302 3304-3332 3334-3340 3342-3401 3403-3557 3559-3583 3585-3695 3702-3834 3841-3842 3846-3851 3858-4115 4121-4205 4207-4213 4215-4250 4252-4287 4289-4307 4309-4333 4335-4416 4418-4454 4456-4501 4511-4515 4518-4519 4524-4530 4536-4541 4544-4545 4552-4558 4583-4623 4632-4666 4673-4674 4688-4689 4692-4693 4700-4701 4719-4720 4722-4723 4780 4791-4793 4800-4803 4807-4811 4815-4819 4823-4827 4831-4835 4839-4843 4847-4851 4855-4861 4865-4868 4872-4878 4882-4885 4889-4891 4895-4898 4908-4914 4920-4921 4936-5091 5093-5131 5136-5247 5254-5284 5286-5429 5432-5514 5519-5529
|
|
# config.js | 88.82 | 62.50 | 66.67 | 58-65 135-139 143-148
|
|
# constants.js | 82.76 | 60.00 | 51.22 | 40-41 45-46 55-70 85-86 89-90 92-93 96-97 103-104 111-112 119-120 123-124 126-127 197-198 277 288 302 316 330 344 372 386 399 413 438-440 443-445 453-455 458-460 463-465 468-470 473-485 490-492 495-497 500-502
|
|
# designSystem.js | 32.65 | 77.78 | 33.33 | 12-13 16-17 37-98
|
|
# designSystem | | | |
|
|
# dynamicStyles.js | 76.62 | 63.53 | 94.12 | 10-11 14-15 25-26 35 45-46 53-60 97-98 107-108 114-115 120-121 126-127 173-174 178 183-184 187-188 194-195 200-201 206-207 222-223 242-243 261-262 264-289
|
|
# metrics.js | 65.74 | 53.66 | 48.00 | 32-33 36-37 41-42 63-64 80-81 92-116 118-131 136-137 140-141 154-155 157-158 162-168 177-178 181-182 185-186 189-190 193-194 197-198 201-202 205-206 209-210 217-218 221-222
|
|
# directMessagesStore.js | 47.77 | 35.71 | 70.00 | 16-17 23-25 41 48-49 53-54 59 61-74 80-81 93-94 102-103 107-108 111-112 119-120 126-127 146-147 155-156 159-169 183-235 242-244 267-276 278-284 288-336
|
|
# dmDecryptor.js | 50.38 | 38.04 | 76.00 | 14-15 27-34 36-62 66-67 71-72 84-85 88-89 96 105-106 110-125 133-134 137-141 153-154 158-159 164-171 187-188 193-194 198-199 218-219 224-226 236 241-242 244-245 247-248 254-255 262-271 278-279 291-293 346-370 372-468 478-489 499-500 507-508 545 569-578 583-594 598-609 615-626 629-648
|
|
# dom | | | |
|
|
# cardObserver.js | 44.02 | 46.67 | 45.45 | 4-11 17 37-38 54 65-87 90-149 153-154 160-161 163-164 174-175 182-183 189-197 200-202
|
|
# embedDiagnostics.js | 3.95 | 100.00 | 0.00 | 6-167 170-177
|
|
# feedEngine | | | |
|
|
# engine.js | 18.70 | 100.00 | 0.00 | 41-49 51-56 58-76 78-112 114-142 144-181 184-260
|
|
# exploreScoring.js | 84.04 | 58.06 | 100.00 | 19-20 47-58 64-65 90-91 108-116 122-123 127-128 131-132 147-150 159-162 181-182 196-197 211-212 214-215 217-218 238-239 252-253 280-281 300-301 308-309 325-326 330-331 376-380 392-393
|
|
# index.js | 100.00 | 100.00 | 100.00 |
|
|
# kidsAudienceFilterStage.js | 11.18 | 100.00 | 0.00 | 14-20 22-43 45-51 53-72 75-161
|
|
# kidsScoring.js | 87.12 | 53.19 | 100.00 | 42-43 56-57 61-62 85 109-110 124-125 133-134 149-150 179-180 187-188 191-192 199-200 231 250-251 270-273 277-278 282-283 310-311 317-318 320-321 345-346 369-371 373-375 377-379
|
|
# sorters.js | 50.20 | 66.15 | 66.67 | 7-139 145-146 150-151 154-155 168-171 178-179 195-196 211-212 214-215 219-231 237-244 256-257 267-268 272-273 280-281 294-295 297-298 387-391 410-426 430-431 464-508
|
|
# sources.js | 5.88 | 100.00 | 0.00 | 7-12 14-20 22-32 35-63 66-169 172-238
|
|
# stages.js | 61.08 | 66.03 | 65.63 | 32-43 46-95 97-137 139-163 165-200 203-282 325-331 335-336 343-345 387-388 407-457 459-475 478-523 542 646-652 673-675 686-687 706-707 724-736 759-760 768-771 774-776 813-822 827-828 831-832 836-839 841-845 848-851 854-861 864-872 882-884 888-890 900-901 913-921 924-932 961-962 965-966 976-980 996-997 1022-1026 1109-1110 1156-1157 1161-1162 1258-1259 1264-1265 1270-1281 1306-1313
|
|
# utils.js | 69.79 | 73.68 | 71.43 | 26-27 35-42 46-47 50-51 57-58 84-96
|
|
# watchHistoryFeed.js | 5.64 | 100.00 | 0.00 | 22-24 26-28 30-40 42-59 61-86 88-98 100-168 170-224 226-234 236-250 252-267 269-458 460-559 561-601 603-630 633-661 664-691
|
|
# gridHealth.js | 24.41 | 17.65 | 25.00 | 20-35 39-41 43-71 73-80 82-91 93-123 125-175 177-229 244-255 258-270 273-309 318-319 333 335-336 341-342 350-351 356-386 389-393 400-403 412-419 433-506 513-514 517-522 530-541 547-548 550-551
|
|
# gridHealthLogic.js | 5.22 | 100.00 | 0.00 | 4-16 19-31 34-134
|
|
# hashChangeHandler.js | 85.51 | 71.43 | 62.50 | 25-26 51 56-57 60-61 75-79 86-88 98-99 124 135-136
|
|
# hashView.js | 20.00 | 100.00 | 0.00 | 6-15 18-35
|
|
# historyView.js | 10.14 | 27.27 | 2.53 | 34-35 43-51 53-64 66-76 78-83 85-87 89-134 136-146 148-168 170-195 197-215 217-263 265-305 307-316 318-329 331-347 349-363 365-373 378-384 386-389 391-405 407-415 417-431 433-454 456-471 473-494 496-502 504-510 512-533 535-579 581-646 648-791 793-866 868-881 883-954 956-1027 1029-1103 1105-1120 1123-1391 1398-1445 1466-1471 1539-1555 1558-1572 1575-1614 1617-1631 1634-1645 1648-1671 1674-1734 1737-1753 1756-1763 1766-1771 1774-1779 1782-1795 1798-1820 1823-1846 1849-1860 1863-1868 1871-1887 1890-1910 1913-1955 1958-2046 2049-2122 2125-2136 2139-2190 2193-2297 2300-2315 2319-2343 2346-2364 2367-2386 2389-2396 2399 2402 2405-2436 2439-2510 2513 2516-2520 2530-2538
|
|
# lists.js | 100.00 | 100.00 | 100.00 |
|
|
# magnets.js | 13.54 | 100.00 | 25.00 | 3-20 31-50 52-96
|
|
# magnetShared.js | 45.63 | 45.76 | 50.00 | 16-17 28-29 31-34 41-42 45-46 61-90 95-96 101-103 109-110 113-114 117-118 131-135 139-140 182-184 188-189 196-198 202-211 216-217 231-232 238-240 258-262 264-289 292-309 311-328 331-347 350-357 360-407 414 416-417 419-420
|
|
# magnetUtils.js | 16.28 | 100.00 | 0.00 | 22-129
|
|
# nostr | | | |
|
|
# adapters | | | |
|
|
# nip07Adapter.js | 58.26 | 67.50 | 50.00 | 11-12 14-15 20-33 35 65-85 90-91 116-126 130-139 143-153 159-160 171-185 192-195 198-201 206-207
|
|
# nip46Adapter.js | 75.00 | 45.45 | 22.22 | 16-36 47-48
|
|
# nsecAdapter.js | 79.12 | 40.00 | 55.56 | 13-14 17-18 27-31 34-41 56-57
|
|
# cachePolicies.js | 100.00 | 100.00 | 100.00 |
|
|
# client.js | 50.44 | 40.00 | 41.89 | 230-237 267-269 273-274 311-330 332-345 361-362 364-365 367-368 381-383 394-396 486-492 500-506 514-520 528-534 542-545 553-556 564-565 623-673 677-678 682-683 689-690 707-708 712-713 719-720 761-762 775-777 851-852 855-856 859-860 863-864 867-873 882-886 889-894 902-914 916-928 930-931 940-941 944-945 948-949 952-958 961-967 970-976 979-983 986-990 993-994 997-998 1020-1057 1069-1070 1073-1074 1077-1078 1081-1082 1085-1086 1089-1090 1093-1094 1097-1098 1101-1102 1120-1121 1124-1128 1131-1134 1138-1139 1145-1146 1151-1152 1162-1163 1167 1169-1170 1177-1178 1183-1184 1201-1202 1204-1205 1210 1212-1222 1228 1230-1243 1267 1269-1332 1353-1358 1388-1482 1486-1487 1503-1504 1515-1520 1523-1524 1532-1541 1552-1553 1555-1566 1571-1578 1611-1626 1629-1943 1962 1967-1976 1989-1990 1994-2014 2027-2028 2031-2032 2055-2056 2067-2090 2106-2107 2109-2110 2131-2141 2146-2147 2184-2186 2189-2190 2196-2201 2206-2207 2210-2211 2214-2215 2230-2231 2234-2249 2261-2262 2266-2267 2271 2282-2283 2292-2293 2297-2298 2304-2305 2308-2330 2334-2370 2465-2467 2513-2514 2524-2525 2529-2530 2559-2561 2565-2566 2569-2570 2582-2590 2599-2600 2603-2604 2607-2608 2611-2612 2615-2616 2626-2627 2630-2631 2638-2639 2642-2643 2661-2662 2664-2665 2669-2691 2709-2714 2717-2732 2747-2758 2765-2777 2787-2796 2799-2854 2857-2936 2939-3085 3116-3165 3188-3191 3193-3198 3206-3212 3273-3274 3277-3278 3297 3305-3315 3322-3326 3351-3352 3355-3356 3371-3376 3383-3385 3393-3394 3425-3427 3443-3534 3544-3591 3594-3603 3618-3619 3622-3623 3626-3627 3634-3655 3668-3693 3745-3746 3767-3768 3807-3923 3926-3929 3932-3941
|
|
# commentEvents.js | 75.39 | 55.12 | 86.36 | 44 49-50 67-68 76-77 155-156 167-168 184-185 197-198 205-206 219-231 265-275 290-299 306-311 334-335 353-364 367-369 381-383 392-396 399 420-421 432-433 437-438 440-441 459-461 477-478 484-485 487-488 492 519-521 532-547 550-554 559-568 577-581 585-589 594-596 615-619 626-629
|
|
# commentTargetNormalizer.js | 79.33 | 63.52 | 100.00 | 25-26 28-32 35-36 38-39 41-46 48-49 51-52 63-76 79-93 100 102-106 117-118 120 122-132 134-135 153-155 185-186 188-190 216-217 220-221 224-225 526-531 536-537 554-555 577-586 588-593 595-613 632-633 641-642 661-662 677-678 701-709 720-721 734-735 751-752 788-789 801-802 805-806 861-862 868-869 927-938 941-959 966-967 970-971 974-975 978-979
|
|
# countDiagnostics.js | 100.00 | 95.24 | 100.00 |
|
|
# decryptionSchemeCache.js | 100.00 | 100.00 | 100.00 |
|
|
# defaultClient.js | 84.85 | 100.00 | 0.00 | 18 23-26
|
|
# dmDecryptDiagnostics.js | 100.00 | 100.00 | 100.00 |
|
|
# dmDecryptWorkerClient.js | 44.09 | 15.79 | 33.33 | 10-49 53-54 57-58 77-78 81-82 96-97 106-126
|
|
# dmSignalEvents.js | 74.60 | 47.54 | 100.00 | 19-20 25 42-43 57-58 65-66 108-111 114-123 130-135 159-160 180-181 184-189 193-194 201-202 230-240 249-252 255-264 271-276 299-303
|
|
# eventsMap.js | 95.56 | 84.00 | 100.00 | 12-15
|
|
# index.js | 100.00 | 100.00 | 100.00 |
|
|
# managers | | | |
|
|
# ConnectionManager.js | 37.82 | 22.99 | 50.00 | 44-45 51-52 59-66 69-76 105-181 185-224 227-230 233-238 241-283 286-308 311-322 325-350 353-369 372-436 443-483 487-513 516-527 532-533 536-537 543-544 555-564 576-577 580-581 592-593 597-598 604-607 611-615 618-622 625-629 636-637 655-656 666-689 693-696 701-702 705-706 710-711 722-730 733-741 748 750-783 787-789 799-800 813-815 821-822 842-850 852-859 877 884-886 888-891 916 924-926 935-939 941 943-950
|
|
# EventsCacheStore.js | 91.67 | 75.41 | 83.87 | 10-15 123-125 161-164 167-171 198-199 203-204 209-215 301-302 305-307
|
|
# PersistenceManager.js | 48.87 | 50.00 | 60.00 | 16 43-55 58-68 71-104 107-187 190-207 234-239 242-243 286-287 301-302 304-308 316-317 331-332 351-352
|
|
# SignerManager.js | 44.89 | 51.24 | 56.10 | 65-66 90-91 101-102 121-122 214-215 223-224 235-236 238-239 247-254 269-272 281-282 298-313 321-333 337-338 345-349 351-353 372-375 378-439 450-451 455-456 464-470 476-477 480-481 496-500 509-513 519-544 547-549 559-562 569-576 580-581 585-586 602-615 618-760 763-842 845-859 862-872 890-891 901 942-947 953-961 964-996 1013-1055 1058-1104
|
|
# maxListenerDiagnostics.js | 88.42 | 86.36 | 80.00 | 70 74-75 80-81 84-89
|
|
# nip04WorkerClient.js | 41.67 | 23.08 | 50.00 | 10-47 51-52 55-56 81-82 89-107
|
|
# nip07Permissions.js | 74.72 | 50.77 | 79.41 | 62-65 116-117 135 137-140 146-147 153-154 159-163 165-167 175-177 183-184 196-198 205-206 210-220 246-250 318-319 322-323 351-355 365-372 374-376 398-432 434-441
|
|
# nip46Client.js | 27.42 | 44.17 | 44.59 | 62-63 70-71 76-79 90 92-95 109-110 115-116 119-120 122-123 125-126 132-133 138-139 141-142 146-147 150-151 154-155 171-247 252-253 259-260 265-272 274-287 291-327 330-375 378-411 414-424 428-429 433-434 437-438 452-456 466-467 469 471-477 482-483 489-490 492-497 500-510 515-516 520-521 524-525 529-530 543-679 682-698 701-712 718-744 748-759 763-764 779-780 787-860 868-869 872-873 878-898 909 911-943 945-1007 1022-1023 1039-1045 1058-1059 1082-1083 1087-1088 1101-1102 1114-1119 1139-1140 1157-1158 1162-1163 1168 1182-1185 1190-1205 1208-1256 1280-1347 1350-1351 1354-1366 1369-1397 1400-1411 1414-1435 1438-1471 1474-1570 1573-1590 1606-1607 1614-1808 1821-1855 1858-1875 1878-1898 1909-1969 1972-1986 1989-2003 2007-2008 2016-2019 2023-2037 2041-2042 2076-2100
|
|
# nip46Connector.js | 47.12 | 39.44 | 57.14 | 88-91 96-97 107-110 113-114 127-128 133-134 169-170 175-176 178-179 210-479 504-509 534-538 542-558 576-672 696-697 700-703 755-782 792-807 835-839 867-888 921-934 954-959 980-995 1032-1072 1077-1083
|
|
# nip46LoggingUtils.js | 25.32 | 86.67 | 37.50 | 29-30 35-56 59-73 76-113 116-146 149-158
|
|
# nip46Queue.js | 26.14 | 100.00 | 0.00 | 13-17 20-37 40-68 75-87
|
|
# nip71.js | 42.55 | 39.89 | 53.33 | 24 29-51 53-69 76-94 97-119 121-152 162-163 179-244 247-259 263-264 270-271 276-299 331-332 336-337 341-342 345-351 355-356 377-383 386-392 397-415 417-505 507-528 530-564 566-580 582-588 592-593 610-611 618-619 635-636 641-646 648-653 655-660 662-668 670-675 677-682 684-689 691-696 705-710 712-717 719-731 733-738 740-745 754 759-776 778-779 781-782 788-789 791-792 812-813 817-819 824-825 841-842 847-875 893-955 960-961 965-966 971-972 976-977 1005-1006 1009-1010 1025-1068 1087-1114 1130-1131 1135-1136 1148-1149 1154-1155 1159-1160 1163-1171 1186 1198-1227 1237-1243 1254-1255 1265-1266 1277-1282 1285-1286 1291-1292 1336-1359 1376-1378 1386-1387 1395 1404-1405 1425-1428 1437-1442 1458-1464 1469-1473 1478-1479 1482-1487
|
|
# publishHelpers.js | 32.18 | 28.42 | 40.00 | 43-44 46-47 76-78 84-86 94-95 110-136 140-141 153-154 163-164 169-177 180-185 188-200 202-271 274-280 283-307 310-330 375 377-380 387-391 393-397 401-444 461-462 474-482 489-501 512-997 1011-1012 1020-1021 1024-1025 1034-1035 1037-1038 1040-1041 1045-1046 1050-1051 1055-1056 1079-1080 1086-1087 1112-1113 1123-1133 1136-1137 1140-1148 1210-1218 1222-1352 1365-1370 1375-1376
|
|
# reactionEvents.js | 48.33 | 46.81 | 90.00 | 18-19 24 33-34 37-48 58-59 64-68 71-75 78-82 89-90 93-104 112-113 117-121 124-128 131-135 141-275 289-290 294-295 299-300 327-332 344-349 351-352 380-381 398 402 404-409 411-412 442-445 452-457 459-463 467-480 500-501
|
|
# relayBatchFetcher.js | 68.94 | 46.43 | 80.00 | 22-23 27-28 37-51 56-60 68-72 117-118 150-151 170-202 213-214 219-223
|
|
# relayConstants.js | 100.00 | 100.00 | 100.00 |
|
|
# sessionActor.js | 78.02 | 57.89 | 75.76 | 17-18 26-27 36-41 46-47 54-57 59-60 73-74 101 126-127 149-150 157-158 165-166 178-179 182-183 187-188 223-224 227-228 231-232 236-237 268-269 274-275 297-298 301-302 305-306 315-316 322-323 348-349 356-357 363-365 385-402 405-406 416-427 440-441 454-455 468-469 480-481 497-505
|
|
# signerHelpers.js | 50.91 | 21.43 | 18.18 | 19-20 24-31 36-40 47-66 76-79 83-86 89-93 113-126 132-135 140-149 158-162
|
|
# signRequestQueue.js | 93.08 | 88.37 | 92.31 | 25-27 63-65 77-78 102
|
|
# syncMetadataStore.js | 94.00 | 68.00 | 100.00 | 44-45 57-58 70-71
|
|
# toolkit.js | 69.77 | 50.82 | 70.83 | 24 33-37 45-46 48-52 63-67 95-96 115-123 149-150 169-175 183-184 191-195 201-211 219-223 226-230 235 237-238 246-257 263-264 268-269 289-299 334-335 342-343 368 371 374 382 402-423 430-431 443-444 450-457 469 476 480-481 483-485 489-490 494-495 506-516 520-521 527-528 530-531 546-547 561-563 572-573 577 587-594
|
|
# videoEventBuffer.js | 86.34 | 86.36 | 77.78 | 49-50 64-66 113-114 129-132 141-151
|
|
# videoPayloadBuilder.js | 92.26 | 50.41 | 100.00 | 31-32 111-113 149-150 153-154 157-158 161-162 237-239 252-254 273-274 277-278 281-282 297-298 301-302 401-402 422-423 426-427 430-431 445
|
|
# videoPublisher.js | 47.03 | 37.50 | 66.67 | 66-71 73-77 112-152 164-236
|
|
# viewEventBindings.js | 28.57 | 100.00 | 0.00 | 5-14 17-18 21-26 29-34 37-42
|
|
# viewEvents.js | 37.40 | 22.08 | 69.57 | 28-47 50-84 109-110 129-130 132-139 157-158 176-182 185-186 193-195 200-204 206-228 233-234 245-247 251-252 260-261 267-268 271-319 323-341 346-347 352 356-447 450-515 518-663 669-670 678-680 695-696 700-701 708-709 719-727 741-742 749 753 755-761 772-773 777-779 803-827 832-833 835-836 840-842 865-866 884-885 896-897
|
|
# watchHistory.js | 46.24 | 22.90 | 45.21 | 54-74 76-113 117-165 170-171 173-174 177-178 224-225 240-242 251-253 283-284 286-287 301-302 305-306 315-324 329-342 365-367 378-379 389-390 398-399 401-402 419 430-434 445-446 448 451-461 463-483 485-564 566-588 590-618 620-652 654-694 698-704 708-712 718-726 729-730 741-751 754-793 811-822 828-829 838 848-849 855-861 867-868 876-877 903-929 932-1017 1024 1028-1029 1033-1035 1053-1130 1156-1158 1179-1180 1197-1198 1226-1227 1244-1245 1248-1249 1265-1279 1292 1300-1304 1307-1308 1328 1339-1340 1346-1348 1350-1356 1369-1370 1378-1379 1389-1390 1418-1438 1441-1443 1460-1462 1474-1475 1483-1488 1495-1500 1519-1520 1534-1635 1638-1684 1703-1704 1707-1708 1716-1717 1727-1728 1744-1745 1747-1748 1771-1787 1792 1794-1804 1807-1815 1827-1831 1833-1834 1848-1851 1869-1903 1905-1948 1955-1983 1985 2003-2016 2032-2033 2036-2037 2047 2049-2050 2113-2128 2132-2133 2136-2137 2140-2141 2144-2145 2148-2154 2165-2166 2173-2174 2177-2178 2181-2182
|
|
# watchHistoryBindings.js | 44.83 | 100.00 | 0.00 | 9-11 13-19 22-24 27-29
|
|
# nostrClientFacade.js | 100.00 | 100.00 | 100.00 |
|
|
# nostrClientRegistry.js | 63.10 | 66.67 | 63.16 | 14 25-36 39-47 71-72 84-87 89-94 102-104 107-117 122-123 137-138 155-161 164-165 172-174 199-200 212-235 249-250 256-261 270-271
|
|
# nostrEventSchemas.js | 54.66 | 40.61 | 62.50 | 80-93 98-99 103-104 109-110 112-115 123-130 132-135 147-148 152-153 157-158 164 170-171 193-207 215-221 223 229-233 244-264 728-735 741-742 747-748 754-772 776-777 780-781 787-792 796-797 815-820 843-844 854-856 861-862 866-867 874-875 886-888 919-928 958-986 990 995-996 1008-1009 1015-1061 1119-1120 1131-1132 1138-1177 1180-1208 1211-1245 1273-1274 1280-1400 1403-1513 1516-1590 1593-1632 1635-1674 1699-1700 1705-1706 1717-1718 1724-1772 1793-1794 1805-1806 1812-1865 1896-1897 1908-1909 1947-1948 1959-1960 1993-1994 1998-1999 2032-2033 2039-2116 2147-2148 2151-2160 2167-2168 2173-2174 2182-2190 2197-2198 2209-2210 2221-2222 2224-2229 2234-2235 2250-2251 2300-2301 2303-2304 2306-2307 2334 2336-2337 2393-2394 2413-2417 2441-2442 2465-2470 2496-2501 2522-2523 2538-2539 2586-2587 2593-2636 2639-2672 2675-2702 2704-2716 2719-2768 2770-2778 2780-2791 2794-2887 2890-2896
|
|
# nostrPublish.js | 56.75 | 44.44 | 63.16 | 6-21 25-60 73-74 80 92-97 106-111 133 135-145 147-153 161-162 193-195 198-208 223-224 235-237 247-248
|
|
# nostrToolsBootstrap.js | 71.67 | 50.00 | 55.22 | 15-16 18-19 24-25 28-34 45-48 67-69 75-76 81-90 95-96 103-110 120-121 152-153 158 160-163 170-173 182-183 186-187 193-194 203-204 209-216 224-226 234-238 242-243 246-251 264-265 267-268 270-271 273-274 276-277 307-308 321-330 390-394 409-410 423-425 427-432 450-459 462-469 517-518 520-531 537-547 576 590-593 599-602 614-615 624-625 627-628 631 633-634 637 639-640 670-671 673-676 684-686
|
|
# nostrViewEventsFacade.js | 100.00 | 100.00 | 100.00 |
|
|
# nostrWatchHistoryFacade.js | 100.00 | 100.00 | 100.00 |
|
|
# nwcSettings.js | 12.16 | 100.00 | 0.00 | 19-21 23-29 31-55 57-86 88-98 100-102 104-120 122-131 133-138 140-163 165-168 170-191 193-197 199-203 205-226 228-245 247-267 269-280 282-302 304-315 318-319 322-334 337-354 357-370
|
|
# payments | | | |
|
|
# lnurl.js | 11.00 | 100.00 | 5.56 | 17-22 24-36 38-40 42-83 85-113 115-123 125-135 138-143 145-154 156-170 172-178 181-221 223-229 232-294 297-319 321-330 333-401
|
|
# nwcClient.js | 11.33 | 27.27 | 3.13 | 35 54 57-95 101-105 110-119 126-130 132-137 139-147 149-163 165-173 175-191 193-224 226-253 255-363 365-373 375-387 389-417 419-436 461-495 497-551 553-575 577-583 585-595 597-605 607-628 630-647 649-685 687-719 721-738 740-751 753-778 780-825 827-838 840-849 851-918 920-957 959-978 980-988 990-996 998-1029 1031-1033 1035-1038 1040-1043 1045-1053 1055-1066 1068-1076 1078-1164 1166-1216 1218-1275 1278-1290 1292-1312 1314-1335 1337-1350 1352-1368 1370-1376 1378-1384 1407-1415 1417-1424 1426-1446 1448-1495 1497-1515 1517-1523 1525-1551 1553-1573 1576-1627 1630-1631
|
|
# platformAddress.js | 21.04 | 27.27 | 13.33 | 20 39 42-80 86-90 95-104 112-116 118-123 125-133 135-152 154-162 164-180 182-209 211-213 215-218 220-228 230-295 298-324 327-328
|
|
# platformFee.js | 14.86 | 100.00 | 0.00 | 6-50 53-58 61-66 69-74
|
|
# zapMessages.js | 100.00 | 100.00 | 100.00 |
|
|
# zapNotifications.js | 5.74 | 100.00 | 0.00 | 8-10 12-39 41-53 55-67 69-77 79-87 89-109 111-170 172-191 194-217 219-274 277-365
|
|
# zapReceiptValidator.js | 9.66 | 33.33 | 0.00 | 16 28-33 35-49 51-55 57-75 77-86 88-97 99-105 107-113 115-171 173-199 201-213 216-440
|
|
# zapRequests.js | 17.00 | 100.00 | 0.00 | 18-34 36-50 52-64 67-71 74-101 104-109 112-121 124-195
|
|
# zapSharedState.js | 26.79 | 100.00 | 0.00 | 16-17 20-24 27-35 38-53 56-60 63-112 115-127 130-137 140-147 150-153 156-157 160-163 167-190 219-255 263-280
|
|
# zapSplit.js | 17.47 | 27.27 | 10.00 | 44 63 66-104 110-114 119-128 135-139 141-146 148-156 158-172 174-176 178-188 190-195 197-200 202-227 229-245 247-271 273-289 291-323 325-341 343-387 389-400 402-521 524-592
|
|
# playbackUtils.js | 89.22 | 12.50 | 100.00 | 70-71 79-87
|
|
# r2.js | 39.59 | 55.00 | 55.56 | 12-19 22-36 42-48 65-66 72-74 90 112 117-126 128-131 140-167 170-184 186-212 215-231 234-243
|
|
# reactionCounter.js | 6.15 | 100.00 | 0.00 | 13-28 30-41 43-67 69-99 101-107 109-122 124-187 189-217 219-239 241-326 328-350 352-364 366-382 384-387 389-406 408-447 449-480 482-500 502-541 543-567 569-583 585-667 671-784
|
|
# relayManager.js | 49.94 | 51.28 | 68.18 | 25-26 29-30 32-33 39-40 48-49 52-53 59-60 63-64 67-72 75-76 82-83 126-130 134-135 142-143 145-146 149-150 178 184-185 187-188 192-197 216 222-229 236-237 246-247 273-280 291-292 295-296 304-312 320-324 335-357 360-385 388-404 407-425 428-432 435-439 468-471 474-477 483-490 497-504 515-518 525-535 542-543 550-557 561-569 599-608 612-613 618 626-635 643-646 650-764 767-768
|
|
# search | | | |
|
|
# searchFilterMatchers.js | 88.75 | 61.11 | 80.00 | 33-35 49-50 52-53 74-75
|
|
# searchFilters.js | 73.41 | 48.28 | 86.67 | 54-56 77-91 97-98 102-103 115-116 129-135 142 156-158 168-170 176-178 188-190 195-202 204-206 208-215 217-224 228-230 235-237 246-249 257-258 262 303-304 307-308
|
|
# services | | | |
|
|
# attachmentService.js | 53.05 | 51.72 | 73.68 | 24-25 31-32 35-39 41-45 57-58 66-82 86-87 92-94 99-100 107-109 114-115 118-119 123-124 156-188 192-193 197-198 206-207 218-219 236-237 240-241 247-272 283-284 293-294 306-307 329-387
|
|
# authProviders | | | |
|
|
# generate.js | 100.00 | 100.00 | 0.00 |
|
|
# index.js | 63.27 | 25.00 | 71.43 | 13-21 54-55 57-58 71-72 79-83 102-117 125-128 132-145
|
|
# nip07.js | 76.67 | 37.50 | 66.67 | 30-31 34-35 40-45 61-64 67-73
|
|
# nip46.js | 18.22 | 100.00 | 0.00 | 8-14 41-59 61-101 115-267
|
|
# nsec.js | 26.71 | 100.00 | 0.00 | 28-46 48-64 78-159
|
|
# authService.js | 10.16 | 100.00 | 0.00 | 49-109 112-117 120-121 124-125 128-142 145-146 149-150 153-173 176-178 181-186 189-190 193-194 197-198 201-268 271-283 286-287 290-291 294-295 298-299 302-303 306-307 310-311 314-315 318-319 322-370 373-421 424-493 496-520 523-600 603-702 705-807 810-834 837-858 861-918 921-943 946-1015 1018-1069 1072-1238 1241-1280 1283-1284 1287-1298 1301-1302 1305-1308
|
|
# authUtils.js | 100.00 | 100.00 | 100.00 |
|
|
# commentThreadService.js | 9.55 | 100.00 | 0.00 | 18-24 26-28 30-35 39-47 49-51 53-55 57-61 63-72 74-100 104-158 161-182 185-194 197-321 324-380 383-389 392-411 414-507 510-539 542-556 559-581 584-590 593-614 617-648 651-670 673-732 735-760 763-784 787-806 809-817 820-822 825-829 832-848 851-872 875-886 889-963 966-967 970-988 991-1009 1012-1016 1019-1034 1037-1038 1041-1046 1049-1050 1053-1069 1072-1075 1078-1083 1086-1087 1090-1120
|
|
# discussionCountService.js | 84.52 | 70.83 | 88.89 | 13-14 30-32 36-37 69-70 80-82 85-87 131-132 148-149 151-152 163-168 187-188 194-195 199-200 212-213 217-218 234-235
|
|
# dmNostrService.js | 11.40 | 100.00 | 0.00 | 22-34 36-41 43-54 56-63 65-86 89-162 164-170 172-178 180-189 193-217 220-249 252-254 257-261 264-280 283-310 313-332 335-349 352-358 361-370 373-400 403-428 431-439 442-446 449-462 465-479 482-529 532-600 603-608 611-620 623-632 635-681
|
|
# dmNotificationManager.js | 68.60 | 53.85 | 68.75 | 19-25 47-48 56-59 66-69 72-89 93-94 110-114 119-120 127-128 134-135 152-153 173-174 181-182 196-197 213-230 234-235
|
|
# exploreDataService.js | 38.77 | 96.77 | 31.58 | 101-115 119-146 149-153 156-167 170-178 181-211 214-221 224-231 234-265 268-296 299-300 303-304 307-324
|
|
# hashtagPreferencesService.js | 9.62 | 100.00 | 6.67 | 55-72 75-90 97-112 114-122 124-160 162-209 211-244 269-279 284-285 288-309 312-316 319-348 351-359 362-374 377-416 419-420 423-424 427-447 450-463 466-486 489-502 505-518 521-541 544-578 581-954 957-969 972-1251 1254-1428
|
|
# linkPreviewService.js | 79.92 | 55.38 | 87.50 | 10-11 17-18 21-22 29-30 37 42-43 48-49 64-65 69-71 88 111-112 125-127 133-134 138-139 145-146 157-158 164-165 168-169 180-181 192-193 198-199 204-206 212-213 218-220
|
|
# moderationActionController.js | 68.67 | 62.68 | 92.00 | 88-89 93-94 97-98 124-125 128-129 133-137 146-148 152-154 164-170 183-192 235-236 239-240 250-252 262-263 273-278 289-294 300-301 313-314 327-328 333-334 346-347 352-356 368-379 387-389 393-403 408-409 414-418 423-424 429-433 438-439 443-444 465-466 470-471 479-483 488-489 493-494 499-503 508-509 514-519 524-525 531-536 541-542 547-552 557-558 563-567 572-573 578-582 586-599
|
|
# moderationDecorator.js | 84.62 | 65.27 | 92.31 | 27-28 34-35 50 55-71 76-77 81-82 87-88 98-101 113-124 196-197 221-222 226-227 351-353 356-363 377-378 401-402 458-459 472-473 485-486 490-491 493 495-496 498-499
|
|
# moderationService.js | 57.40 | 48.08 | 66.09 | 36 38-39 51-52 62-65 79-86 96-97 105 118-119 132-143 151-152 156-157 167-168 173-174 194-196 199-214 269-270 274-275 280-281 286-287 294-295 300-301 315-316 326-328 330-331 339-340 344-345 352-353 357-358 366-367 373-378 384-385 390-391 394-395 417-418 423-424 429-430 433-434 443-444 447-448 450-451 457 462-463 467-468 471-475 481-482 484-485 491-503 511-522 592-596 606-607 620-626 654-655 682-688 696 709-729 732-772 788-795 805-806 817-818 859-860 875 884-885 889-891 894-902 905-906 913-914 924-925 933-934 938-939 944-945 950-954 964-965 979-984 1003-1010 1014-1015 1019-1022 1052-1053 1060-1098 1101-1113 1118-1119 1121-1122 1132-1133 1137 1152-1153 1156-1158 1166-1199 1203-1217 1220-1222 1225-1227 1232-1233 1239-1240 1250-1271 1276-1302 1308-1311 1314 1330-1336 1348-1349 1352-1354 1361-1368 1374-1375 1377-1378 1392-1393 1397-1398 1404-1405 1410-1411 1416-1456 1459-1492 1495-1535 1538-1539 1542-1554 1557-1569 1587-1588 1593-1595 1612-1613 1620-1621 1626-1627 1630-1631 1641-1642 1645-1646 1700-1702 1704-1706 1710-1719 1737-1742 1745 1757-1817 1820-1867 1878-1880 1883-1884 1889-1890 1898-1911 1921-1952 1955-1991 1995-1996 2007-2020 2023-2073 2086-2087 2091-2092 2097-2098 2102-2103 2150-2151 2155-2175 2186-2187 2281-2282 2294-2295 2306-2307 2325-2326 2333-2342 2345-2346 2362-2363 2367-2368 2392-2395 2399-2402 2409-2412 2416-2419 2425-2428 2439-2443 2463-2467 2472-2475 2482-2486 2494-2495 2500-2501
|
|
# nostrService.js | 45.33 | 33.90 | 59.00 | 41-42 49 52-54 63-64 67-68 75-76 87-88 98-101 115-122 132-133 139-140 142-143 156-163 168-169 173-174 190-191 207-208 212-213 216-217 224-225 232-233 242-248 253-254 260-261 265 270-273 276-282 284-294 302-304 315-316 323-324 339 341-351 353-356 361-364 369-371 373-376 384-385 392-393 404-405 419-422 430 436 443-445 470-471 475-476 501-502 506-507 518-551 553-607 615-619 644-645 649-651 657 661-667 674-675 679-683 702-719 735-736 749-750 763-764 767-783 790-825 833-834 837-841 864-866 870-871 891-892 896-897 901-902 906-907 910-912 953-956 966-1026 1029-1153 1156-1312 1315-1327 1337-1338 1348-1350 1357-1358 1372-1373 1382-1391 1395-1396 1399-1400 1408-1417 1421-1422 1436-1442 1452-1453 1458-1459 1462-1463 1474-1486 1498-1499 1504-1505 1508-1509 1512-1513 1518-1519 1521-1522 1526-1527 1532-1533 1535-1537 1560-1561 1566-1570 1574-1576 1579-1641 1657-1661 1664-1665 1674-1679 1696-1717 1719-1720 1734-1736 1747-1748 1758-1760 1764-1774 1779-1780 1814 1824 1832-1833 1894-1896 1918-1920 1924-1983 1986-2061 2064-2067 2070-2132 2135-2149 2152-2202 2208-2209 2211-2212 2218-2219
|
|
# nwcSettingsService.js | 15.29 | 100.00 | 0.00 | 13-15 19-61 64-68 71-72 75-78 81-82 85-93 96-122 125-131 134-135 138-142 145-167 170-198 201-221 224-258 261-294 297-310 313-320 323-326
|
|
# playbackService.js | 74.07 | 55.75 | 68.75 | 31-45 52-60 75-76 84-85 90-91 94-95 100-104 118-124 128-134 143-151 153-166 168 170-208 215-220 222-225 230 232 234 236 238 244-245 248-249 251-252 254-255 272 290-291 294-295 301-302 308-313 316-321 332-335 344 358-359 366-367 370-371 382-384 396-397 434-435 462-463 473-474 488-489 491-492 535-538 589-594 622-623 626-633 636-637 640-641 644-645 648-649 652-653 660 677-678 705-707 733-734 779-780 782-783 786-787 790-791 796-797 814-815 830-831 834-835 838-839 850-851 865-866 870-871 877-878 893-895 902-903 922-923 955-964 969-972 986-987 1031-1040 1043-1044 1054-1058 1066-1088 1092-1093 1193-1194 1213 1215-1225 1269-1277
|
|
# playbackStrategyService.js | 6.67 | 100.00 | 0.00 | 11-16 19-27 37-343
|
|
# profileMetadataService.js | 88.44 | 72.15 | 90.48 | 12-13 25-26 31 33-36 41-42 78-80 91-93 97-99 135-136 141-142 149-150 154-155 279-280 283-284 289-290
|
|
# r2Service.js | 32.27 | 44.78 | 50.00 | 56-58 60-62 64-82 84-101 115-116 119-120 122-123 136-137 160-161 184-185 202 213-217 220-221 224-225 228-309 324-332 345-346 367-371 373-374 412-433 437-438 461-468 487-488 493-494 496-497 506-507 509-510 519-569 605-711 714-716 725-775 796-1111 1114-1115 1118-1188
|
|
# relayHealthService.js | 84.42 | 72.73 | 100.00 | 24-25 31-36 41-42 50-54 109-110 112-113 127-131 144-145 183-184 196-198 201-203 218-219 236-237 268-272
|
|
# relaySubscriptionService.js | 62.80 | 62.50 | 76.00 | 5-6 35-36 39-40 47-48 64-65 108-109 112-117 123-129 132-141 147-154 160-162 165-171 180-181 185-192 194-201 224-243 246-247
|
|
# s3Service.js | 55.14 | 83.33 | 75.00 | 39-53 75-76 81-82 84-85 87-88 99-100 128-185
|
|
# s3UploadService.js | 82.61 | 70.24 | 75.00 | 59-60 62-63 68-69 71-75 81-82 118 209-211 263-265 329-333 347 353-388 391-395 401-409 412-416 457-459
|
|
# storageService.js | 68.96 | 56.47 | 55.10 | 42-44 46-48 50-52 80-87 89-98 100-111 113-123 127-131 134-137 140-143 156-163 191-193 211-212 291-297 303-308 324 330-331 335-336 349-397 459-460 470-471 496-498 519-520 528-529 592-600 606-612 618-630 642-655 665-671 678-680 687 691-701 726-736
|
|
# trustBootstrap.js | 92.19 | 79.07 | 93.33 | 38-41 63 68-69 130-131 162-166 170
|
|
# videoNotePayload.js | 7.79 | 100.00 | 0.00 | 24-25 27-35 37-46 48-54 56-62 64-86 88-95 97-105 107-149 151-192 194-213 215-234 236-323 326-475
|
|
# watchHistoryTelemetry.js | 70.49 | 49.32 | 55.88 | 83-85 92-93 100-101 104-105 108-115 119-120 125-126 139-140 147-151 158-161 166-170 181-182 186-187 209-211 216-217 237-242 244-248 270-274 277-291 293-297 299-302 310-311 323 332-334 338-340 349-350 370-371 375-378 383-384 388-389 397-398 408-419 422-426
|
|
# sidebarLoading.js | 12.12 | 100.00 | 0.00 | 3-14 17-33
|
|
# state | | | |
|
|
# appState.js | 90.09 | 78.05 | 75.00 | 52-53 71-72 96-97 108-109 119-120 123-124 147-148 162-163 169-170 175-176 187-188
|
|
# cache.js | 50.71 | 56.85 | 66.15 | 70-75 85-90 138-139 143-144 148-149 161-162 166-180 185-192 204-205 207-208 214-229 234-254 263-264 269-277 282-283 287-288 319-320 342-343 355-356 370-371 384-385 399-400 406-408 410-419 424-425 430-447 452-453 522-524 530-531 535-537 593 595-596 601 603-604 615-617 629-630 642-647 667-672 679-681 695-734 737-824 827-874 880-889 892-894 896-928 962-1089 1093-1094 1108-1109 1116-1117 1126-1127 1130-1131 1147-1156 1170-1174 1177-1180 1182-1188 1190-1203 1206-1209 1212-1213 1216-1224 1227-1305 1307-1373 1389-1391 1407-1416 1421-1448 1451-1460 1463-1467 1479-1495 1531-1532 1544-1545 1553-1554 1556-1557 1563-1564 1567-1568 1580-1586 1589-1590 1595-1596 1601-1602 1605-1606 1642-1646 1659-1660 1664-1669 1704-1705 1723-1727 1731-1732 1740-1741 1748-1749 1767-1769 1774-1775 1792-1804 1807-1822
|
|
# profileCache.js | 84.16 | 71.08 | 76.92 | 24-25 49-50 84-87 136-137 151-152 176-177 213-214 226-227 231-232 236-237 248-249 266-268 317-318 333 338-339 356-363 366-373 376-379 391-397 400-405 417-418
|
|
# profileSettingsStore.js | 90.54 | 90.48 | 92.86 | 3-5 37-38 43-44
|
|
# storage | | | |
|
|
# dmDb.js | 68.53 | 46.00 | 70.27 | 64-65 94-95 112-113 117-119 143-144 151-152 160-165 177-178 184-185 192 199-200 236-275 293-313 322-323 328-329 342-344 349-350 355-356 365-367 372-373 384-385 409-410 414-416 422-423 441-442 475-477 485-486 497-498 507-508 524-526 530-560 563-591
|
|
# r2-mgmt.js | 7.51 | 100.00 | 0.00 | 2-9 12-48 51-87 89-96 99-141 145-158 162-183 185-193 195-233 237-280 284-293
|
|
# r2-s3.js | 12.50 | 100.00 | 0.00 | 20-159 162-182
|
|
# s3-client.js | 45.61 | 57.14 | 30.00 | 13-32 36-37 41-43 47-48 65-74 77-78 81-82 85-86 89-107
|
|
# s3-multipart.js | 6.25 | 100.00 | 0.00 | 8-17 19-29 31-50 53-92 95-132 135-156 159-272
|
|
# s3-url.js | 70.27 | 40.00 | 83.33 | 4-5 9 25 39-40 52-53 56-59 65-74
|
|
# subscriptions.js | 9.14 | 66.67 | 6.00 | 58-64 66-74 76-123 125-158 160-180 182-234 236-286 301-318 321-336 376-387 395-438 441-447 450-451 454-474 477-800 803-824 827-831 834-858 861-873 876-938 941-953 956-961 964-980 983-984 987-1271 1274-1301 1304-1331 1339-1540 1547-1726 1730-1731 1736-1737 1742-1748 1751-1786 1789-1800 1803-1805 1808-1858 1865-1933 1936-1966 1969-2247 2250-2279 2282-2286 2289-2308 2311-2334 2337-2363 2366-2367
|
|
# ui | | | |
|
|
# ambientBackground.js | 3.43 | 100.00 | 0.00 | 7-11 13-35 37-65 67-98 101-321
|
|
# appChromeController.js | 57.11 | 55.56 | 53.85 | 76-87 91-101 106-107 113-116 120-138 142-151 177-178 187-193 201-207 211-223 244-250 258-264 269-270 325-344 347-362 365-380 386-401 403-406
|
|
# applicationBootstrap.js | 7.88 | 100.00 | 0.00 | 88-106 109-1153 1156-1167
|
|
# components | | | |
|
|
# DeleteModal.js | 8.83 | 100.00 | 0.00 | 3-16 20-74 77-78 81-82 85-90 93-127 130-147 150-160 163-181 184-196 199-213 216-258 261-336 339-360 363-374 377-389 392-426 429-450
|
|
# EditModal.js | 5.31 | 100.00 | 0.00 | 8-76 79-80 83-84 87-88 91-92 95-148 151-194 197-211 214-289 292-311 314-317 320-327 330-348 351-403 406-500 503-605 608-634 637-653 656-741 744-767 770-819 822-840 843-851 854-1095 1098-1107 1110-1121 1124-1128
|
|
# EmbedPlayerModal.js | 35.05 | 75.00 | 7.69 | 24-35 38-39 42-43 46-50 57-75 78-79 82-83 86-88 93-97 100-101 109-110 113-114 117-118 123-126 129-130 133-148 151-154 157-175 178-207 210-213
|
|
# EmbedVideoModal.js | 10.20 | 100.00 | 0.00 | 15-17 19-29 31-37 41-79 82-120 123-137 140-170 173-200 203-210 213-233 236-324 327-349 352-372 375-389 392-430 433-443 446-450
|
|
# EventDetailsModal.js | 5.45 | 100.00 | 0.00 | 9-34 37-129 132-161 164-232 235-265 268-356 359-402 405-450 453-458
|
|
# FeedInfoPopover.js | 27.27 | 100.00 | 0.00 | 13-44
|
|
# hashtagStripHelper.js | 62.03 | 50.00 | 70.00 | 37-40 46-47 52-54 63-65 78-82 91-92 120-121 130-131 148-149 155-161 167-168 185-188 202 213-221 226-227 236-237 243-244 250-251 270-275 279-302 307-308 316 321-367 372-377 381-382 386-391
|
|
# modalAccessibility.js | 29.05 | 33.33 | 13.33 | 22-29 31-50 55-63 69-79 83-123 127-139 143-172 179-180 182-185 187-195 199 207
|
|
# nip71FormManager.js | 16.77 | 36.00 | 27.59 | 21-22 25-27 37-38 41-46 51-58 62-75 79-92 100-149 152-266 269-410 413-439 442-465 468-476 479-480 483-501 504-530 533-553 556-583 586-590 593-616 619-649 652-680 683-691 694-702 705-710 713-724 727-737 740-748 775-776 784-786 795-796
|
|
# RevertModal.js | 4.51 | 100.00 | 0.00 | 8-65 68-69 72-73 76-81 84-121 124-145 148-169 172-225 228-242 245-259 262-278 281-374 377-504 507-537 540-930 933-1008 1011-1040 1043-1065 1068-1077 1080-1084 1087-1117 1120-1122 1125-1127 1130-1132 1135-1157 1160-1174 1177-1350 1353-1458 1461-1508 1511-1568 1571-1585 1588-1628 1631-1645 1648-1660
|
|
# ShareNostrModal.js | 11.32 | 100.00 | 0.00 | 6-21 25-73 76-77 80-81 84-89 92-126 129-144 147-157 160-184 187-208 211-226 229-242 245-254 257-261 264-270 273-308 311-328 331-341 344-390 393-401 404-412 415-421 424-433 436-472 475-485
|
|
# SimilarContentCard.js | 64.67 | 65.55 | 60.38 | 17-18 40-41 71-72 74-75 146-147 150-151 154-155 166-167 174-177 189-190 199 215-216 218-219 260-264 302-303 336-337 364-365 374-375 391-392 457-464 467-487 490-508 511-525 528-567 570-609 612-651 654-739 745-747 781-793 838-839 872-873 875-880 888-915 990-993 1038-1045 1084-1108 1157-1188 1220-1221 1243-1244 1251-1252 1256-1257 1263-1264 1268-1269 1272 1274-1277 1282-1287 1289-1291
|
|
# staticModalAccessibility.js | 10.56 | 100.00 | 0.00 | 5-13 15-20 22-37 39-72 74-86 89-105 108-123 126-141
|
|
# tagPillList.js | 59.83 | 76.92 | 57.14 | 15 21-22 42-43 58-59 101-102 119-129 131-143 145-150 152-174 177-210
|
|
# tagPreferenceMenu.js | 88.31 | 72.09 | 100.00 | 19-21 31-32 75-76 81-83 104-111 121-122 163-164 218-219 228-230 235-236
|
|
# UploadModal.js | 57.47 | 46.61 | 41.54 | 30-32 34-36 296-297 308-311 317-321 369-370 376-383 391-402 413-429 442-449 461-470 481-484 486-489 531-535 540-549 551-577 585-588 599-611 623-682 685-703 707-804 811-813 821-828 834-841 905-910 938-940 944-949 959-960 989-992 1006 1013-1096 1099-1126 1129-1139 1142-1160 1163-1183 1247-1256 1261-1278 1290-1291 1294-1295 1298-1299 1314-1318
|
|
# video-modal | | | |
|
|
# commentsController.js | 6.19 | 100.00 | 0.00 | 5-8 11-148 151-188 191-214 217-240 243-253 256-289
|
|
# moderationController.js | 11.86 | 100.00 | 0.00 | 3-4 7-59 62-76 79-91 94-106 109-116
|
|
# reactionsController.js | 13.16 | 100.00 | 0.00 | 3-8 11-39 42-59 62-74
|
|
# similarContentController.js | 13.70 | 100.00 | 0.00 | 3-4 7-41 44-61 64-71
|
|
# utils | | | |
|
|
# commentAvatar.js | 97.53 | 90.91 | 100.00 | 72-73
|
|
# VideoCard.js | 63.15 | 47.43 | 73.68 | 45-46 48-49 279-280 283-284 287-288 291-292 295-334 337-376 384-385 418 447-448 463-464 498-499 502-510 561-562 565-566 649-651 662-663 673-674 680-681 689-690 700 704-706 711-717 719-722 750-755 764-765 781-795 800-801 807-808 824 832 834-842 846-870 925-928 1033-1056 1069-1088 1132-1143 1197-1212 1245-1250 1260-1266 1271-1276 1280-1284 1305-1310 1320-1326 1331-1336 1340-1344 1349-1406 1432-1433 1440-1441 1445-1446 1485-1518 1582-1583 1586-1587 1615-1618 1627-1643 1654-1659 1667-1668 1679-1696 1878-1883 1892-1896 1945-1946 1948-1949 1953-1967 1996-1997 1999-2003 2009-2010 2031-2032 2038-2039 2115-2116 2148-2149 2151-2152 2154-2159 2172-2173 2175-2179 2181-2185 2187-2188 2190-2191 2193-2194 2196-2198 2203-2216 2219-2253 2257-2258 2289-2290 2299-2400 2403-2430 2433-2457 2472-2548 2553-2554 2558-2559 2561-2562 2566-2575 2578-2580 2585-2586 2588-2604 2609-2610 2621-2622 2643-2660 2667-2668 2672 2678 2680-2681 2704 2706-2707 2709 2711-2712 2721-2723 2737-2743 2745-2746 2750-2767 2779-2803 2808-2850 2854-2907 2914-2923 2930-2931 2933-2935 2937-2938 2943-2944 2950-2951 2955-2991 3037-3039 3060-3066 3075-3077 3087-3105 3120-3121
|
|
# videoMenuRenderers.js | 3.44 | 100.00 | 0.00 | 3-11 13-28 30-55 57-88 90-103 105-112 114-121 123-153 156-310 313-374 377-434 437-494
|
|
# VideoModal.js | 7.08 | 100.00 | 0.00 | 57-339 342-354 357-358 361-362 365-372 375-376 379-380 383-476 479-547 550-816 819-843 846-870 873-899 902-904 907-916 919-929 932-934 937-943 946-956 959-967 970-981 984-1017 1020-1032 1035-1051 1054-1062 1065-1121 1124-1138 1141-1143 1146-1156 1159-1201 1204-1241 1244-1266 1269-1310 1313-1452 1455-1490 1493-1541 1544-1684 1687-1700 1703-1704 1707-1708 1711-1790 1793-1800 1803-1804 1807-1813 1816-1850 1853-1878 1881-1903 1906-1925 1928-1959 1962-1970 1973-1989 1992-1995 1998-2014 2017-2037 2040-2046 2049-2075 2078-2084 2087-2102 2105-2178 2181-2214 2217-2221 2224-2249 2252-2269 2272-2287 2290-2305 2308-2460 2463-2563 2566-2616 2619-2665 2668-2729 2732-2759 2762-2780 2783-2824 2827-2861 2864-2869 2872-2880 2883-2921 2924-2934 2937-2951 2954-2960 2963-2965 2968-2982 2985-3022 3025-3070 3073-3094 3097-3104 3107-3118 3121-3154 3157-3166 3169-3183 3186-3201 3204-3256 3259-3274 3277-3332 3335-3344 3347-3373 3376-3385 3388-3421 3424-3437 3440-3442 3445-3458 3461-3472 3475-3523 3526-3549 3552-3557 3560-3577 3580-3591 3594-3616 3619-3623 3626-3648 3651-3656 3659-3662 3665-3700 3703-3712 3715-3718 3721-3724 3727-3770 3773-3780 3783-3790 3793-3800 3803-3836 3839-3890 3893-3902 3905-3972 3975-4025 4028-4050 4053-4059 4062-4070 4073-4086 4089-4093 4096-4100 4103-4109 4112-4118 4121-4150 4153-4159 4162-4329 4332-4375 4378-4396 4399-4412 4415-4444 4447-4448 4451-4463 4466-4474 4477-4536 4539-4560 4563-4572 4575-4789 4792-4799 4802-4831 4834-4882 4885-4903 4906-4921 4924-4935 4938-4967 4970-4999 5002-5031 5034-5046 5049-5061 5064-5098 5101-5140 5143-5171 5174-5185 5188-5200 5203-5209 5212-5237 5240-5253 5256-5267 5270-5278 5281-5349 5352-5368 5371-5392 5395-5430 5433-5452 5455-5465 5468-5621 5624-5658 5661-5726 5729-5749 5752-5754 5757-5766 5769-5775 5778-5789 5792-5812 5815-5834 5837-5863 5866-5881 5884-5885 5888-5937 5940-5988 5991-6023 6026-6178 6181-6224 6227-6235 6238-6240 6243-6283
|
|
# creatorProfileController.js | 82.00 | 34.41 | 78.95 | 47-50 53-56 59-62 75-76 78-79 82 88-89 150-151 153-154 157-158 160-161 171-172 200-201 207-208 237 244 255 272 289-290 299-300 309-310 313-317 324-326 336-344 347-348 358-359 362-363 385-386 390-391 405-411 461-462 465-466 469-470 478-482
|
|
# dm | | | |
|
|
# AppShell.js | 36.49 | 100.00 | 0.00 | 9-18 116-291 294-295
|
|
# Avatar.js | 7.02 | 100.00 | 0.00 | 3-13 16-57
|
|
# Composer.js | 1.64 | 100.00 | 0.00 | 1-10 15-244
|
|
# ContactRow.js | 5.26 | 100.00 | 0.00 | 4-13 16-95
|
|
# ConversationList.js | 4.29 | 100.00 | 0.00 | 5-14 16-18 21-163
|
|
# DayDivider.js | 8.33 | 100.00 | 0.00 | 1-10 13-24
|
|
# DMPrivacySettings.js | 1.39 | 100.00 | 0.00 | 2-72
|
|
# DMRelaySettings.js | 1.25 | 100.00 | 0.00 | 2-80
|
|
# DMSettingsModalController.js | 17.24 | 100.00 | 8.33 | 16-41 44-82 94-112 115-129 132-145 148-181 184-186 189-212 215-220 223-245 248-260
|
|
# index.js | 100.00 | 100.00 | 100.00 |
|
|
# MessageBubble.js | 2.60 | 100.00 | 0.00 | 1-10 13-77
|
|
# MessageThread.js | 3.66 | 100.00 | 0.00 | 6-15 18-191
|
|
# NotificationCenter.js | 10.05 | 100.00 | 0.00 | 1-10 29-31 34-97 100-219
|
|
# zapHelpers.js | 10.34 | 100.00 | 0.00 | 1-7 10-17 20-52 55-58
|
|
# ZapInterface.js | 5.04 | 100.00 | 0.00 | 5-14 17-119
|
|
# ZapReceiptList.js | 5.00 | 100.00 | 0.00 | 3-12 14-29 32-100
|
|
# editModalController.js | 90.76 | 70.83 | 75.00 | 45-47 60-62 64-66 73-74
|
|
# engagementController.js | 74.18 | 49.03 | 50.00 | 32-33 48 50-51 78-79 87-88 90-91 117-118 120-123 125-128 130-131 136-139 156-158 164-165 169-171 187-189 264-297 311-313 319-320 324-326 384 391-413 416-418 422-424
|
|
# initDeleteModal.js | 8.62 | 100.00 | 0.00 | 4-56
|
|
# initEditModal.js | 7.35 | 100.00 | 0.00 | 4-66
|
|
# initUploadModal.js | 6.58 | 100.00 | 0.00 | 4-74
|
|
# loginModalController.js | 3.96 | 100.00 | 0.00 | 8-14 16-30 32-106 108-115 117-128 130-140 142-152 154-164 166-198 202-302 305-329 332-375 378-380 383-405 408-423 426-459 462-463 466-470 473-474 477-478 481-526 529-562 565-642 645-651 654-660 663-685 688-699 702-714 717-732 735-768 771-793 796-851 854-1115 1118-1595 1598-1851 1854-1867 1870-1887 1890-1918 1921-2032 2035-2062 2065-2079 2082-2083 2086-2116 2119-2152 2155-2184 2187-2214 2217-2227 2230-2442 2445-2459 2462-2487 2490-2550
|
|
# ModalManager.js | 2.46 | 100.00 | 0.00 | 20-59 62-701 704-973
|
|
# moderationCopy.js | 84.57 | 56.00 | 100.00 | 5-6 27-28 36-37 51-53 78-84 89-90 129-133 139-140
|
|
# moderationUiHelpers.js | 93.43 | 84.55 | 94.44 | 33-39 46-51 185-186 188-189 213-214 298-299 301-302
|
|
# moreMenuController.js | 5.00 | 100.00 | 0.00 | 26-104 107-108 111-169 172-204 207-225 228-229 232-275 278-351 354-427 430-438 441-459 462-479 482-483 486-576 579-615 618-622 625-635 638-692 695-721 724-783 786-852 855-896 899-944 947-958 961-989 992-1072 1075-1086 1089-1599
|
|
# notificationController.js | 69.17 | 25.00 | 70.00 | 40-41 51-52 66-70 73-75 95-101 120-122 129-130 145 152-153 156-162 165 175 177-202 212-213 216-218 221-225 233-239 247-249
|
|
# overlay | | | |
|
|
# overlayRoot.js | 85.71 | 72.22 | 100.00 | 9-11 20-21 40-41 48-49
|
|
# popoverEngine.js | 84.38 | 58.73 | 90.00 | 34-35 41-42 44-45 51-52 55-56 60 72-73 75-77 87-88 101-103 109-116 121-122 144-145 151-152 191-192 196 201-202 283-285 287-288 298-299 302-303 324-325 330-331 347-348 354-355 368-371 386-387 389-390 392-393 406-407 428-429 440-443 446-452 456-457 475-476 497-498 512 526-527 544-545 558 563-564 572-573 582-583 627-628 638-639 642-648 690-691 714-715 717-718 730-732 742-743 746-748 775-776 780-781 784-785 788-789 845-846 861-865 871-872 884-885 892-893 900-901 905-907 911-912 935-937 966-967 1013 1015-1016 1020-1025
|
|
# profileIdentityController.js | 3.91 | 100.00 | 0.00 | 5-15 18-178
|
|
# profileModal | | | |
|
|
# ProfileDirectMessageActions.js | 7.64 | 75.00 | 7.41 | 18-27 30-39 42-43 46-74 77-94 97-109 112-136 139-166 169-284 287-310 313-355 358-417 420-556 559-664 667-670 673-676 679-704 707-732 735-790 793-810 813-819 822-828 834-879 883-908 911-927
|
|
# ProfileDirectMessageController.js | 38.00 | 62.50 | 16.07 | 51-52 62-66 70 73 76 79 82 89-90 96-113 118-120 123-134 145-161 164-184 200-229 234-259 262-279 282-287 290-339 342-358 372-443 446-482 507-530 563-564 567-568 571-572 575-576 579-580 583-584 591-592 595-596 599-600 603-604 607-608 611-612 615-616 619-620 623-624 627-628 631-632 635-636 639-640 645-646 649-650 653-654 657-658 661-662 665-666 669-670 673-674 677-678
|
|
# ProfileDirectMessageHelper.js | 10.55 | 30.00 | 7.41 | 16-17 22-26 31 33-37 44-53 56-62 65-72 75-112 115-150 153-166 169-182 185-209 212-260 263-283 286-294 297-307 310-324 327-364 367-381 384-403 406-421 424-444 447-452 455-473 476-486 489-521 524-645 648-684 687-756
|
|
# ProfileDirectMessageRenderer.js | 18.63 | 26.67 | 36.84 | 45-72 78-81 110-111 117-123 132-139 142-148 155-160 163-172 178-181 189-192 197-204 221-227 238-246 252-279 282-429 432-525 528-626 629-766 769-779 782-791 794-803 806-825 828-859 862-905
|
|
# ProfileRelayController.js | 9.01 | 100.00 | 7.69 | 21-30 33-136 139-145 148-200 203-215 218-263 266-352 355-395 398-431 434-446 449-464
|
|
# ProfileStorageController.js | 14.81 | 40.00 | 13.64 | 67-70 73-76 79-82 85-88 91-94 97-100 104-192 195-245 248-251 254-299 302-316 319-333 336-337 340-351 354-492 495-601 604-679 682-695 698-701
|
|
# ProfileWalletController.js | 18.07 | 29.41 | 28.13 | 35-46 49-52 55-58 61-64 67-70 85-92 105-111 115-136 139-187 193-195 197-199 203-204 210-211 224-226 228-231 235-257 260-289 292-312 315-337 340-363 366-387 390-492 495-603 606-677 686-690 696-720 723-740 743-757
|
|
# profileModalContract.js | 67.25 | 84.71 | 46.28 | 30-31 60-62 64-78 80-94 106-113 122-125 155 164-165 235-236 328-329 333-339 343 347-362 366-369 373-394 398-410 420 432-496 525-534 588-591 612-618 634-640 658-659 692-698 707-713 722-732 741-747 756-766 775-779 788-803 841-844 847-850 855-858 864-870 892-895
|
|
# profileModalController.js | 32.02 | 32.71 | 26.91 | 109 122-123 137-138 152-153 163-164 214 226 233 240 242-265 282-286 576 578-581 587-590 595-596 601-610 614-615 624-625 641 697-698 828-835 840 842-850 988-990 1044-1045 1049-1073 1076-1109 1126-1133 1156-1159 1166 1175-1178 1187 1194-1218 1224-1271 1278-1290 1296-1300 1305-1364 1369-1383 1391-1397 1400-1417 1421-1496 1499-1544 1549-1576 1581-1629 1634-1655 1665-1679 1715 1720-1728 1732 1738-1743 1749-1750 1756 1761-1768 1773 1779-1782 1785-1788 1791-1813 1816-1819 1822-1825 1828-1846 1849-1855 1858-1879 1882-1905 1908-1911 1914-1929 1933-1937 1940-1944 1947-1953 1956-1959 1962-1968 1971-1974 1977-1980 1983-1986 1989-1995 2000-2006 2013-2016 2019-2024 2027-2030 2033-2040 2043-2052 2055-2063 2066-2078 2106 2112 2118 2135-2138 2141-2153 2156-2162 2165-2168 2171-2183 2186-2192 2195-2198 2201-2213 2216-2222 2225-2228 2231-2234 2237-2240 2243-2246 2249-2252 2255-2258 2261-2264 2267-2270 2273-2277 2280-2284 2290-2311 2314-2346 2349-2426 2429-2443 2446-2539 2597 2602-2605 2652 2654-2656 2674-2675 2681 2683-2684 2691-2692 2701-2706 2723 2725-2726 2733-2734 2749-2752 2775-2776 2779-2784 2786-2787 2790-2798 2801-2817 2820-2826 2835-2837 2845-2850 2876-2877 2891-2892 2923-2924 2943-2944 2958-2959 2972-2973 2976-3004 3009-3012 3021-3022 3025-3026 3030-3138 3142-3169 3172-3216 3227 3229-3233 3247-3260 3267-3313 3316-3354 3366 3368-3397 3401-3412 3415-3424 3435-3465 3519-3520 3533-3535 3543-3545 3553-3554 3571-3572 3584-3589 3592-3593 3613-3614 3626 3628-3632 3634-3636 3638 3640 3642-3648 3650-3656 3658-3661 3663-3665 3683-3720 3723-3774 3777-3778 3781-3782 3786-3787 3793-3801 3814 3822-3826 3836 3841 3862-3872 3878-3886 3897-3913 3917-3980 3986-3996 4000-4011 4014-4015 4017-4018 4020-4021 4026-4066 4073-4078 4081-4085 4089-4106 4109-4115 4121-4126 4129-4137 4144-4147 4164-4182 4186-4222 4225-4299 4302-4405 4408-4466 4469-4491 4494-4512 4515-4692 4695-4938 4941-4953 4956-4981 4984-5256 5259-5271 5274-5282 5285-5379 5382-5499 5502-5567 5570-5572 5575-5596 5599-5628 5631-5680 5683-5729 5733-5782 5788-5789 5801-5802 5888-5889 5961-5962 5977-5980 5985-5986 5993-5996 6011-6012 6017-6018 6027-6028 6034-6048 6051-6087 6090-6110 6113-6133 6138 6142-6227 6229-6230 6236-6243 6250-6251 6300-6309 6311 6322-6329 6333-6334 6338-6347 6351-6378 6412-6413 6426-6427 6431-6438 6511-6520 6535-6536 6580-6589 6595-6604 6607-6627 6630-6658 6661-6696 6699-6848 6851-6919 6922-7000 7003-7018 7021-7035 7038-7129 7132-7211 7214-7391 7394-7423 7426-7455 7458-7514 7517-7531 7534-7618 7621-7686 7690-7758 7761-7765 7772 7776-7778 7784-7797 7806-7809 7813-7814 7817-7819 7823-7862 7868-7883 7890 7892-7893 7902-7909 7912-7916 7919-7963 7966-8014 8017-8043 8046-8076 8083 8092-8209 8212-8213 8216-8251 8254-8368 8371-8449 8452-8513 8516-8545 8548-8571 8574-8596 8599-8631 8643-8644 8648-8649 8656-8657 8663-8664 8672-8673 8681-8685 8687 8695-8696 8699-8700 8703-8704 8716-8717 8720-8721 8724-8725 8728-8729 8732-8733 8736-8737 8740-8741 8744-8745 8748-8749
|
|
# reactionController.js | 75.47 | 27.69 | 47.37 | 37 59-67 76-78 83-84 96-97 99-100 106-110 120 143-153 156-161 166-167 184-185 191 193-194 199-200 210-211 231-234 246-247 258-259 261-262 268-272 300-301 309 313-314 321-328 330-331 345-346 364-369
|
|
# revertModalController.js | 7.63 | 100.00 | 0.00 | 5-18 21-67 70-117
|
|
# shareNostrController.js | 8.86 | 100.00 | 0.00 | 17-31 34-73 76-236
|
|
# similarContentController.js | 81.68 | 71.76 | 100.00 | 30-31 41-42 59-60 69-73 84-88 105-106 129-139 142-143 155-159 166-167 169-170 174-175 177-178 201-202 210-211 235-236 242-245 252-253 255-256 263 310-311
|
|
# subscriptionHistoryController.js | 11.36 | 100.00 | 7.69 | 20-40 43-87 90-100 103-115 118-133 136-181 184-233 236-282 285-307 310-328 331-351
|
|
# tagPreferenceMenuController.js | 61.67 | 54.24 | 68.75 | 29-54 78-79 84-87 105-106 144-149 154-155 159 173-186 201-214 228-229 233-234 243-244 246-247 249-250 252-253 272-273 280-281 285-308 312-313 318-319 325-337 342-346
|
|
# torrentStatusController.js | 78.74 | 68.97 | 90.00 | 25-29 32-41 110-111 117-126
|
|
# urlHealthController.js | 69.06 | 28.17 | 66.67 | 44-45 52-53 56-64 84-86 93-94 108-109 134-135 140-141 148-150 163-176 186-200 216 219-227 246-249 260-261 264-267 287-288 293-294 299-300 316 330-331 336-340 347-348 356-357 361 375-380 389 391-397 419-426 436-447 454-459 463-464 467-472 479-483 493-499
|
|
# videoListViewController.js | 11.61 | 100.00 | 0.00 | 5-12 15-18 21-49 52-104 107-111
|
|
# videoModalCommentController.js | 6.34 | 100.00 | 0.00 | 8-10 14-19 21-29 33-124 127-242 245-246 249-250 253-254 257-258 261-262 265-266 269-296 299-309 312-326 329-365 368-421 424-534 537-552 555-592 595-619 622-628 631-667 670-681 684-862 865-903 906-937 940-961
|
|
# videoModalController.js | 9.90 | 100.00 | 0.00 | 5-20 23-24 27-28 34-84 87-91 94-98 101-201
|
|
# videoSettingsMenuController.js | 10.53 | 100.00 | 0.00 | 8-20 23-113 116-133 136-148 151-161 164-170
|
|
# views | | | |
|
|
# VideoListView.js | 48.81 | 27.74 | 36.04 | 209-210 214-216 219-221 224-228 232-233 236-237 252-253 256-264 267-277 280-281 284-285 288-289 292-293 296-297 300-301 309-311 314-315 337-338 355-356 367-378 413-414 423-424 434-435 443-445 453-454 458-459 480-481 485-486 563-565 569-579 583-593 597-607 611-618 622-633 637-648 652-666 670-673 677-685 689-692 696-698 702-705 710-711 714-715 730-755 759-784 791-795 801-803 817-840 843-883 897-899 905-907 913-930 934-935 943-944 947-948 953-954 960-961 970-972 974 979-980 986-993 995-996 1001-1002 1010-1011 1016-1023 1026-1037 1046 1048-1062 1066-1104 1107-1117 1120-1129 1132-1133 1136-1140 1143-1151 1154-1214 1217-1243 1247-1255 1259-1274 1277-1314 1317-1341 1344-1347 1350-1390
|
|
# watchHistoryController.js | 7.82 | 100.00 | 0.00 | 11-17 19-31 35-54 57-91 94-112 115-132 135-150 153-221 224-348 351-370
|
|
# zapController.js | 7.05 | 100.00 | 0.00 | 35-96 101-115 118-133 136-161 164-165 168-174 177-183 186-410 413-420 425-433 436-446 449-483 486-521 524-538 541-776 779-830 833-846 849-952 955-1054 1057-1083 1086-1088 1091-1192 1195-1198 1201-1204
|
|
# urlHealthObserver.js | 38.24 | 75.00 | 50.00 | 12-17 21-54 60-61
|
|
# userBlocks.js | 18.92 | 33.78 | 26.47 | 43-44 54-57 64-65 71-75 97-103 105-113 115-163 165-198 200-230 241-243 247-259 266-282 286-288 290-303 306-308 311-313 327-357 359-418 420-442 444-457 468-483 485-500 502-514 516-518 520-557 559-587 589-601 603-614 616-632 634-667 676-677 682-688 710-717 722-738 741-748 751-772 775-786 793-794 797-798 801-802 805-831 836-837 845-851 855-884 887-1629 1632-1660 1663-1675 1680-1681 1684-1685 1698-1707 1710-1716 1719-1728 1737-1738 1742-1827 1830-1903 1906-1977 1980-1981 1984-1985 1992-1993 1998-1999 2003-2006 2009-2012 2023-2027 2029-2031 2034-2035 2039-2041 2044-2045 2055-2067 2079-2080 2083-2087 2092-2097 2106-2107 2110-2115 2118-2133 2136-2139 2143-2144 2156-2157 2177-2208 2247-2258 2261-2273 2286-2289 2293-2294
|
|
# utils | | | |
|
|
# asyncUtils.js | 77.14 | 76.47 | 72.73 | 47-48 69-80 86-87 95-102
|
|
# cardSourceVisibility.js | 88.89 | 73.53 | 100.00 | 23 25-29 36-37 39-40
|
|
# cryptoUtils.js | 17.39 | 50.00 | 0.00 | 7-11 16-53 56-69
|
|
# domUtils.js | 100.00 | 91.67 | 100.00 |
|
|
# formatters.js | 31.75 | 40.00 | 20.00 | 8-21 30-31 35-36 39-40 50-70 76-92 99-126
|
|
# hashtagNormalization.js | 84.00 | 42.86 | 100.00 | 21-22 26-27 31-32 46-47
|
|
# hex.js | 100.00 | 100.00 | 100.00 |
|
|
# linkPreviewSettings.js | 84.00 | 66.67 | 87.50 | 15-17 33-34 43-47 62-63 72-73 91-92 96-97 116-117 133-134 142-143
|
|
# logger.js | 71.76 | 38.24 | 80.00 | 13-14 25-32 50-51 55-58 66 70 74 82 90-91 94-96 103-106 111-112 115-117 133 146-158
|
|
# lruCache.js | 98.17 | 93.33 | 87.50 | 107-108
|
|
# magnetValidators.js | 27.12 | 100.00 | 0.00 | 15-57
|
|
# mediaLoader.js | 23.17 | 100.00 | 0.00 | 13-59 62-75 78-79
|
|
# mime.js | 85.71 | 30.00 | 100.00 | 28-29 36-38 43-44
|
|
# nostrHelpers.js | 37.25 | 62.50 | 33.33 | 10-37 46-72 82-83 87-88 95-99
|
|
# pointer.js | 77.78 | 64.29 | 100.00 | 5-6 10-11 16-17
|
|
# pointerNormalization.js | 35.98 | 34.62 | 60.00 | 6-7 11-12 17-33 37-38 46-47 58-59 62-63 66-67 75-96 100-101 103-104 109-111 114-115 118-119 121-161
|
|
# profileBatchFetcher.js | 13.75 | 100.00 | 0.00 | 12-80
|
|
# profileMedia.js | 95.24 | 94.12 | 100.00 | 9-10 38-39
|
|
# qrcode.js | 4.72 | 20.00 | 0.00 | 12-771 775-776 779-780 788 792 796
|
|
# safeDecode.js | 37.50 | 33.33 | 50.00 | 2-15 19-20 24-25 30-31
|
|
# serviceWorkerFallbackMessages.js | 82.76 | 90.48 | 100.00 | 12-19 54-55
|
|
# simpleEventEmitter.js | 17.50 | 100.00 | 0.00 | 3-5 8-22 25-39
|
|
# storage.js | 42.11 | 41.67 | 50.00 | 11-13 17-18 23-24 30-34 39-40 48-49 54-55 60-61 65-87 90-102 105-114
|
|
# storagePointer.js | 64.33 | 68.42 | 83.33 | 16-23 25-28 51-52 60-61 70-80 84-85 90 95-104 111-122 134-135 155-156
|
|
# torrentHash.js | 26.39 | 100.00 | 0.00 | 9-56 66-68 71-72
|
|
# videoDeduper.js | 89.19 | 72.73 | 100.00 | 18-19 22-23
|
|
# videoPointer.js | 84.92 | 80.65 | 100.00 | 76-77 95-96 100-101 107-111 114-121
|
|
# videoTags.js | 94.12 | 90.24 | 100.00 | 20-21 49-50 54-55 124-125
|
|
# videoTimestamps.js | 98.11 | 95.92 | 100.00 | 45-46
|
|
# videoEventUtils.js | 12.71 | 100.00 | 0.00 | 10-12 14-27 30-75 77-96 98-117
|
|
# viewCounter.js | 37.54 | 25.45 | 44.83 | 70-71 73-74 90-91 96-97 102-103 115-116 119-120 126-128 130-139 141-180 189-190 195-217 223-224 229-230 236 238-239 242-287 292-293 315-316 331-334 338-349 351-368 375-388 391-399 403-404 409-410 417-418 427-428 437-445 447-458 460-537 539-553 555-589 592-597 600-622 625-637 641-642 651-652 663-674
|
|
# watchHistoryDebug.js | 23.32 | 50.00 | 0.00 | 12-14 40-61 63-76 78-87 89-95 97-119 121-152 155-166 169-193
|
|
# watchHistoryService.js | 26.23 | 27.06 | 48.89 | 42-64 81-82 86-87 98-99 109-127 146-147 150-151 159-160 170-173 186-188 191-200 205-215 219-229 232-242 245-260 262-274 278-279 284-285 291-293 298-314 316-327 329-371 374-382 387-388 394-403 409-413 416-421 434-435 438-440 448-465 468-502 504-509 511-521 523-565 567-584 586-657 678-866 868-999 1003-1004 1007-1008 1016-1017 1026-1027 1049-1055 1057-1068 1070-1086 1088-1126 1128-1182 1189-1199 1205-1206 1221-1230 1250-1258 1261-1279 1289-1300 1308-1335 1340-1346 1354-1363 1365-1377
|
|
# webtorrent.js | 12.25 | 66.67 | 4.00 | 31-43 45-67 69-141 143-149 151-160 184-191 198-371 374-375 378-379 382-383 386-389 392-393 400-450 453-485 488-505 508-525 540-561 564-636 639-751 754-771 774-853 856-921 928-987 995-1032
|
|
# webtorrent.min.js | 100.00 | 67.80 | 13.88 |
|
|
# scripts | | | |
|
|
# agent | | | |
|
|
# setup-test-env.js | 47.62 | 12.50 | 0.00 | 6-7 11-12 14-15 19-20 24-33 36-37 41-42
|
|
# tests | | | |
|
|
# app | | | |
|
|
# channel-profile-moderation.test.mjs | 98.47 | 93.14 | 78.22 | 127-128 417-418 426-427 429-430
|
|
# feedCoordinator.test.mjs | 100.00 | 100.00 | 80.00 |
|
|
# hash-change-handler.test.mjs | 98.41 | 95.45 | 86.96 | 24-25
|
|
# hydrate-sidebar-navigation.test.mjs | 97.81 | 77.78 | 42.86 | 100-101 180-181
|
|
# is-user-logged-in.test.mjs | 96.24 | 85.71 | 88.89 | 20-21 26-27 37
|
|
# moderation-overrides.test.mjs | 96.59 | 94.74 | 70.83 | 32-36 131-134
|
|
# moderation-settings-refresh.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# similar-content.test.mjs | 75.52 | 73.33 | 88.24 | 32-33 80-81 86-87 89-90 92-93 95-96 101-158
|
|
# auth | | | |
|
|
# signingAdapter.test.mjs | 97.80 | 93.33 | 86.67 | 20-21
|
|
# compliance | | | |
|
|
# nip04_44_compliance.test.mjs | 89.58 | 87.50 | 66.67 | 11-20
|
|
# nip07_compliance.test.mjs | 97.22 | 84.62 | 69.23 | 8-9
|
|
# nip65_compliance.test.mjs | 89.69 | 84.62 | 55.56 | 15-23 50
|
|
# video_note_compliance.test.mjs | 83.49 | 92.31 | 78.57 | 9-26
|
|
# designSystem | | | |
|
|
# dynamicStyles.test.mjs | 95.65 | 69.05 | 100.00 | 70-79 185-186
|
|
# docs | | | |
|
|
# verify-upload-claims.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# feed-engine | | | |
|
|
# explore-diversity.test.mjs | 100.00 | 100.00 | 87.50 |
|
|
# explore-scorer.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# kids-scorer.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# tag-preference-filter.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# helpers | | | |
|
|
# moderation-test-helpers.mjs | 81.99 | 64.63 | 65.63 | 20-21 29-30 35-36 50-51 62 85-102 132-133 186 189 205 208 211 214 217 220 246-247 251-252 257-273 277-278 281-282 286-292 331-332 335-337 340-342 345-347 360-362 415-416 421-422
|
|
# moderation | | | |
|
|
# hide-thresholds.test.mjs | 100.00 | 94.52 | 90.67 |
|
|
# mocks | | | |
|
|
# bootstrap-trust-seeds-loader.mjs | 100.00 | 92.31 | 100.00 |
|
|
# submit-report.test.mjs | 97.09 | 94.12 | 87.50 | 34 44-45
|
|
# trust-seeds.test.mjs | 98.86 | 86.96 | 85.71 | 159 173 181
|
|
# trusted-mute-lists.test.mjs | 97.80 | 86.96 | 75.00 | 90-91 94-95
|
|
# trusted-report-count.test.mjs | 98.70 | 90.48 | 76.19 | 105-106 109
|
|
# video-card.test.mjs | 95.77 | 89.58 | 66.67 | 44 46 66-68 71-73 76-83 345-348 411-414
|
|
# nostr | | | |
|
|
# adapters.test.mjs | 88.07 | 70.59 | 57.89 | 35-38 68-79 84-85 90-91 135
|
|
# cachePolicies.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# client.test.mjs | 97.99 | 96.08 | 88.68 | 7-8 23-24 27-28
|
|
# comment-events.test.mjs | 99.75 | 90.57 | 89.80 | 38-39
|
|
# countDiagnostics.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# decryptionSchemeCache.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# defaultClient.test.mjs | 83.33 | 80.00 | 38.89 | 7-11 14-20
|
|
# dm-direct-message-flow.test.mjs | 97.39 | 86.00 | 92.50 | 36 62-63 128-129 134-135 140-141 400-401
|
|
# dmDecryptDiagnostics.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# dmDecryptorPreference.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# dmDecryptWorkerClient.test.mjs | 98.43 | 100.00 | 93.94 | 23-26
|
|
# dmSignalEvents.test.mjs | 91.16 | 88.46 | 94.74 | 8-16 28 30-35
|
|
# edit-video-dtag.test.mjs | 99.40 | 80.00 | 90.00 | 25
|
|
# eventsCacheStore.test.mjs | 96.88 | 80.00 | 77.78 | 7-8 26-27
|
|
# eventsMap.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# integration-remote-flow.test.mjs | 90.03 | 46.15 | 57.69 | 7-10 16 21-26 75 86-87 139 151-153 193-194 218-220 231-232 235 241 249-250 255-256 259-260 283 286
|
|
# maxListenerDiagnostics.test.mjs | 98.25 | 95.45 | 100.00 | 8-9
|
|
# nip04WorkerClient.test.mjs | 97.69 | 82.35 | 97.62 | 14-15 26-29
|
|
# nip07Adapter-race-condition.test.mjs | 100.00 | 90.91 | 56.25 |
|
|
# nip46Connector.test.mjs | 97.56 | 100.00 | 75.00 | 39-40 61-62
|
|
# nostrClientRegistry.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# publishHelpers.test.mjs | 97.90 | 100.00 | 80.00 | 19-21
|
|
# reaction-events.test.mjs | 92.80 | 86.67 | 78.57 | 29-33 59-61 109
|
|
# revert-video-dtag.test.mjs | 99.21 | 93.75 | 86.67 | 24
|
|
# session-actor.test.mjs | 99.03 | 85.71 | 100.00 | 53
|
|
# sessionActor.test.mjs | 97.50 | 75.00 | 100.00 | 20-22
|
|
# sign-request-queue.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# signers.test.mjs | 97.37 | 75.00 | 33.33 | 33
|
|
# syncMetadataStore.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# toolkit.test.mjs | 100.00 | 100.00 | 62.50 |
|
|
# videoEventBuffer.test.mjs | 100.00 | 95.00 | 94.12 |
|
|
# videoPayloadBuilder.test.mjs | 100.00 | 94.44 | 100.00 |
|
|
# performance | | | |
|
|
# resolvePostedAt.test.mjs | 83.48 | 75.00 | 38.10 | 7-21 25-28
|
|
# services | | | |
|
|
# attachmentService.test.mjs | 96.39 | 87.50 | 100.00 | 13-14 34-35 39-40
|
|
# authUtils.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# discussionCountService.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# exploreDataService.optimization.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# exploreDataService.test.mjs | 100.00 | 96.67 | 100.00 |
|
|
# link-preview-service.test.mjs | 97.56 | 94.44 | 88.24 | 38-39 70
|
|
# moderation-action-controller.test.mjs | 100.00 | 100.00 | 85.71 |
|
|
# nostr-service.test.mjs | 100.00 | 100.00 | 88.24 |
|
|
# playbackService_forcedSource.test.mjs | 95.73 | 93.55 | 87.50 | 22-29 70
|
|
# playbackService_order.test.mjs | 98.68 | 100.00 | 86.67 | 28-30
|
|
# playbackService.test.mjs | 96.24 | 96.55 | 100.00 | 18-25
|
|
# profileMetadataService.test.mjs | 99.22 | 100.00 | 92.59 | 18-19
|
|
# r2Service.test.mjs | 98.34 | 89.47 | 100.00 | 30-31 131
|
|
# relay-health-service.test.mjs | 98.71 | 92.68 | 100.00 | 74 180 201-202
|
|
# s3Service.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# s3UploadService.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# trustBootstrap.test.mjs | 96.34 | 74.07 | 95.00 | 6-12
|
|
# state | | | |
|
|
# appState.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# cache-saved-profiles.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# cache.test.mjs | 98.73 | 92.31 | 100.00 | 113-114
|
|
# profile-cache.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# profile-settings-store.test.mjs | 97.83 | 85.71 | 100.00 | 8-9
|
|
# test-helpers | | | |
|
|
# setup-localstorage.mjs | 92.94 | 80.00 | 60.00 | 10-11 14-15 62-63
|
|
# wait-for.mjs | 50.00 | 66.67 | 50.00 | 10-19
|
|
# test-setup.mjs | 93.94 | 33.33 | 0.00 | 17-18
|
|
# torrent | | | |
|
|
# service-worker-fallback-message.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# style-helpers.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# toast-service.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# ui | | | |
|
|
# app-chrome-controller.test.mjs | 100.00 | 100.00 | 50.00 |
|
|
# creatorProfileController.test.mjs | 100.00 | 100.00 | 82.61 |
|
|
# engagement-controller.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# hashtag-strip-helper-bounce.test.mjs | 97.22 | 90.00 | 72.73 | 26 114-115 136
|
|
# helpers | | | |
|
|
# jsdom-test-helpers.mjs | 86.96 | 50.00 | 100.00 | 25-26 28-29 31-32
|
|
# mocks | | | |
|
|
# floating-ui-test-loader.mjs | 100.00 | 100.00 | 100.00 |
|
|
# popoverEngine.test.mjs | 99.48 | 95.56 | 97.30 | 16-19
|
|
# profile-modal-moderation-settings.test.mjs | 100.00 | 100.00 | 58.62 |
|
|
# profileModalController-addProfile.test.mjs | 96.07 | 88.46 | 67.74 | 49-55
|
|
# reactionController.test.mjs | 100.00 | 100.00 | 91.67 |
|
|
# similar-content-card.test.mjs | 97.96 | 90.00 | 100.00 | 168-171
|
|
# similarContentController.test.mjs | 100.00 | 100.00 | 93.10 |
|
|
# storageService.test.mjs | 92.31 | 75.00 | 84.62 | 19-20 23-26 51-53 56-59
|
|
# tag-pill-list.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# tag-preference-menu.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# tagPreferenceMenuController.test.mjs | 100.00 | 100.00 | 87.50 |
|
|
# torrentStatusController.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# uploadModal-integration.test.mjs | 99.53 | 95.45 | 66.67 | 99
|
|
# uploadModal-reset.test.mjs | 96.96 | 100.00 | 64.52 | 22-23 26-28 156-157
|
|
# url-health-controller.test.mjs | 94.87 | 87.23 | 86.84 | 54-56 61-62 64-65 108 136 168
|
|
# video-list-view-popular-tags.test.mjs | 100.00 | 93.33 | 68.75 |
|
|
# video-list-view-sorting.test.mjs | 100.00 | 77.78 | 100.00 |
|
|
# unit | | | |
|
|
# app_guard_logic.test.mjs | 100.00 | 100.00 | 91.67 |
|
|
# client-count-resilience.test.mjs | 89.47 | 85.71 | 55.56 | 8-13
|
|
# comment-avatar.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# editModalController.test.mjs | 98.75 | 93.55 | 93.33 | 76-77
|
|
# embed_player_modal.test.mjs | 79.41 | 83.33 | 50.00 | 7-13
|
|
# embed-accent.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# hashChangeHandler.test.mjs | 100.00 | 100.00 | 71.43 |
|
|
# notificationController.test.mjs | 100.00 | 100.00 | 94.74 |
|
|
# searchFilters.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# security-config.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# utils | | | |
|
|
# cardSourceVisibility.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# domUtils.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# hex.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# linkPreviewSettings.test.mjs | 99.49 | 100.00 | 96.67 | 133
|
|
# lruCache.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# profileMedia.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# video-deduper.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# video-tags.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# videoPointer.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# videoTimestamps.test.mjs | 100.00 | 100.00 | 100.00 |
|
|
# watchHistory | | | |
|
|
# watch-history-telemetry.test.mjs | 95.54 | 90.91 | 64.29 | 62-63 71-78
|
|
# torrent | | | |
|
|
# ui | | | |
|
|
# styleHelpers.js | 100.00 | 100.00 | 100.00 |
|
|
# toastService.js | 85.34 | 52.38 | 55.56 | 19-20 27-28 103-104 110-111 141-144 153-156 161-162 168-172 175 181 184 190-191
|
|
# vendor | | | |
|
|
# crypto-helpers.bundle.min.js | 100.00 | 69.51 | 55.84 |
|
|
# floating-ui.dom.bundle.min.js | 100.00 | 100.00 | 1.33 |
|
|
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
# all files | 42.39 | 59.63 | 48.63 |
|
|
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
# end of coverage report
|
|
Run 1
|
|
|
|
> [email protected] test:unit
|
|
> node scripts/run-unit-tests.mjs
|
|
|
|
|
|
→ Running tests/app-batch-fetch-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: batchFetchProfiles handles fast and failing relays
|
|
ok 1 - batchFetchProfiles handles fast and failing relays
|
|
---
|
|
duration_ms: 3.760861
|
|
type: 'test'
|
|
...
|
|
# Subtest: batchFetchProfiles respects forceRefresh
|
|
ok 2 - batchFetchProfiles respects forceRefresh
|
|
---
|
|
duration_ms: 0.882489
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.758572
|
|
|
|
→ Running tests/app-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: Initial state is clean
|
|
ok 1 - Initial state is clean
|
|
---
|
|
duration_ms: 2.341268
|
|
type: 'test'
|
|
...
|
|
# Subtest: setPubkey() updates state and notifies subscribers
|
|
ok 2 - setPubkey() updates state and notifies subscribers
|
|
---
|
|
duration_ms: 0.916936
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentUserNpub() updates state
|
|
ok 3 - setCurrentUserNpub() updates state
|
|
---
|
|
duration_ms: 0.380604
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentVideo() updates state
|
|
ok 4 - setCurrentVideo() updates state
|
|
---
|
|
duration_ms: 0.592257
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap() updates state
|
|
ok 5 - setVideosMap() updates state
|
|
---
|
|
duration_ms: 0.545362
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideoSubscription() updates state
|
|
ok 6 - setVideoSubscription() updates state
|
|
---
|
|
duration_ms: 0.330498
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState() updates state and notifies modal subscribers
|
|
ok 7 - setModalState() updates state and notifies modal subscribers
|
|
---
|
|
duration_ms: 0.821786
|
|
type: 'test'
|
|
...
|
|
# Subtest: Global subscriber receives updates
|
|
ok 8 - Global subscriber receives updates
|
|
---
|
|
duration_ms: 0.590594
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState() clears all state and notifies
|
|
ok 9 - resetAppState() clears all state and notifies
|
|
---
|
|
duration_ms: 0.600071
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 9.122971
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.643981
|
|
|
|
→ Running tests/app/channel-profile-moderation.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderChannelVideosFromList decorates videos before storing
|
|
ok 1 - renderChannelVideosFromList decorates videos before storing
|
|
---
|
|
duration_ms: 137.813252
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderChannelVideosFromList applies moderation blur without existing metadata
|
|
ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata
|
|
---
|
|
duration_ms: 42.959271
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
ok 3 - applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
---
|
|
duration_ms: 12.363121
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation override clears channel blur via event wiring
|
|
ok 4 - moderation override clears channel blur via event wiring
|
|
---
|
|
duration_ms: 30.663358
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel header moderation badge reflects blur state and override actions
|
|
ok 5 - channel header moderation badge reflects blur state and override actions
|
|
---
|
|
duration_ms: 28.014003
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel video cards update moderation state in place when summary changes
|
|
ok 6 - channel video cards update moderation state in place when summary changes
|
|
---
|
|
duration_ms: 29.673418
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 297.362896
|
|
|
|
→ Running tests/app/feedCoordinator.test.mjs
|
|
TAP version 13
|
|
# Subtest: createFeedCoordinator - loadForYouVideos
|
|
# Subtest: loadForYouVideos executes successfully
|
|
ok 1 - loadForYouVideos executes successfully
|
|
---
|
|
duration_ms: 2.32841
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - createFeedCoordinator - loadForYouVideos
|
|
---
|
|
duration_ms: 4.161309
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.55981
|
|
|
|
→ Running tests/app/hash-change-handler.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleHashChange defaults to for-you when logged in
|
|
ok 1 - handleHashChange defaults to for-you when logged in
|
|
---
|
|
duration_ms: 84.803839
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange defaults to most-recent-videos when logged out
|
|
ok 2 - handleHashChange defaults to most-recent-videos when logged out
|
|
---
|
|
duration_ms: 10.89721
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange respects explicit view regardless of login state
|
|
ok 3 - handleHashChange respects explicit view regardless of login state
|
|
---
|
|
duration_ms: 10.620974
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 124.745819
|
|
|
|
→ Running tests/app/hydrate-sidebar-navigation.test.mjs
|
|
TAP version 13
|
|
# Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
ok 1 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
---
|
|
duration_ms: 95.326022
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
ok 2 - hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
---
|
|
duration_ms: 13.53017
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 120.830598
|
|
|
|
→ Running tests/app/is-user-logged-in.test.mjs
|
|
TAP version 13
|
|
# Subtest: isUserLoggedIn returns false when no user pubkey is set
|
|
ok 1 - isUserLoggedIn returns false when no user pubkey is set
|
|
---
|
|
duration_ms: 1.563027
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn treats extension logins as authenticated
|
|
ok 2 - isUserLoggedIn treats extension logins as authenticated
|
|
---
|
|
duration_ms: 0.430147
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn guards against mismatched nostrClient state
|
|
ok 3 - isUserLoggedIn guards against mismatched nostrClient state
|
|
---
|
|
duration_ms: 0.241749
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn ignores anonymous session actor mismatches
|
|
ok 4 - isUserLoggedIn ignores anonymous session actor mismatches
|
|
---
|
|
duration_ms: 0.317079
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn rejects mismatched managed session actors
|
|
ok 5 - isUserLoggedIn rejects mismatched managed session actors
|
|
---
|
|
duration_ms: 0.407698
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.200952
|
|
|
|
→ Running tests/app/moderation-overrides.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationOverride decorates stored and current videos then refreshes UI
|
|
ok 1 - handleModerationOverride decorates stored and current videos then refreshes UI
|
|
---
|
|
duration_ms: 6.223314
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationOverride resumes deferred playback
|
|
ok 2 - handleModerationOverride resumes deferred playback
|
|
---
|
|
duration_ms: 1.268403
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
ok 3 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
---
|
|
duration_ms: 4.057653
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock returns false when viewer is logged out
|
|
ok 4 - handleModerationBlock returns false when viewer is logged out
|
|
---
|
|
duration_ms: 1.093278
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.478547
|
|
|
|
→ Running tests/app/moderation-settings-refresh.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
ok 1 - handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
---
|
|
duration_ms: 4.561499
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.967417
|
|
|
|
→ Running tests/app/similar-content.test.mjs
|
|
TAP version 13
|
|
# Subtest: orders similar videos by shared tags then timestamp
|
|
ok 1 - orders similar videos by shared tags then timestamp
|
|
---
|
|
duration_ms: 3.234484
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns no matches when the active video lacks tags
|
|
ok 2 - returns no matches when the active video lacks tags
|
|
---
|
|
duration_ms: 0.435017
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips candidates without tag metadata
|
|
ok 3 - skips candidates without tag metadata
|
|
---
|
|
duration_ms: 0.518398
|
|
type: 'test'
|
|
...
|
|
# Subtest: filters NSFW and private videos when NSFW content is disabled
|
|
ok 4 - filters NSFW and private videos when NSFW content is disabled
|
|
---
|
|
duration_ms: 0.574069
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.860585
|
|
|
|
→ Running tests/auth/signingAdapter.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNip07SigningAdapter
|
|
# Subtest: uses explicit extension if provided
|
|
ok 1 - uses explicit extension if provided
|
|
---
|
|
duration_ms: 2.466932
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to window.nostr if no extension provided
|
|
ok 2 - falls back to window.nostr if no extension provided
|
|
---
|
|
duration_ms: 0.632421
|
|
type: 'test'
|
|
...
|
|
# Subtest: throws error if no extension available
|
|
ok 3 - throws error if no extension available
|
|
---
|
|
duration_ms: 1.55125
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizes explicit extension over window.nostr
|
|
ok 4 - prioritizes explicit extension over window.nostr
|
|
---
|
|
duration_ms: 0.698169
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - createNip07SigningAdapter
|
|
---
|
|
duration_ms: 8.147776
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.354185
|
|
|
|
→ Running tests/comment-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
ok 1 - buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
---
|
|
duration_ms: 2.846309
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
ok 2 - buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
---
|
|
duration_ms: 0.498718
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent normalizes relays and preserves explicit overrides
|
|
ok 3 - buildCommentEvent normalizes relays and preserves explicit overrides
|
|
---
|
|
duration_ms: 0.779128
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent falls back to event pointers when no address is supplied
|
|
ok 4 - buildCommentEvent falls back to event pointers when no address is supplied
|
|
---
|
|
duration_ms: 0.268395
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent accepts partial metadata for parent overrides
|
|
ok 5 - buildCommentEvent accepts partial metadata for parent overrides
|
|
---
|
|
duration_ms: 0.350129
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent sanitizes additional tags before signing
|
|
ok 6 - buildCommentEvent sanitizes additional tags before signing
|
|
---
|
|
duration_ms: 0.815168
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.493554
|
|
|
|
→ Running tests/comment-thread-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: CommentThreadService caches mixed-case video ids consistently
|
|
ok 1 - CommentThreadService caches mixed-case video ids consistently
|
|
---
|
|
duration_ms: 3.421694
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache read failures
|
|
ok 2 - CommentThreadService surfaces cache read failures
|
|
---
|
|
duration_ms: 0.773802
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache write failures
|
|
ok 3 - CommentThreadService surfaces cache write failures
|
|
---
|
|
duration_ms: 0.469123
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService persists caches safely during teardown failures
|
|
ok 4 - CommentThreadService persists caches safely during teardown failures
|
|
---
|
|
duration_ms: 1.88259
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService logs cache usage and fallback decisions
|
|
ok 5 - CommentThreadService logs cache usage and fallback decisions
|
|
---
|
|
duration_ms: 1.281907
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case event ids in thread state
|
|
ok 6 - CommentThreadService normalizes mixed-case event ids in thread state
|
|
---
|
|
duration_ms: 2.056375
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
ok 7 - CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
---
|
|
duration_ms: 0.960887
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
ok 8 - CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
---
|
|
duration_ms: 0.945646
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService retries profile hydration before succeeding
|
|
ok 9 - CommentThreadService retries profile hydration before succeeding
|
|
---
|
|
duration_ms: 76.922425
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces profile hydration failures after retries
|
|
ok 10 - CommentThreadService surfaces profile hydration failures after retries
|
|
---
|
|
duration_ms: 201.603109
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments accepts builder events without parent ids and filters replies
|
|
ok 11 - listVideoComments accepts builder events without parent ids and filters replies
|
|
---
|
|
duration_ms: 11.140367
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
ok 12 - CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
---
|
|
duration_ms: 34.90434
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService loadThread falls back to event id when address is missing
|
|
ok 13 - CommentThreadService loadThread falls back to event id when address is missing
|
|
---
|
|
duration_ms: 2.337092
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService requests and snapshots comments by root identifier
|
|
ok 14 - CommentThreadService requests and snapshots comments by root identifier
|
|
---
|
|
duration_ms: 1.96255
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService falls back to pointerIdentifiers root id
|
|
ok 15 - CommentThreadService falls back to pointerIdentifiers root id
|
|
---
|
|
duration_ms: 1.81071
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
ok 16 - CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
---
|
|
duration_ms: 11.370166
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService teardown cancels hydration timers
|
|
ok 17 - CommentThreadService teardown cancels hydration timers
|
|
---
|
|
duration_ms: 82.553054
|
|
type: 'test'
|
|
...
|
|
1..17
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 447.679065
|
|
|
|
→ Running tests/compliance/nip04_44_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-04/44 Compliance: Encryption Preference
|
|
# Subtest: createNip46Cipher prefers nip44.v2 when available
|
|
ok 1 - createNip46Cipher prefers nip44.v2 when available
|
|
---
|
|
duration_ms: 36.747759
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Cipher falls back to nip04 if nip44 is missing
|
|
ok 2 - createNip46Cipher falls back to nip04 if nip44 is missing
|
|
---
|
|
duration_ms: 13.858239
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-04/44 Compliance: Encryption Preference
|
|
---
|
|
duration_ms: 165.67113
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-04/44 Compliance: Decryption Fallback
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
ok 1 - decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
---
|
|
duration_ms: 34.705828
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip04 payload
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip04 payload
|
|
---
|
|
duration_ms: 48.532949
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - NIP-04/44 Compliance: Decryption Fallback
|
|
---
|
|
duration_ms: 86.298221
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 276.827261
|
|
|
|
→ Running tests/compliance/nip07_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Compliance: Retry Logic
|
|
# Subtest: runNip07WithRetry succeeds on first try
|
|
ok 1 - runNip07WithRetry succeeds on first try
|
|
---
|
|
duration_ms: 3.243361
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry retries on timeout error
|
|
ok 2 - runNip07WithRetry retries on timeout error
|
|
---
|
|
duration_ms: 21.411265
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry fails after max retries or if error is not timeout
|
|
ok 3 - runNip07WithRetry fails after max retries or if error is not timeout
|
|
---
|
|
duration_ms: 2.08703
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - NIP-07 Compliance: Retry Logic
|
|
---
|
|
duration_ms: 29.654697
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 67.163088
|
|
|
|
→ Running tests/compliance/nip65_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-65 Compliance: Relay List Loading
|
|
# Subtest: loadRelayList requests Kind 10002
|
|
ok 1 - loadRelayList requests Kind 10002
|
|
---
|
|
duration_ms: 7.137426
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadRelayList parses r tags correctly
|
|
ok 2 - loadRelayList parses r tags correctly
|
|
---
|
|
duration_ms: 0.714242
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-65 Compliance: Relay List Loading
|
|
---
|
|
duration_ms: 227.774281
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 251.50364
|
|
|
|
→ Running tests/compliance/video_note_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: Video Note Compliance (Kind 30078 & NIP-71)
|
|
# Subtest: prepareVideoPublishPayload creates Kind 30078 event
|
|
ok 1 - prepareVideoPublishPayload creates Kind 30078 event
|
|
---
|
|
duration_ms: 4.361433
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
ok 2 - prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
---
|
|
duration_ms: 1.798588
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Video Note Compliance (Kind 30078 & NIP-71)
|
|
---
|
|
duration_ms: 80.51876
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 101.943687
|
|
|
|
→ Running tests/design-system-metrics.test.mjs
|
|
TAP version 13
|
|
# Subtest: metric probe falls back to numeric parsing when measurement fails
|
|
ok 1 - metric probe falls back to numeric parsing when measurement fails
|
|
---
|
|
duration_ms: 458.963575
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 483.938177
|
|
|
|
→ Running tests/designSystem/dynamicStyles.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/designSystem/dynamicStyles.js
|
|
# Subtest: registerScope
|
|
# Subtest: should register a scope and return a string ID
|
|
ok 1 - should register a scope and return a string ID
|
|
---
|
|
duration_ms: 175.163067
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a style element or use adoptedStyleSheets
|
|
ok 2 - should create a style element or use adoptedStyleSheets
|
|
---
|
|
duration_ms: 29.605558
|
|
type: 'test'
|
|
...
|
|
# Subtest: should insert rules with the correct selector
|
|
ok 3 - should insert rules with the correct selector
|
|
---
|
|
duration_ms: 23.999014
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle "&" in selectors
|
|
ok 4 - should handle "&" in selectors
|
|
---
|
|
duration_ms: 20.034352
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - registerScope
|
|
---
|
|
duration_ms: 251.021859
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setVariables
|
|
# Subtest: should update CSS variables on the scope
|
|
ok 1 - should update CSS variables on the scope
|
|
---
|
|
duration_ms: 21.81645
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle removing variables
|
|
ok 2 - should handle removing variables
|
|
---
|
|
duration_ms: 26.659557
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setVariables
|
|
---
|
|
duration_ms: 49.460551
|
|
type: 'suite'
|
|
...
|
|
# Subtest: releaseScope
|
|
# Subtest: should remove rules and clean up
|
|
ok 1 - should remove rules and clean up
|
|
---
|
|
duration_ms: 19.207251
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for non-existent scope
|
|
ok 2 - should return false for non-existent scope
|
|
---
|
|
duration_ms: 16.107038
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - releaseScope
|
|
---
|
|
duration_ms: 35.911225
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Isolation
|
|
# Subtest: should manage scopes independently for different documents
|
|
ok 1 - should manage scopes independently for different documents
|
|
---
|
|
duration_ms: 57.427789
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 4 - Isolation
|
|
---
|
|
duration_ms: 57.716976
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Edge cases
|
|
# Subtest: should handle invalid selectors gracefully
|
|
ok 1 - should handle invalid selectors gracefully
|
|
---
|
|
duration_ms: 17.567288
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing document gracefully
|
|
ok 2 - should handle missing document gracefully
|
|
---
|
|
duration_ms: 12.122874
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fallback to <style> element if CSSStyleSheet is missing
|
|
ok 3 - should fallback to <style> element if CSSStyleSheet is missing
|
|
---
|
|
duration_ms: 30.424822
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 5 - Edge cases
|
|
---
|
|
duration_ms: 60.936699
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - js/designSystem/dynamicStyles.js
|
|
---
|
|
duration_ms: 457.572062
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 6
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 517.371103
|
|
|
|
→ Running tests/dm-block-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM block/mute filtering
|
|
# Subtest: setDmBlockChecker
|
|
# Subtest: should accept a function
|
|
ok 1 - should accept a function
|
|
---
|
|
duration_ms: 3.764737
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed null
|
|
ok 2 - should clear checker when passed null
|
|
---
|
|
duration_ms: 1.17258
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed non-function
|
|
ok 3 - should clear checker when passed non-function
|
|
---
|
|
duration_ms: 1.831958
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - setDmBlockChecker
|
|
---
|
|
duration_ms: 9.914891
|
|
type: 'suite'
|
|
...
|
|
# Subtest: applyDirectMessage with block checker
|
|
# Subtest: should drop messages from blocked senders
|
|
ok 1 - should drop messages from blocked senders
|
|
---
|
|
duration_ms: 2.260043
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow messages from non-blocked senders
|
|
ok 2 - should allow messages from non-blocked senders
|
|
---
|
|
duration_ms: 6.12505
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow all messages when no block checker is set
|
|
ok 3 - should allow all messages when no block checker is set
|
|
---
|
|
duration_ms: 1.709682
|
|
type: 'test'
|
|
...
|
|
# Subtest: should block outgoing messages to blocked recipients
|
|
ok 4 - should block outgoing messages to blocked recipients
|
|
---
|
|
duration_ms: 1.202931
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyDirectMessage with block checker
|
|
---
|
|
duration_ms: 12.799359
|
|
type: 'suite'
|
|
...
|
|
# Subtest: _isDmRemoteBlocked
|
|
# Subtest: should return false when no checker is set
|
|
ok 1 - should return false when no checker is set
|
|
---
|
|
duration_ms: 1.613839
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true for blocked remote pubkey
|
|
ok 2 - should return true for blocked remote pubkey
|
|
---
|
|
duration_ms: 1.481178
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for allowed remote pubkey
|
|
ok 3 - should return false for allowed remote pubkey
|
|
---
|
|
duration_ms: 1.195995
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle checker that throws
|
|
ok 4 - should handle checker that throws
|
|
---
|
|
duration_ms: 1.040517
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - _isDmRemoteBlocked
|
|
---
|
|
duration_ms: 6.155184
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - DM block/mute filtering
|
|
---
|
|
duration_ms: 31.014108
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 4
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 77.473295
|
|
|
|
→ Running tests/dm-db.test.mjs
|
|
TAP version 13
|
|
# Subtest: writeMessages normalizes records before storing
|
|
ok 1 - writeMessages normalizes records before storing
|
|
---
|
|
duration_ms: 24.65866
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateConversationFromMessage persists metadata updates
|
|
ok 2 - updateConversationFromMessage persists metadata updates
|
|
---
|
|
duration_ms: 8.918988
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 47.553562
|
|
|
|
→ Running tests/dm-decryptor.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM handles kind 4 events with nip04 ciphertext
|
|
ok 1 - decryptDM handles kind 4 events with nip04 ciphertext
|
|
---
|
|
duration_ms: 162.489204
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM prefers recipient pubkeys when actor is the sender
|
|
ok 2 - decryptDM prefers recipient pubkeys when actor is the sender
|
|
---
|
|
duration_ms: 37.231595
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM unwraps kind 1059 gift wraps with nip44
|
|
ok 3 - decryptDM unwraps kind 1059 gift wraps with nip44
|
|
---
|
|
duration_ms: 104.981302
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM returns failure when decryptors are unavailable
|
|
ok 4 - decryptDM returns failure when decryptors are unavailable
|
|
---
|
|
duration_ms: 0.997508
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 337.581751
|
|
|
|
→ Running tests/dm-normalization.test.mjs
|
|
TAP version 13
|
|
# Subtest: direct message normalization hashes conversations consistently
|
|
ok 1 - direct message normalization hashes conversations consistently
|
|
---
|
|
duration_ms: 37.748361
|
|
type: 'test'
|
|
...
|
|
# Subtest: direct message list dedupes entries by event id
|
|
ok 2 - direct message list dedupes entries by event id
|
|
---
|
|
duration_ms: 17.702421
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/docs/verify-upload-claims.test.mjs
|
|
TAP version 13
|
|
# Subtest: Documentation Accuracy Verification
|
|
# Subtest: setup
|
|
ok 1 - setup
|
|
---
|
|
duration_ms: 15.694992
|
|
type: 'test'
|
|
...
|
|
# Subtest: should list accepted video file extensions in docs matching the HTML accept attribute
|
|
ok 2 - should list accepted video file extensions in docs matching the HTML accept attribute
|
|
---
|
|
duration_ms: 1.124217
|
|
type: 'test'
|
|
...
|
|
# Subtest: should state Title is required in docs and be required in HTML
|
|
ok 3 - should state Title is required in docs and be required in HTML
|
|
---
|
|
duration_ms: 0.78771
|
|
type: 'test'
|
|
...
|
|
# Subtest: should mention 2GB limit recommendation in docs and HTML
|
|
ok 4 - should mention 2GB limit recommendation in docs and HTML
|
|
---
|
|
duration_ms: 0.619429
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Documentation Accuracy Verification
|
|
---
|
|
duration_ms: 21.237945
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 40.217372
|
|
|
|
→ Running tests/edit-modal-submit-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: ignores additional submissions while pending without spurious errors
|
|
ok 1 - ignores additional submissions while pending without spurious errors
|
|
---
|
|
duration_ms: 573.207516
|
|
type: 'test'
|
|
...
|
|
# Subtest: editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
ok 2 - editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
---
|
|
duration_ms: 263.630546
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not show missing video error after modal closes
|
|
ok 3 - does not show missing video error after modal closes
|
|
---
|
|
duration_ms: 141.729185
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1002.291552
|
|
|
|
→ Running tests/event-schemas.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Event Schemas
|
|
# Subtest: should validate buildVideoPostEvent
|
|
ok 1 - should validate buildVideoPostEvent
|
|
---
|
|
duration_ms: 3.631527
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildVideoMirrorEvent
|
|
ok 2 - should validate buildVideoMirrorEvent
|
|
---
|
|
duration_ms: 0.560697
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRepostEvent
|
|
ok 3 - should validate buildRepostEvent
|
|
---
|
|
duration_ms: 0.588213
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildShareEvent
|
|
ok 4 - should validate buildShareEvent
|
|
---
|
|
duration_ms: 0.996042
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRelayListEvent
|
|
ok 5 - should validate buildRelayListEvent
|
|
---
|
|
duration_ms: 0.784018
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmRelayListEvent
|
|
ok 6 - should validate buildDmRelayListEvent
|
|
---
|
|
duration_ms: 0.723258
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildProfileMetadataEvent
|
|
ok 7 - should validate buildProfileMetadataEvent
|
|
---
|
|
duration_ms: 0.828716
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildMuteListEvent
|
|
ok 8 - should validate buildMuteListEvent
|
|
---
|
|
duration_ms: 0.91679
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDeletionEvent
|
|
ok 9 - should validate buildDeletionEvent
|
|
---
|
|
duration_ms: 1.31033
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildLegacyDirectMessageEvent
|
|
ok 10 - should validate buildLegacyDirectMessageEvent
|
|
---
|
|
duration_ms: 0.793255
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmAttachmentEvent
|
|
ok 11 - should validate buildDmAttachmentEvent
|
|
---
|
|
duration_ms: 0.604735
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmReadReceiptEvent
|
|
ok 12 - should validate buildDmReadReceiptEvent
|
|
---
|
|
duration_ms: 0.542318
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmTypingIndicatorEvent
|
|
ok 13 - should validate buildDmTypingIndicatorEvent
|
|
---
|
|
duration_ms: 0.627814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildViewEvent
|
|
ok 14 - should validate buildViewEvent
|
|
---
|
|
duration_ms: 0.912179
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildZapRequestEvent
|
|
ok 15 - should validate buildZapRequestEvent
|
|
---
|
|
duration_ms: 0.594697
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildReactionEvent
|
|
ok 16 - should validate buildReactionEvent
|
|
---
|
|
duration_ms: 1.37706
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildCommentEvent
|
|
ok 17 - should validate buildCommentEvent
|
|
---
|
|
duration_ms: 1.396717
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildWatchHistoryEvent
|
|
ok 18 - should validate buildWatchHistoryEvent
|
|
---
|
|
duration_ms: 0.656609
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildSubscriptionListEvent
|
|
ok 19 - should validate buildSubscriptionListEvent
|
|
---
|
|
duration_ms: 0.436254
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildBlockListEvent
|
|
ok 20 - should validate buildBlockListEvent
|
|
---
|
|
duration_ms: 0.351651
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildHashtagPreferenceEvent
|
|
ok 21 - should validate buildHashtagPreferenceEvent
|
|
---
|
|
duration_ms: 0.374505
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildAdminListEvent (moderation)
|
|
ok 22 - should validate buildAdminListEvent (moderation)
|
|
---
|
|
duration_ms: 0.67544
|
|
type: 'test'
|
|
...
|
|
1..22
|
|
ok 1 - Nostr Event Schemas
|
|
---
|
|
duration_ms: 25.132894
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 22
|
|
# suites 1
|
|
# pass 22
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 66.27903
|
|
|
|
→ Running tests/feed-engine/explore-diversity.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore diversity sorter increases tag diversity in the top results
|
|
ok 1 - explore diversity sorter increases tag diversity in the top results
|
|
---
|
|
duration_ms: 4.210733
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore diversity sorter logs why when MMR re-orders similar candidates
|
|
ok 2 - explore diversity sorter logs why when MMR re-orders similar candidates
|
|
---
|
|
duration_ms: 1.903534
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 27.410206
|
|
|
|
→ Running tests/feed-engine/explore-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore disinterest filter drops videos with disinterested tags
|
|
ok 1 - explore disinterest filter drops videos with disinterested tags
|
|
---
|
|
duration_ms: 3.244312
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer penalizes disinterest overlap and logs why metadata
|
|
ok 2 - explore scorer penalizes disinterest overlap and logs why metadata
|
|
---
|
|
duration_ms: 3.464144
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer rewards novelty and new tag fraction
|
|
ok 3 - explore scorer rewards novelty and new tag fraction
|
|
---
|
|
duration_ms: 0.901374
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.563323
|
|
|
|
→ Running tests/feed-engine/kids-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: kids scorer correctly identifies dominant positive component
|
|
ok 1 - kids scorer correctly identifies dominant positive component
|
|
---
|
|
duration_ms: 6.119709
|
|
type: 'test'
|
|
...
|
|
# Subtest: kids scorer picks educational-boost when dominant
|
|
ok 2 - kids scorer picks educational-boost when dominant
|
|
---
|
|
duration_ms: 0.932512
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.101682
|
|
|
|
→ Running tests/feed-engine/tag-preference-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: tag preference stage filters by interests and excludes disinterests
|
|
ok 1 - tag preference stage filters by interests and excludes disinterests
|
|
---
|
|
duration_ms: 6.620352
|
|
type: 'test'
|
|
...
|
|
# Subtest: tag preference stage accepts interests from nip71 hashtags
|
|
ok 2 - tag preference stage accepts interests from nip71 hashtags
|
|
---
|
|
duration_ms: 0.645391
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.014233
|
|
|
|
→ Running tests/grid-health.test.mjs
|
|
TAP version 13
|
|
# Subtest: prioritizeEntries input validation
|
|
ok 1 - prioritizeEntries input validation
|
|
---
|
|
duration_ms: 143.304637
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries filtering
|
|
ok 2 - prioritizeEntries filtering
|
|
---
|
|
duration_ms: 23.477023
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries without viewport center
|
|
ok 3 - prioritizeEntries without viewport center
|
|
---
|
|
duration_ms: 18.529472
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries with viewport center
|
|
ok 4 - prioritizeEntries with viewport center
|
|
---
|
|
duration_ms: 15.994761
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries ratio prioritization when distances are similar
|
|
ok 5 - prioritizeEntries ratio prioritization when distances are similar
|
|
---
|
|
duration_ms: 16.518148
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries uses boundingClientRect fallback
|
|
ok 6 - prioritizeEntries uses boundingClientRect fallback
|
|
---
|
|
duration_ms: 16.684588
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 269.510866
|
|
|
|
→ Running tests/hashtag-preferences.test.mjs
|
|
[bitvid] [HashtagPreferences] Failed to decrypt hashtag preferences Error: Decrypt permissions are required to read hashtag preferences.
|
|
at HashtagPreferencesService.decryptEvent (file:///app/js/services/hashtagPreferencesService.js:1011:23)
|
|
at async HashtagPreferencesService.loadInternal (file:///app/js/services/hashtagPreferencesService.js:854:25)
|
|
at async HashtagPreferencesService.load (file:///app/js/services/hashtagPreferencesService.js:566:7)
|
|
at async TestContext.<anonymous> (file:///app/tests/hashtag-preferences.test.mjs:291:7)
|
|
at async Test.run (node:internal/test_runner/test:1054:7)
|
|
at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) {
|
|
code: 'hashtag-preferences-permission-required'
|
|
}
|
|
TAP version 13
|
|
# Subtest: load decrypts nip44 payloads and normalizes tags
|
|
ok 1 - load decrypts nip44 payloads and normalizes tags
|
|
---
|
|
duration_ms: 36.856663
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to nip04 decryption
|
|
ok 2 - load falls back to nip04 decryption
|
|
---
|
|
duration_ms: 5.512595
|
|
type: 'test'
|
|
...
|
|
# Subtest: load retries decryptors when hinted scheme fails
|
|
ok 3 - load retries decryptors when hinted scheme fails
|
|
---
|
|
duration_ms: 4.460938
|
|
type: 'test'
|
|
...
|
|
# Subtest: load defers permission-required decrypts until explicitly enabled
|
|
ok 4 - load defers permission-required decrypts until explicitly enabled
|
|
---
|
|
duration_ms: 12.498824
|
|
type: 'test'
|
|
...
|
|
# Subtest: interest and disinterest lists remain exclusive
|
|
ok 5 - interest and disinterest lists remain exclusive
|
|
---
|
|
duration_ms: 24.120972
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish encrypts payload and builds event via builder
|
|
ok 6 - publish encrypts payload and builds event via builder
|
|
---
|
|
duration_ms: 5.014169
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish falls back to window nostr encryptors
|
|
ok 7 - publish falls back to window nostr encryptors
|
|
---
|
|
duration_ms: 4.985568
|
|
type: 'test'
|
|
...
|
|
# Subtest: load prefers canonical kind when timestamps match while accepting legacy payload
|
|
ok 8 - load prefers canonical kind when timestamps match while accepting legacy payload
|
|
---
|
|
duration_ms: 3.497792
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer is missing
|
|
ok 9 - load falls back to window.nostr when active signer is missing
|
|
---
|
|
duration_ms: 2.816314
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
ok 10 - load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
---
|
|
duration_ms: 1.942891
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/login-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: LoginModalController shows custom error for empty nsec input
|
|
ok 1 - LoginModalController shows custom error for empty nsec input
|
|
---
|
|
duration_ms: 191.153597
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController does not set required attribute when toggling modes
|
|
ok 2 - LoginModalController does not set required attribute when toggling modes
|
|
---
|
|
duration_ms: 65.164644
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController shows NIP-46 handshake panel
|
|
ok 3 - LoginModalController shows NIP-46 handshake panel
|
|
---
|
|
duration_ms: 48.403155
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 322.710327
|
|
|
|
→ Running tests/magnet-utils.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeMagnet handles encoded values
|
|
ok 1 - safeDecodeMagnet handles encoded values
|
|
---
|
|
duration_ms: 1.608302
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeMagnet leaves plain strings untouched
|
|
ok 2 - safeDecodeMagnet leaves plain strings untouched
|
|
---
|
|
duration_ms: 0.311723
|
|
type: 'test'
|
|
...
|
|
# Subtest: bare hashes normalize consistently
|
|
ok 3 - bare hashes normalize consistently
|
|
---
|
|
duration_ms: 2.722056
|
|
type: 'test'
|
|
...
|
|
# Subtest: legacy %3A payloads decode
|
|
ok 4 - legacy %3A payloads decode
|
|
---
|
|
duration_ms: 0.685346
|
|
type: 'test'
|
|
...
|
|
# Subtest: duplicate trackers and hints stay in sync
|
|
ok 5 - duplicate trackers and hints stay in sync
|
|
---
|
|
duration_ms: 0.803694
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper enforces HTTPS web seeds when on HTTPS
|
|
ok 6 - object helper enforces HTTPS web seeds when on HTTPS
|
|
---
|
|
duration_ms: 0.376984
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper allows HTTP seeds on HTTP origins
|
|
ok 7 - object helper allows HTTP seeds on HTTP origins
|
|
---
|
|
duration_ms: 0.512407
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractMagnetHints returns first ws/xs pair
|
|
ok 8 - extractMagnetHints returns first ws/xs pair
|
|
---
|
|
duration_ms: 0.439379
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper reports didChange when output differs
|
|
ok 9 - object helper reports didChange when output differs
|
|
---
|
|
duration_ms: 0.778282
|
|
type: 'test'
|
|
...
|
|
# Subtest: helpers trim fragments from non-magnet values
|
|
ok 10 - helpers trim fragments from non-magnet values
|
|
---
|
|
duration_ms: 0.555062
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet filters out known broken trackers
|
|
ok 11 - normalizeAndAugmentMagnet filters out known broken trackers
|
|
---
|
|
duration_ms: 0.640242
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput parses each inbound parameter exactly once
|
|
ok 12 - normalizeMagnetInput parses each inbound parameter exactly once
|
|
---
|
|
duration_ms: 0.288995
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
ok 13 - normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
---
|
|
duration_ms: 0.585875
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
ok 14 - normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
---
|
|
duration_ms: 0.350679
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.087904
|
|
|
|
→ Running tests/media-loader.test.mjs
|
|
TAP version 13
|
|
# Subtest: MediaLoader assigns image sources once intersecting
|
|
ok 1 - MediaLoader assigns image sources once intersecting
|
|
---
|
|
duration_ms: 89.849624
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader loads video sources and poster fallbacks
|
|
ok 2 - MediaLoader loads video sources and poster fallbacks
|
|
---
|
|
duration_ms: 19.122699
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader clears unsupported lazy targets without inline styles
|
|
ok 3 - MediaLoader clears unsupported lazy targets without inline styles
|
|
---
|
|
duration_ms: 10.242568
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 131.581789
|
|
|
|
→ Running tests/minimal-channel-profile.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import channelProfile
|
|
ok 1 - can import channelProfile
|
|
---
|
|
duration_ms: 0.944037
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.732541
|
|
|
|
→ Running tests/minimal-webtorrent.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import WebTorrent
|
|
ok 1 - can import WebTorrent
|
|
---
|
|
duration_ms: 1.012054
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 11.483485
|
|
|
|
→ Running tests/modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal closes on Escape and restores trigger focus
|
|
ok 1 - UploadModal closes on Escape and restores trigger focus
|
|
---
|
|
duration_ms: 236.567507
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal backdrop click closes and restores trigger focus
|
|
ok 2 - UploadModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 78.526167
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal mode toggle updates button states
|
|
ok 3 - UploadModal mode toggle updates button states
|
|
---
|
|
duration_ms: 67.161359
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal Escape closes and restores trigger focus
|
|
ok 4 - EditModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 94.295099
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal backdrop click closes and restores trigger focus
|
|
ok 5 - EditModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 78.380615
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal visibility toggle updates button state
|
|
ok 6 - EditModal visibility toggle updates button state
|
|
---
|
|
duration_ms: 77.256566
|
|
type: 'test'
|
|
...
|
|
# Subtest: RevertModal Escape closes and restores trigger focus
|
|
ok 7 - RevertModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 50.668919
|
|
type: 'test'
|
|
...
|
|
# Subtest: static modal helper toggles accessibility hooks
|
|
ok 8 - static modal helper toggles accessibility hooks
|
|
---
|
|
duration_ms: 13.881391
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 709.584013
|
|
|
|
→ Running tests/moderation-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted report summaries respect personal blocks and admin lists
|
|
ok 1 - trusted report summaries respect personal blocks and admin lists
|
|
---
|
|
duration_ms: 4.878006
|
|
type: 'test'
|
|
...
|
|
# Subtest: user block updates recompute summaries and emit notifications
|
|
ok 2 - user block updates recompute summaries and emit notifications
|
|
---
|
|
duration_ms: 4.496267
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation thresholds emit logger hooks only when crossing
|
|
ok 3 - moderation thresholds emit logger hooks only when crossing
|
|
---
|
|
duration_ms: 1.716704
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute aggregation tracks F1 mute lists
|
|
ok 4 - trusted mute aggregation tracks F1 mute lists
|
|
---
|
|
duration_ms: 1.714008
|
|
type: 'test'
|
|
...
|
|
# Subtest: viewer mute list publishes and updates aggregation
|
|
ok 5 - viewer mute list publishes and updates aggregation
|
|
---
|
|
duration_ms: 2.563996
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2022.36216
|
|
|
|
→ Running tests/moderation-stage.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage enforces admin lists without whitelist bypass
|
|
ok 1 - moderation stage enforces admin lists without whitelist bypass
|
|
---
|
|
duration_ms: 4.390898
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage annotates trusted mute metadata
|
|
ok 2 - moderation stage annotates trusted mute metadata
|
|
---
|
|
duration_ms: 0.913522
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage applies provided thresholds
|
|
ok 3 - moderation stage applies provided thresholds
|
|
---
|
|
duration_ms: 1.028839
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime threshold changes
|
|
ok 4 - moderation stage respects runtime threshold changes
|
|
---
|
|
duration_ms: 0.92184
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports function-based threshold resolvers
|
|
ok 5 - moderation stage supports function-based threshold resolvers
|
|
---
|
|
duration_ms: 0.761714
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage propagates whitelist, muters, and threshold updates
|
|
ok 6 - moderation stage propagates whitelist, muters, and threshold updates
|
|
---
|
|
duration_ms: 1.215582
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage blurs viewer-muted authors
|
|
ok 7 - moderation stage blurs viewer-muted authors
|
|
---
|
|
duration_ms: 0.633761
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage clears cached reporters and muters after service signals
|
|
ok 8 - moderation stage clears cached reporters and muters after service signals
|
|
---
|
|
duration_ms: 2.566925
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 27.790605
|
|
|
|
→ Running tests/moderation/hide-thresholds.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage hides videos muted by trusted when threshold met
|
|
ok 1 - moderation stage hides videos muted by trusted when threshold met
|
|
---
|
|
duration_ms: 4.162912
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides videos when trusted reports exceed threshold
|
|
ok 2 - moderation stage hides videos when trusted reports exceed threshold
|
|
---
|
|
duration_ms: 0.661576
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime hide threshold changes
|
|
ok 3 - moderation stage respects runtime hide threshold changes
|
|
---
|
|
duration_ms: 0.84064
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports trusted mute hide resolver functions
|
|
ok 4 - moderation stage supports trusted mute hide resolver functions
|
|
---
|
|
duration_ms: 1.230037
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage bypasses hard hides on home feed
|
|
ok 5 - moderation stage bypasses hard hides on home feed
|
|
---
|
|
duration_ms: 0.766166
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides admin-whitelisted videos once thresholds fire
|
|
ok 6 - moderation stage hides admin-whitelisted videos once thresholds fire
|
|
---
|
|
duration_ms: 0.832236
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.554611
|
|
|
|
→ Running tests/moderation/submit-report.test.mjs
|
|
TAP version 13
|
|
# Subtest: submitReport emits NIP-56 compliant report tags
|
|
ok 1 - submitReport emits NIP-56 compliant report tags
|
|
---
|
|
duration_ms: 11.464413
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.276654
|
|
|
|
→ Running tests/moderation/trust-seeds.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: default trust seeds derive from config
|
|
ok 1 - default trust seeds derive from config
|
|
---
|
|
duration_ms: 2.042348
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted mute counts
|
|
ok 2 - trusted seeds contribute to trusted mute counts
|
|
---
|
|
duration_ms: 4.011639
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted report counts
|
|
ok 3 - trusted seeds contribute to trusted report counts
|
|
---
|
|
duration_ms: 3.691841
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seed updates recompute guest report summaries
|
|
ok 4 - trusted seed updates recompute guest report summaries
|
|
---
|
|
duration_ms: 1.183858
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderator seeds populate trusted contacts
|
|
ok 5 - moderator seeds populate trusted contacts
|
|
---
|
|
duration_ms: 0.86837
|
|
type: 'test'
|
|
...
|
|
# Subtest: bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
ok 6 - bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
---
|
|
duration_ms: 83.926355
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3602.863839
|
|
|
|
→ Running tests/moderation/trusted-mute-lists.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted mute lists from seeds hide authors for anonymous viewers
|
|
ok 1 - trusted mute lists from seeds hide authors for anonymous viewers
|
|
---
|
|
duration_ms: 13.976099
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2015.636077
|
|
|
|
→ Running tests/moderation/trusted-report-count.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
ok 1 - trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
---
|
|
duration_ms: 5.786306
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount ignores reports from muted or blocked reporters
|
|
ok 2 - trustedReportCount ignores reports from muted or blocked reporters
|
|
---
|
|
duration_ms: 2.226538
|
|
type: 'test'
|
|
...
|
|
# Subtest: blocking and unblocking reporters recomputes trusted summaries
|
|
ok 3 - blocking and unblocking reporters recomputes trusted summaries
|
|
---
|
|
duration_ms: 2.999259
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
ok 4 - trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
---
|
|
duration_ms: 2.11401
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2018.908096
|
|
|
|
→ Running tests/moderation/video-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoCard renders moderation badges and respects viewer override
|
|
ok 1 - VideoCard renders moderation badges and respects viewer override
|
|
---
|
|
duration_ms: 139.396489
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides content when hide metadata is present and override unmasks it
|
|
ok 2 - VideoCard hides content when hide metadata is present and override unmasks it
|
|
---
|
|
duration_ms: 35.05357
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs viewer-muted creators
|
|
ok 3 - VideoCard blurs viewer-muted creators
|
|
---
|
|
duration_ms: 19.14735
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
ok 4 - VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
---
|
|
duration_ms: 17.302337
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard block action restores trusted mute hide state after override
|
|
ok 5 - VideoCard block action restores trusted mute hide state after override
|
|
---
|
|
duration_ms: 30.750381
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyModerationContextDatasets clears blur when overrides are active
|
|
ok 6 - applyModerationContextDatasets clears blur when overrides are active
|
|
---
|
|
duration_ms: 10.00656
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
ok 7 - buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
---
|
|
duration_ms: 0.296612
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 268.615016
|
|
|
|
→ Running tests/more-menu-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: copy-link action writes to clipboard and shows success
|
|
ok 1 - copy-link action writes to clipboard and shows success
|
|
---
|
|
duration_ms: 3.189041
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author requires moderator access and refreshes subscriptions
|
|
ok 2 - blacklist-author requires moderator access and refreshes subscriptions
|
|
---
|
|
duration_ms: 0.741504
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author shows error when no moderator session is available
|
|
ok 3 - blacklist-author shows error when no moderator session is available
|
|
---
|
|
duration_ms: 0.324864
|
|
type: 'test'
|
|
...
|
|
# Subtest: block-author updates user blocks, reloads videos, and refreshes feeds
|
|
ok 4 - block-author updates user blocks, reloads videos, and refreshes feeds
|
|
---
|
|
duration_ms: 0.770391
|
|
type: 'test'
|
|
...
|
|
# Subtest: mute-author updates viewer mute list and refreshes feeds
|
|
ok 5 - mute-author updates viewer mute list and refreshes feeds
|
|
---
|
|
duration_ms: 0.718424
|
|
type: 'test'
|
|
...
|
|
# Subtest: unmute-author removes creators from viewer mute list
|
|
ok 6 - unmute-author removes creators from viewer mute list
|
|
---
|
|
duration_ms: 0.567987
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.180099
|
|
|
|
→ Running tests/nip07-concurrency.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Concurrency Queue
|
|
# Subtest: runs up to 5 tasks concurrently
|
|
ok 1 - runs up to 5 tasks concurrently
|
|
---
|
|
duration_ms: 304.488588
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects priority
|
|
ok 2 - respects priority
|
|
---
|
|
duration_ms: 151.167541
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-07 Concurrency Queue
|
|
---
|
|
duration_ms: 457.647559
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 465.141479
|
|
|
|
→ Running tests/nip71-base-event-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
ok 1 - 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
---
|
|
duration_ms: 5.759304
|
|
type: 'test'
|
|
...
|
|
# Subtest: imeta tags lower-case mime values
|
|
ok 2 - imeta tags lower-case mime values
|
|
---
|
|
duration_ms: 0.463769
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.279057
|
|
|
|
→ Running tests/nip71-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildNip71VideoEvent assembles rich metadata
|
|
ok 1 - buildNip71VideoEvent assembles rich metadata
|
|
---
|
|
duration_ms: 3.739094
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent falls back to summary and selects kind
|
|
ok 2 - buildNip71VideoEvent falls back to summary and selects kind
|
|
---
|
|
duration_ms: 0.317551
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent attaches pointer tags
|
|
ok 3 - buildNip71VideoEvent attaches pointer tags
|
|
---
|
|
duration_ms: 0.461633
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractNip71MetadataFromTags parses metadata and pointers
|
|
ok 4 - extractNip71MetadataFromTags parses metadata and pointers
|
|
---
|
|
duration_ms: 1.341602
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.81376
|
|
|
|
→ Running tests/nip71-form-manager.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectSection sanitizes and deduplicates hashtags
|
|
ok 1 - collectSection sanitizes and deduplicates hashtags
|
|
---
|
|
duration_ms: 116.800172
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSection renders sanitized hashtags with prefix
|
|
ok 2 - hydrateSection renders sanitized hashtags with prefix
|
|
---
|
|
duration_ms: 23.606549
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 156.761521
|
|
|
|
→ Running tests/nostr-login-permissions.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Login Permissions
|
|
# Subtest: NIP-07 login requests decrypt permissions upfront
|
|
ok 1 - NIP-07 login requests decrypt permissions upfront
|
|
---
|
|
duration_ms: 5.192089
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 decrypt reuses cached extension permissions
|
|
ok 2 - NIP-07 decrypt reuses cached extension permissions
|
|
---
|
|
duration_ms: 1.79586
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login falls back when structured permissions fail
|
|
ok 3 - NIP-07 login falls back when structured permissions fail
|
|
---
|
|
duration_ms: 1.267554
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login supports extensions that only allow enable() without payload
|
|
ok 4 - NIP-07 login supports extensions that only allow enable() without payload
|
|
---
|
|
duration_ms: 1.465791
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login quickly retries when a permission payload stalls
|
|
ok 5 - NIP-07 login quickly retries when a permission payload stalls
|
|
---
|
|
duration_ms: 82.539537
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login does not wait for deferred permission grants
|
|
ok 6 - NIP-07 login does not wait for deferred permission grants
|
|
---
|
|
duration_ms: 302.321933
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login surfaces enable permission errors
|
|
ok 7 - NIP-07 login surfaces enable permission errors
|
|
---
|
|
duration_ms: 1.590507
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry respects timeout without retry multiplier
|
|
ok 8 - runNip07WithRetry respects timeout without retry multiplier
|
|
---
|
|
duration_ms: 61.542613
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - NIP-07 Login Permissions
|
|
---
|
|
duration_ms: 459.685038
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 467.934999
|
|
|
|
→ Running tests/nostr-nip46-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
ok 1 - Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
---
|
|
duration_ms: 2.187262
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects priority levels
|
|
ok 2 - Nip46RequestQueue: respects priority levels
|
|
---
|
|
duration_ms: 10.487855
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects minDelayMs
|
|
ok 3 - Nip46RequestQueue: respects minDelayMs
|
|
---
|
|
duration_ms: 101.686526
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: clear() rejects pending tasks
|
|
ok 4 - Nip46RequestQueue: clear() rejects pending tasks
|
|
---
|
|
duration_ms: 101.326692
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 224.083658
|
|
|
|
→ Running tests/nostr-private-key-signer.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Private Key Signer
|
|
# Subtest: registerPrivateKeySigner exposes nip04 helpers
|
|
ok 1 - registerPrivateKeySigner exposes nip04 helpers
|
|
---
|
|
duration_ms: 151.675451
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Nostr Private Key Signer
|
|
---
|
|
duration_ms: 153.305987
|
|
type: 'suite'
|
|
...
|
|
|
|
→ Running tests/nostr-send-direct-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: sendDirectMessage succeeds with private key signer and no extension
|
|
ok 1 - sendDirectMessage succeeds with private key signer and no extension
|
|
---
|
|
duration_ms: 221.080514
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-service-access-control.test.mjs
|
|
TAP version 13
|
|
# Subtest: shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
ok 1 - shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
---
|
|
duration_ms: 4.26528
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
ok 2 - shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
---
|
|
duration_ms: 3.443367
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
ok 3 - shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
---
|
|
duration_ms: 60.427776
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo always returns true for the viewer's own video
|
|
ok 4 - shouldIncludeVideo always returns true for the viewer's own video
|
|
---
|
|
duration_ms: 0.37427
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo allows access when access control would deny the author
|
|
ok 5 - shouldIncludeVideo allows access when access control would deny the author
|
|
---
|
|
duration_ms: 0.482683
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: isSubtleCryptoAvailable returns true in test env
|
|
ok 1 - isSubtleCryptoAvailable returns true in test env
|
|
---
|
|
duration_ms: 2.072454
|
|
type: 'test'
|
|
...
|
|
# Subtest: generateRandomBytes returns correct length
|
|
ok 2 - generateRandomBytes returns correct length
|
|
---
|
|
duration_ms: 1.541645
|
|
type: 'test'
|
|
...
|
|
# Subtest: encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
ok 3 - encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 295.893131
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptSessionPrivateKey fails with wrong passphrase
|
|
ok 4 - decryptSessionPrivateKey fails with wrong passphrase
|
|
---
|
|
duration_ms: 293.210271
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor writes to localStorage and IndexedDB
|
|
ok 5 - persistSessionActor writes to localStorage and IndexedDB
|
|
---
|
|
duration_ms: 146.460633
|
|
type: 'test'
|
|
...
|
|
# Subtest: readStoredSessionActorEntry retrieves from localStorage
|
|
ok 6 - readStoredSessionActorEntry retrieves from localStorage
|
|
---
|
|
duration_ms: 149.400688
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes from localStorage
|
|
ok 7 - clearStoredSessionActor removes from localStorage
|
|
---
|
|
duration_ms: 0.802111
|
|
type: 'test'
|
|
...
|
|
# Subtest: helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
ok 8 - helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
---
|
|
duration_ms: 2.117496
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 900.794583
|
|
|
|
→ Running tests/nostr-signer-race.test.mjs
|
|
TAP version 13
|
|
# Subtest: ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
ok 1 - ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
---
|
|
duration_ms: 104.445594
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 111.97086
|
|
|
|
→ Running tests/nostr/adapters.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNsecAdapter wires signing and cipher capabilities
|
|
ok 1 - createNsecAdapter wires signing and cipher capabilities
|
|
---
|
|
duration_ms: 65.215204
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip07Adapter maps extension methods and permissions
|
|
ok 2 - createNip07Adapter maps extension methods and permissions
|
|
---
|
|
duration_ms: 3.015925
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Adapter wraps the remote signer client
|
|
ok 3 - createNip46Adapter wraps the remote signer client
|
|
---
|
|
duration_ms: 0.720156
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 81.026249
|
|
|
|
→ Running tests/nostr/cachePolicies.test.mjs
|
|
TAP version 13
|
|
# Subtest: CACHE_POLICIES structure
|
|
ok 1 - CACHE_POLICIES structure
|
|
---
|
|
duration_ms: 1.184252
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_POST policy
|
|
ok 2 - VIDEO_POST policy
|
|
---
|
|
duration_ms: 0.231646
|
|
type: 'test'
|
|
...
|
|
# Subtest: WATCH_HISTORY policy
|
|
ok 3 - WATCH_HISTORY policy
|
|
---
|
|
duration_ms: 0.216545
|
|
type: 'test'
|
|
...
|
|
# Subtest: SUBSCRIPTION_LIST policy
|
|
ok 4 - SUBSCRIPTION_LIST policy
|
|
---
|
|
duration_ms: 0.192348
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_COMMENT policy
|
|
ok 5 - VIDEO_COMMENT policy
|
|
---
|
|
duration_ms: 0.26059
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.803426
|
|
|
|
→ Running tests/nostr/client.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient
|
|
# Subtest: Initialization
|
|
# Subtest: should initialize with default state
|
|
ok 1 - should initialize with default state
|
|
---
|
|
duration_ms: 3.186893
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Initialization
|
|
---
|
|
duration_ms: 4.246386
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchListIncrementally
|
|
# Subtest: should fetch events and deduplicate results
|
|
ok 1 - should fetch events and deduplicate results
|
|
---
|
|
duration_ms: 2.938693
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle incremental updates using lastSeen
|
|
ok 2 - should handle incremental updates using lastSeen
|
|
---
|
|
duration_ms: 1.31306
|
|
type: 'test'
|
|
...
|
|
# Subtest: should override lastSeen with explicit since parameter
|
|
ok 3 - should override lastSeen with explicit since parameter
|
|
---
|
|
duration_ms: 1.008788
|
|
type: 'test'
|
|
...
|
|
# Subtest: should force full fetch if since is 0
|
|
ok 4 - should force full fetch if since is 0
|
|
---
|
|
duration_ms: 0.838607
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - fetchListIncrementally
|
|
---
|
|
duration_ms: 6.505066
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeVideos
|
|
# Subtest: should subscribe to video events and buffer them
|
|
ok 1 - should subscribe to video events and buffer them
|
|
---
|
|
duration_ms: 301.140021
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - subscribeVideos
|
|
---
|
|
duration_ms: 301.798822
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideos
|
|
# Subtest: should delegate to subscribeVideos and return result on eose
|
|
ok 1 - should delegate to subscribeVideos and return result on eose
|
|
---
|
|
duration_ms: 2.415533
|
|
type: 'test'
|
|
...
|
|
# Subtest: should respect since parameter if provided
|
|
ok 2 - should respect since parameter if provided
|
|
---
|
|
duration_ms: 4.012629
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - fetchVideos
|
|
---
|
|
duration_ms: 6.847733
|
|
type: 'suite'
|
|
...
|
|
# Subtest: publishVideo
|
|
# Subtest: should throw if not logged in
|
|
ok 1 - should throw if not logged in
|
|
---
|
|
duration_ms: 2.153276
|
|
type: 'test'
|
|
...
|
|
# Subtest: should sign and publish a valid video
|
|
ok 2 - should sign and publish a valid video
|
|
---
|
|
duration_ms: 3.32647
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - publishVideo
|
|
---
|
|
duration_ms: 5.627833
|
|
type: 'suite'
|
|
...
|
|
# Subtest: editVideo
|
|
# Subtest: should throw if not owner
|
|
ok 1 - should throw if not owner
|
|
---
|
|
duration_ms: 0.73243
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 6 - editVideo
|
|
---
|
|
duration_ms: 0.830286
|
|
type: 'suite'
|
|
...
|
|
# Subtest: revertVideo
|
|
# Subtest: should publish a deletion marker event
|
|
ok 1 - should publish a deletion marker event
|
|
---
|
|
duration_ms: 0.461388
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 7 - revertVideo
|
|
---
|
|
duration_ms: 0.548545
|
|
type: 'suite'
|
|
...
|
|
1..7
|
|
ok 1 - NostrClient
|
|
---
|
|
duration_ms: 327.618474
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 8
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 549.540047
|
|
|
|
→ Running tests/nostr/comment-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishComment prefers active signer when available
|
|
ok 1 - publishComment prefers active signer when available
|
|
---
|
|
duration_ms: 7.171404
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment rejects when active signer is unavailable
|
|
ok 2 - publishComment rejects when active signer is unavailable
|
|
---
|
|
duration_ms: 0.363767
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment accepts legacy targets with only an event id
|
|
ok 3 - publishComment accepts legacy targets with only an event id
|
|
---
|
|
duration_ms: 1.320475
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment derives root and parent metadata from parent comment tags
|
|
ok 4 - publishComment derives root and parent metadata from parent comment tags
|
|
---
|
|
duration_ms: 1.193004
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches comments even when tag casing and whitespace differ
|
|
ok 5 - listVideoComments matches comments even when tag casing and whitespace differ
|
|
---
|
|
duration_ms: 2.3519
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches uppercase definition addresses without lowering
|
|
ok 6 - listVideoComments matches uppercase definition addresses without lowering
|
|
---
|
|
duration_ms: 0.979874
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment emits only uppercase video event pointer when address and parent are absent
|
|
ok 7 - publishComment emits only uppercase video event pointer when address and parent are absent
|
|
---
|
|
duration_ms: 0.90878
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
ok 8 - listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
---
|
|
duration_ms: 1.139937
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments emits uppercase root filters when only the identifier is known
|
|
ok 9 - listVideoComments emits uppercase root filters when only the identifier is known
|
|
---
|
|
duration_ms: 1.195449
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments supports legacy targets without a definition address
|
|
ok 10 - listVideoComments supports legacy targets without a definition address
|
|
---
|
|
duration_ms: 1.0592
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
ok 11 - subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
---
|
|
duration_ms: 9.618521
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments supports video targets without a definition address
|
|
ok 12 - subscribeVideoComments supports video targets without a definition address
|
|
---
|
|
duration_ms: 0.71031
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 37.147625
|
|
|
|
→ Running tests/nostr/countDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: countDiagnostics
|
|
# Subtest: isVerboseDiagnosticsEnabled
|
|
# Subtest: should return true by default (due to override)
|
|
ok 1 - should return true by default (due to override)
|
|
---
|
|
duration_ms: 1.170496
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
ok 2 - should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
---
|
|
duration_ms: 0.387863
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
ok 3 - should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
---
|
|
duration_ms: 0.452221
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to isVerboseDevMode if window flag is not boolean
|
|
ok 4 - should fall back to isVerboseDevMode if window flag is not boolean
|
|
---
|
|
duration_ms: 0.513738
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - isVerboseDiagnosticsEnabled
|
|
---
|
|
duration_ms: 3.528813
|
|
type: 'suite'
|
|
...
|
|
# Subtest: logRelayCountFailure
|
|
# Subtest: should log warning for new relay URL
|
|
ok 1 - should log warning for new relay URL
|
|
---
|
|
duration_ms: 1.141589
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress 'Failed to connect to relay' errors
|
|
ok 2 - should suppress 'Failed to connect to relay' errors
|
|
---
|
|
duration_ms: 0.291202
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throttle duplicate warnings for the same relay
|
|
ok 3 - should throttle duplicate warnings for the same relay
|
|
---
|
|
duration_ms: 0.387479
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle empty or non-string relay URLs
|
|
ok 4 - should handle empty or non-string relay URLs
|
|
---
|
|
duration_ms: 0.479425
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - logRelayCountFailure
|
|
---
|
|
duration_ms: 2.729629
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Other Loggers
|
|
# Subtest: should log timeout cleanup failure once
|
|
ok 1 - should log timeout cleanup failure once
|
|
---
|
|
duration_ms: 0.541193
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log rebroadcast failure once
|
|
ok 2 - should log rebroadcast failure once
|
|
---
|
|
duration_ms: 0.343571
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log view count failure once
|
|
ok 3 - should log view count failure once
|
|
---
|
|
duration_ms: 0.321451
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - Other Loggers
|
|
---
|
|
duration_ms: 1.422763
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Verbose Mode Disabled
|
|
# Subtest: should not log even for new keys when disabled
|
|
ok 1 - should not log even for new keys when disabled
|
|
---
|
|
duration_ms: 0.396461
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not consume throttle key when disabled
|
|
ok 2 - should not consume throttle key when disabled
|
|
---
|
|
duration_ms: 0.320044
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - Verbose Mode Disabled
|
|
---
|
|
duration_ms: 0.847578
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - countDiagnostics
|
|
---
|
|
duration_ms: 13.359729
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 5
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.192276
|
|
|
|
→ Running tests/nostr/decryptionSchemeCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptionSchemeCache
|
|
# Subtest: stores and retrieves a scheme
|
|
ok 1 - stores and retrieves a scheme
|
|
---
|
|
duration_ms: 1.73454
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null for unknown pubkey
|
|
ok 2 - returns null for unknown pubkey
|
|
---
|
|
duration_ms: 0.404252
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 3 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.714016
|
|
type: 'test'
|
|
...
|
|
# Subtest: expires entries after TTL (2 hours)
|
|
ok 4 - expires entries after TTL (2 hours)
|
|
---
|
|
duration_ms: 0.622671
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not expire entries before TTL
|
|
ok 5 - does not expire entries before TTL
|
|
---
|
|
duration_ms: 0.265216
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears cache
|
|
ok 6 - clears cache
|
|
---
|
|
duration_ms: 0.298403
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - decryptionSchemeCache
|
|
---
|
|
duration_ms: 6.681182
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.70873
|
|
|
|
→ Running tests/nostr/defaultClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: Default NostrClient
|
|
# Subtest: should be an instance of NostrClient
|
|
ok 1 - should be an instance of NostrClient
|
|
---
|
|
duration_ms: 1.051611
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be configured with default relays
|
|
ok 2 - should be configured with default relays
|
|
---
|
|
duration_ms: 1.068926
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default read relays
|
|
ok 3 - should be initialized with default read relays
|
|
---
|
|
duration_ms: 0.269233
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default write relays
|
|
ok 4 - should be initialized with default write relays
|
|
---
|
|
duration_ms: 0.299372
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be registered as the default client
|
|
ok 5 - should be registered as the default client
|
|
---
|
|
duration_ms: 0.221548
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Default NostrClient
|
|
---
|
|
duration_ms: 4.687302
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.051292
|
|
|
|
→ Running tests/nostr/dm-direct-message-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM relay duplication is deduped
|
|
ok 1 - DM relay duplication is deduped
|
|
---
|
|
duration_ms: 147.759906
|
|
type: 'test'
|
|
...
|
|
# Subtest: out-of-order DM delivery keeps newest messages first
|
|
ok 2 - out-of-order DM delivery keeps newest messages first
|
|
---
|
|
duration_ms: 86.574186
|
|
type: 'test'
|
|
...
|
|
# Subtest: DM reconnect replays do not duplicate messages or reset seen state
|
|
ok 3 - DM reconnect replays do not duplicate messages or reset seen state
|
|
---
|
|
duration_ms: 172.786856
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 414.980614
|
|
|
|
→ Running tests/nostr/dmDecryptDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptDiagnostics
|
|
# Subtest: summarizeDmEventForLog
|
|
# Subtest: should return a default object when event is null or undefined
|
|
ok 1 - should return a default object when event is null or undefined
|
|
---
|
|
duration_ms: 1.853866
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return a default object when event is not an object
|
|
ok 2 - should return a default object when event is not an object
|
|
---
|
|
duration_ms: 0.302602
|
|
type: 'test'
|
|
...
|
|
# Subtest: should summarize a valid event correctly
|
|
ok 3 - should summarize a valid event correctly
|
|
---
|
|
duration_ms: 0.313069
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite created_at
|
|
ok 4 - should handle non-finite created_at
|
|
---
|
|
duration_ms: 0.280013
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite kind
|
|
ok 5 - should handle non-finite kind
|
|
---
|
|
duration_ms: 0.250973
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid content
|
|
ok 6 - should handle missing or invalid content
|
|
---
|
|
duration_ms: 0.192517
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid tags
|
|
ok 7 - should handle missing or invalid tags
|
|
---
|
|
duration_ms: 0.30697
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - summarizeDmEventForLog
|
|
---
|
|
duration_ms: 4.718392
|
|
type: 'suite'
|
|
...
|
|
# Subtest: sanitizeDecryptError
|
|
# Subtest: should return null when error is null or undefined
|
|
ok 1 - should return null when error is null or undefined
|
|
---
|
|
duration_ms: 0.429027
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle string errors
|
|
ok 2 - should handle string errors
|
|
---
|
|
duration_ms: 0.373829
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with standard properties
|
|
ok 3 - should handle Error objects with standard properties
|
|
---
|
|
duration_ms: 0.329493
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with missing properties
|
|
ok 4 - should handle Error objects with missing properties
|
|
---
|
|
duration_ms: 0.15141
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with non-string properties
|
|
ok 5 - should handle Error objects with non-string properties
|
|
---
|
|
duration_ms: 0.26787
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - sanitizeDecryptError
|
|
---
|
|
duration_ms: 1.944328
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - dmDecryptDiagnostics
|
|
---
|
|
duration_ms: 7.630447
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.146125
|
|
|
|
→ Running tests/nostr/dmDecryptorPreference.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM prefers nip44 decryptors when available
|
|
ok 1 - decryptDM prefers nip44 decryptors when available
|
|
---
|
|
duration_ms: 2.955807
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM falls back to nip04 when nip44 fails
|
|
ok 2 - decryptDM falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.554006
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.354639
|
|
|
|
→ Running tests/nostr/dmDecryptWorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptWorkerClient
|
|
# Subtest: should support worker environment
|
|
ok 1 - should support worker environment
|
|
---
|
|
duration_ms: 5.521949
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker is unavailable
|
|
ok 2 - should reject if Worker is unavailable
|
|
---
|
|
duration_ms: 3.074208
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if inputs are invalid
|
|
ok 3 - should reject if inputs are invalid
|
|
---
|
|
duration_ms: 2.972998
|
|
type: 'test'
|
|
...
|
|
# Subtest: should successfully decrypt message
|
|
ok 4 - should successfully decrypt message
|
|
---
|
|
duration_ms: 9.263417
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error response
|
|
ok 5 - should handle worker error response
|
|
---
|
|
duration_ms: 3.41538
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error event
|
|
ok 6 - should handle worker error event
|
|
---
|
|
duration_ms: 4.17877
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 7 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 102.879319
|
|
type: 'test'
|
|
...
|
|
# Subtest: should initialize worker lazily and reuse instance
|
|
ok 8 - should initialize worker lazily and reuse instance
|
|
---
|
|
duration_ms: 3.006173
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recreate worker if creation fails
|
|
ok 9 - should recreate worker if creation fails
|
|
---
|
|
duration_ms: 1.703003
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - dmDecryptWorkerClient
|
|
---
|
|
duration_ms: 138.919537
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 148.371547
|
|
|
|
→ Running tests/nostr/dmSignalEvents.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmSignalEvents
|
|
# Subtest: publishDmReadReceipt should succeed
|
|
ok 1 - publishDmReadReceipt should succeed
|
|
---
|
|
duration_ms: 7.532561
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmReadReceipt should fail if session actor
|
|
ok 2 - publishDmReadReceipt should fail if session actor
|
|
---
|
|
duration_ms: 0.908127
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmTypingIndicator should succeed
|
|
ok 3 - publishDmTypingIndicator should succeed
|
|
---
|
|
duration_ms: 7.652516
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail if no signer
|
|
ok 4 - should fail if no signer
|
|
---
|
|
duration_ms: 1.188725
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - dmSignalEvents
|
|
---
|
|
duration_ms: 139.351093
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 157.759952
|
|
|
|
→ Running tests/nostr/edit-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: editVideo preserves existing d tag
|
|
ok 1 - editVideo preserves existing d tag
|
|
---
|
|
duration_ms: 11.938627
|
|
type: 'test'
|
|
...
|
|
# Subtest: editVideo falls back to base event id when d tag missing
|
|
ok 2 - editVideo falls back to base event id when d tag missing
|
|
---
|
|
duration_ms: 2.308068
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.18326
|
|
|
|
→ Running tests/nostr/eventsCacheStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsCacheStore
|
|
# Subtest: persistSnapshot should store events and tombstones
|
|
ok 1 - persistSnapshot should store events and tombstones
|
|
---
|
|
duration_ms: 15.374204
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should only update changed items
|
|
ok 2 - persistSnapshot should only update changed items
|
|
---
|
|
duration_ms: 3.711652
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should delete removed items
|
|
ok 3 - persistSnapshot should delete removed items
|
|
---
|
|
duration_ms: 3.075892
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should respect dirty keys optimization
|
|
ok 4 - persistSnapshot should respect dirty keys optimization
|
|
---
|
|
duration_ms: 2.427729
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - EventsCacheStore
|
|
---
|
|
duration_ms: 26.444127
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.178608
|
|
|
|
→ Running tests/nostr/eventsMap.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsMap functionality
|
|
# Subtest: indexes events by author on set
|
|
ok 1 - indexes events by author on set
|
|
---
|
|
duration_ms: 1.060972
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on delete
|
|
ok 2 - updates index on delete
|
|
---
|
|
duration_ms: 0.284665
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on overwrite with different object
|
|
ok 3 - updates index on overwrite with different object
|
|
---
|
|
duration_ms: 0.275421
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears index on clear
|
|
ok 4 - clears index on clear
|
|
---
|
|
duration_ms: 0.324745
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes pubkeys
|
|
ok 5 - normalizes pubkeys
|
|
---
|
|
duration_ms: 0.280993
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-event objects gracefully
|
|
ok 6 - handles non-event objects gracefully
|
|
---
|
|
duration_ms: 0.293874
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - EventsMap functionality
|
|
---
|
|
duration_ms: 5.682648
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.489195
|
|
|
|
→ Running tests/nostr/integration-remote-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: nostr login + remote signing + publish + watch history integration
|
|
ok 1 - nostr login + remote signing + publish + watch history integration
|
|
---
|
|
duration_ms: 151.514517
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 609.868777
|
|
|
|
→ Running tests/nostr/maxListenerDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: maxListenerDiagnostics
|
|
# Subtest: collectCandidateStrings
|
|
# Subtest: should return empty array for null/undefined/falsy
|
|
ok 1 - should return empty array for null/undefined/falsy
|
|
---
|
|
duration_ms: 2.216637
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return array with string for string input
|
|
ok 2 - should return array with string for string input
|
|
---
|
|
duration_ms: 0.4814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should extract relevant fields from object
|
|
ok 3 - should extract relevant fields from object
|
|
---
|
|
duration_ms: 0.615814
|
|
type: 'test'
|
|
...
|
|
# Subtest: should ignore non-string fields in object
|
|
ok 4 - should ignore non-string fields in object
|
|
---
|
|
duration_ms: 0.651245
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - collectCandidateStrings
|
|
---
|
|
duration_ms: 4.987826
|
|
type: 'suite'
|
|
...
|
|
# Subtest: shouldSuppressWarning
|
|
# Subtest: should NOT suppress anything if verbose mode is enabled
|
|
ok 1 - should NOT suppress anything if verbose mode is enabled
|
|
---
|
|
duration_ms: 0.703806
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by code string
|
|
ok 2 - should suppress warning by code string
|
|
---
|
|
duration_ms: 0.2314
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object code property
|
|
ok 3 - should suppress warning by object code property
|
|
---
|
|
duration_ms: 0.279074
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by message snippet
|
|
ok 4 - should suppress warning by message snippet
|
|
---
|
|
duration_ms: 0.351701
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object message property snippet
|
|
ok 5 - should suppress warning by object message property snippet
|
|
---
|
|
duration_ms: 0.448389
|
|
type: 'test'
|
|
...
|
|
# Subtest: should NOT suppress unrelated warnings
|
|
ok 6 - should NOT suppress unrelated warnings
|
|
---
|
|
duration_ms: 0.360018
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle multiple arguments
|
|
ok 7 - should handle multiple arguments
|
|
---
|
|
duration_ms: 0.4163
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - shouldSuppressWarning
|
|
---
|
|
duration_ms: 3.469695
|
|
type: 'suite'
|
|
...
|
|
# Subtest: process.emitWarning patch
|
|
# Subtest: should have patched process.emitWarning
|
|
ok 1 - should have patched process.emitWarning
|
|
---
|
|
duration_ms: 0.235314
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - process.emitWarning patch
|
|
---
|
|
duration_ms: 0.365279
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - maxListenerDiagnostics
|
|
---
|
|
duration_ms: 11.131926
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 4
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.024045
|
|
|
|
→ Running tests/nostr/nip04WorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: nip04WorkerClient
|
|
# Subtest: should encrypt message successfully via worker
|
|
ok 1 - should encrypt message successfully via worker
|
|
---
|
|
duration_ms: 8.564032
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker returns error
|
|
ok 2 - should reject when worker returns error
|
|
---
|
|
duration_ms: 4.37994
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker emits error event
|
|
ok 3 - should reject when worker emits error event
|
|
---
|
|
duration_ms: 3.05208
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 4 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 103.847896
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject immediately if inputs are missing
|
|
ok 5 - should reject immediately if inputs are missing
|
|
---
|
|
duration_ms: 2.737288
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker API is unavailable
|
|
ok 6 - should reject if Worker API is unavailable
|
|
---
|
|
duration_ms: 1.986133
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker creation failure
|
|
ok 7 - should handle worker creation failure
|
|
---
|
|
duration_ms: 1.844509
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - nip04WorkerClient
|
|
---
|
|
duration_ms: 129.51352
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 141.48759
|
|
|
|
→ Running tests/nostr/nip07Adapter-race-condition.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip07Adapter Race Condition
|
|
# Subtest: should detect capabilities dynamically even if injected late
|
|
ok 1 - should detect capabilities dynamically even if injected late
|
|
---
|
|
duration_ms: 2.578523
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call the injected method even if added late
|
|
ok 2 - should call the injected method even if added late
|
|
---
|
|
duration_ms: 2.138723
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Nip07Adapter Race Condition
|
|
---
|
|
duration_ms: 6.163133
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.543396
|
|
|
|
→ Running tests/nostr/nip07Permissions.test.js
|
|
TAP version 13
|
|
# Subtest: writeStoredNip07Permissions normalizes and persists granted methods
|
|
ok 1 - writeStoredNip07Permissions normalizes and persists granted methods
|
|
---
|
|
duration_ms: 2.619663
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredNip07Permissions removes persisted grants
|
|
ok 2 - clearStoredNip07Permissions removes persisted grants
|
|
---
|
|
duration_ms: 0.306993
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions retries explicit and fallback variants
|
|
ok 3 - requestEnablePermissions retries explicit and fallback variants
|
|
---
|
|
duration_ms: 1.999594
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions reports unavailable extension
|
|
ok 4 - requestEnablePermissions reports unavailable extension
|
|
---
|
|
duration_ms: 0.260251
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension is present
|
|
ok 5 - waitForNip07Extension resolves when extension is present
|
|
---
|
|
duration_ms: 0.574453
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension appears later
|
|
ok 6 - waitForNip07Extension resolves when extension appears later
|
|
---
|
|
duration_ms: 50.76182
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension rejects when extension never appears
|
|
ok 7 - waitForNip07Extension rejects when extension never appears
|
|
---
|
|
duration_ms: 151.189027
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 215.946955
|
|
|
|
→ Running tests/nostr/nip46Client.test.js
|
|
TAP version 13
|
|
# Subtest: Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
ok 1 - Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
---
|
|
duration_ms: 157.666962
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
---
|
|
duration_ms: 23.348066
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
ok 3 - decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
---
|
|
duration_ms: 23.466146
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
ok 4 - decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
---
|
|
duration_ms: 22.124119
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
ok 5 - decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
---
|
|
duration_ms: 29.586003
|
|
type: 'test'
|
|
...
|
|
# Subtest: parseNip46ConnectionString handles remote signer key hints
|
|
ok 6 - parseNip46ConnectionString handles remote signer key hints
|
|
---
|
|
duration_ms: 5.330735
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
ok 7 - attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
---
|
|
duration_ms: 41.348875
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
ok 8 - attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
---
|
|
duration_ms: 27.223942
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RpcClient sendRpc publishes events and resolves responses
|
|
ok 9 - Nip46RpcClient sendRpc publishes events and resolves responses
|
|
---
|
|
duration_ms: 13.804529
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 354.381474
|
|
|
|
→ Running tests/nostr/nip46Connector.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46Connector
|
|
# Subtest: createKeyPair
|
|
# Subtest: should generate a new key pair if none provided
|
|
ok 1 - should generate a new key pair if none provided
|
|
---
|
|
duration_ms: 3.292417
|
|
type: 'test'
|
|
...
|
|
# Subtest: should use existing keys if provided
|
|
ok 2 - should use existing keys if provided
|
|
---
|
|
duration_ms: 0.489577
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - createKeyPair
|
|
---
|
|
duration_ms: 4.908463
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareHandshake
|
|
# Subtest: should parse connection string and return details
|
|
ok 1 - should parse connection string and return details
|
|
---
|
|
duration_ms: 1.214046
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - prepareHandshake
|
|
---
|
|
duration_ms: 1.642359
|
|
type: 'suite'
|
|
...
|
|
# Subtest: connect
|
|
# Subtest: should connect directly if remote pubkey is known
|
|
ok 1 - should connect directly if remote pubkey is known
|
|
---
|
|
duration_ms: 2.069337
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - connect
|
|
---
|
|
duration_ms: 2.275844
|
|
type: 'suite'
|
|
...
|
|
# Subtest: reconnectStored
|
|
# Subtest: should throw if no stored session
|
|
ok 1 - should throw if no stored session
|
|
---
|
|
duration_ms: 1.434206
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reconnect using stored session
|
|
ok 2 - should reconnect using stored session
|
|
---
|
|
duration_ms: 0.728821
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - reconnectStored
|
|
---
|
|
duration_ms: 2.549146
|
|
type: 'suite'
|
|
...
|
|
# Subtest: disconnect
|
|
# Subtest: should clear stored session and emit change
|
|
ok 1 - should clear stored session and emit change
|
|
---
|
|
duration_ms: 0.409127
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - disconnect
|
|
---
|
|
duration_ms: 0.547315
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - Nip46Connector
|
|
---
|
|
duration_ms: 13.242438
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 6
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.856747
|
|
|
|
→ Running tests/nostr/nip71.test.js
|
|
TAP version 13
|
|
# Subtest: buildNip71MetadataTags normalizes structured fields
|
|
ok 1 - buildNip71MetadataTags normalizes structured fields
|
|
---
|
|
duration_ms: 3.083143
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectNip71PointerRequests aggregates events and tags
|
|
ok 2 - collectNip71PointerRequests aggregates events and tags
|
|
---
|
|
duration_ms: 0.566501
|
|
type: 'test'
|
|
...
|
|
# Subtest: processNip71Events reconciles pointers and filters video hashtags
|
|
ok 3 - processNip71Events reconciles pointers and filters video hashtags
|
|
---
|
|
duration_ms: 1.258338
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateNip71MetadataForVideos fetches missing records once
|
|
ok 4 - populateNip71MetadataForVideos fetches missing records once
|
|
---
|
|
duration_ms: 0.948402
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent composes pointer tags
|
|
ok 5 - buildNip71VideoEvent composes pointer tags
|
|
---
|
|
duration_ms: 0.706653
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.301747
|
|
|
|
→ Running tests/nostr/nostrClientFacade.test.js
|
|
TAP version 13
|
|
# Subtest: nostrClientFacade forwards the default client instance
|
|
ok 1 - nostrClientFacade forwards the default client instance
|
|
---
|
|
duration_ms: 1.405767
|
|
type: 'test'
|
|
...
|
|
# Subtest: nostrClientFacade forwards the default permission helper
|
|
ok 2 - nostrClientFacade forwards the default permission helper
|
|
---
|
|
duration_ms: 0.368048
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.722719
|
|
|
|
→ Running tests/nostr/nostrClientRegistry.test.mjs
|
|
TAP version 13
|
|
# Subtest: registerSigner stores and resolves signer entries
|
|
ok 1 - registerSigner stores and resolves signer entries
|
|
---
|
|
duration_ms: 1.366612
|
|
type: 'test'
|
|
...
|
|
# Subtest: setActiveSigner notifies listeners and resolves by pubkey
|
|
ok 2 - setActiveSigner notifies listeners and resolves by pubkey
|
|
---
|
|
duration_ms: 0.443515
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.66545
|
|
|
|
→ Running tests/nostr/publishHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: mirrorVideoEvent lowercases provided MIME types
|
|
ok 1 - mirrorVideoEvent lowercases provided MIME types
|
|
---
|
|
duration_ms: 4.288674
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent lowercases inferred MIME types
|
|
ok 2 - mirrorVideoEvent lowercases inferred MIME types
|
|
---
|
|
duration_ms: 0.707057
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent includes hash tags when provided
|
|
ok 3 - mirrorVideoEvent includes hash tags when provided
|
|
---
|
|
duration_ms: 2.120718
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.147464
|
|
|
|
→ Running tests/nostr/reaction-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
ok 1 - publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
---
|
|
duration_ms: 5.427284
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
ok 2 - publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
---
|
|
duration_ms: 0.457876
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.976314
|
|
|
|
→ Running tests/nostr/revert-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: revertVideo preserves existing d tag
|
|
ok 1 - revertVideo preserves existing d tag
|
|
---
|
|
duration_ms: 7.092524
|
|
type: 'test'
|
|
...
|
|
# Subtest: revertVideo falls back to original event id when d tag missing
|
|
ok 2 - revertVideo falls back to original event id when d tag missing
|
|
---
|
|
duration_ms: 1.335301
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.432025
|
|
|
|
→ Running tests/nostr/session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: SessionActor
|
|
# Subtest: encrypts and decrypts private key
|
|
ok 1 - encrypts and decrypts private key
|
|
---
|
|
duration_ms: 307.114916
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails to decrypt with wrong passphrase
|
|
ok 2 - fails to decrypt with wrong passphrase
|
|
---
|
|
duration_ms: 335.172853
|
|
type: 'test'
|
|
...
|
|
# Subtest: persists and reads session actor
|
|
ok 3 - persists and reads session actor
|
|
---
|
|
duration_ms: 1.47583
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears stored session actor
|
|
ok 4 - clears stored session actor
|
|
---
|
|
duration_ms: 0.27825
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - SessionActor
|
|
---
|
|
duration_ms: 646.083581
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 659.426864
|
|
|
|
→ Running tests/nostr/sessionActor.test.js
|
|
TAP version 13
|
|
# Subtest: encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
ok 1 - encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 300.874394
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor stores encrypted payload metadata
|
|
ok 2 - persistSessionActor stores encrypted payload metadata
|
|
---
|
|
duration_ms: 148.215804
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes persisted payload
|
|
ok 3 - clearStoredSessionActor removes persisted payload
|
|
---
|
|
duration_ms: 145.843541
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 604.822938
|
|
|
|
→ Running tests/nostr/sessionActor.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/nostr/sessionActor.js
|
|
# Subtest: Encryption and Decryption Roundtrip
|
|
ok 1 - Encryption and Decryption Roundtrip
|
|
---
|
|
duration_ms: 304.941446
|
|
type: 'test'
|
|
...
|
|
# Subtest: Decryption fails with wrong passphrase
|
|
ok 2 - Decryption fails with wrong passphrase
|
|
---
|
|
duration_ms: 301.338914
|
|
type: 'test'
|
|
...
|
|
# Subtest: Persistence and Retrieval
|
|
ok 3 - Persistence and Retrieval
|
|
---
|
|
duration_ms: 293.070249
|
|
type: 'test'
|
|
...
|
|
# Subtest: Clear Stored Session Actor
|
|
ok 4 - Clear Stored Session Actor
|
|
---
|
|
duration_ms: 0.935374
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - js/nostr/sessionActor.js
|
|
---
|
|
duration_ms: 903.508816
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 910.700798
|
|
|
|
→ Running tests/nostr/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent: processes requests sequentially
|
|
ok 1 - queueSignEvent: processes requests sequentially
|
|
---
|
|
duration_ms: 102.987583
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles timeouts
|
|
ok 2 - queueSignEvent: handles timeouts
|
|
---
|
|
duration_ms: 21.44614
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles permission denied errors
|
|
ok 3 - queueSignEvent: handles permission denied errors
|
|
---
|
|
duration_ms: 0.709877
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles signer disconnected
|
|
ok 4 - queueSignEvent: handles signer disconnected
|
|
---
|
|
duration_ms: 0.50912
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: fails if signer is missing or invalid
|
|
ok 5 - queueSignEvent: fails if signer is missing or invalid
|
|
---
|
|
duration_ms: 0.454818
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: continues queue processing after failure
|
|
ok 6 - queueSignEvent: continues queue processing after failure
|
|
---
|
|
duration_ms: 0.76932
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 212.00415
|
|
|
|
→ Running tests/nostr/signers.test.mjs
|
|
TAP version 13
|
|
# Subtest: setActiveSigner hydrates extension capabilities from window.nostr
|
|
ok 1 - setActiveSigner hydrates extension capabilities from window.nostr
|
|
---
|
|
duration_ms: 1.668145
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.133702
|
|
|
|
→ Running tests/nostr/syncMetadataStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: SyncMetadataStore
|
|
# Subtest: should load from localStorage on initialization
|
|
ok 1 - should load from localStorage on initialization
|
|
---
|
|
duration_ms: 1.740366
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update last seen and save to localStorage
|
|
ok 2 - should update last seen and save to localStorage
|
|
---
|
|
duration_ms: 0.667389
|
|
type: 'test'
|
|
...
|
|
# Subtest: should only update if timestamp is newer
|
|
ok 3 - should only update if timestamp is newer
|
|
---
|
|
duration_ms: 0.676345
|
|
type: 'test'
|
|
...
|
|
# Subtest: should get per-relay last seen
|
|
ok 4 - should get per-relay last seen
|
|
---
|
|
duration_ms: 1.647971
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing localStorage gracefully
|
|
ok 5 - should handle missing localStorage gracefully
|
|
---
|
|
duration_ms: 0.363011
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - SyncMetadataStore
|
|
---
|
|
duration_ms: 6.896094
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.87894
|
|
|
|
→ Running tests/nostr/toolkit.test.mjs
|
|
TAP version 13
|
|
# Subtest: toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
ok 1 - toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
---
|
|
duration_ms: 1.15173
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
ok 2 - toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
---
|
|
duration_ms: 0.429225
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
ok 3 - toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
---
|
|
duration_ms: 0.644651
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
ok 4 - toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
---
|
|
duration_ms: 0.352486
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: normalizeToolkitCandidate validation
|
|
ok 5 - toolkit: normalizeToolkitCandidate validation
|
|
---
|
|
duration_ms: 0.614809
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
ok 6 - toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
---
|
|
duration_ms: 12.051017
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.617471
|
|
|
|
→ Running tests/nostr/videoEventBuffer.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoEventBuffer
|
|
# Subtest: Push and Flush
|
|
ok 1 - Push and Flush
|
|
---
|
|
duration_ms: 3.181958
|
|
type: 'test'
|
|
...
|
|
# Subtest: Latest Wins
|
|
ok 2 - Latest Wins
|
|
---
|
|
duration_ms: 0.706584
|
|
type: 'test'
|
|
...
|
|
# Subtest: Tombstone Handling
|
|
ok 3 - Tombstone Handling
|
|
---
|
|
duration_ms: 0.795748
|
|
type: 'test'
|
|
...
|
|
# Subtest: Cleanup
|
|
ok 4 - Cleanup
|
|
---
|
|
duration_ms: 0.618369
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - VideoEventBuffer
|
|
---
|
|
duration_ms: 6.989106
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.16026
|
|
|
|
→ Running tests/nostr/videoPayloadBuilder.test.mjs
|
|
TAP version 13
|
|
# Subtest: videoPayloadBuilder
|
|
# Subtest: extractVideoPublishPayload
|
|
# Subtest: extracts videoData and nip71Metadata
|
|
ok 1 - extracts videoData and nip71Metadata
|
|
---
|
|
duration_ms: 1.931541
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles legacyFormData structure
|
|
ok 2 - handles legacyFormData structure
|
|
---
|
|
duration_ms: 0.208762
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags
|
|
ok 3 - normalizes boolean flags
|
|
---
|
|
duration_ms: 0.197248
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags (kids only)
|
|
ok 4 - normalizes boolean flags (kids only)
|
|
---
|
|
duration_ms: 0.281103
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - extractVideoPublishPayload
|
|
---
|
|
duration_ms: 3.724139
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload
|
|
# Subtest: throws if pubkey is missing
|
|
ok 1 - throws if pubkey is missing
|
|
---
|
|
duration_ms: 1.373286
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates a valid event structure
|
|
ok 2 - generates a valid event structure
|
|
---
|
|
duration_ms: 2.593942
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates unique d tag and videoRootId if not provided
|
|
ok 3 - generates unique d tag and videoRootId if not provided
|
|
---
|
|
duration_ms: 0.451472
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses provided seriesIdentifier as d tag
|
|
ok 4 - uses provided seriesIdentifier as d tag
|
|
---
|
|
duration_ms: 0.625268
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolves infoHash from magnet
|
|
ok 5 - resolves infoHash from magnet
|
|
---
|
|
duration_ms: 0.605172
|
|
type: 'test'
|
|
...
|
|
# Subtest: includes NIP-71 tags
|
|
ok 6 - includes NIP-71 tags
|
|
---
|
|
duration_ms: 0.91536
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - prepareVideoPublishPayload
|
|
---
|
|
duration_ms: 7.288491
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - videoPayloadBuilder
|
|
---
|
|
duration_ms: 11.734842
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 3
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.515682
|
|
|
|
→ Running tests/nostr/watchHistory.test.js
|
|
[bitvid] [ProfileCache] Expired watchHistory for 2222222222222222222222222222222222222222222222222222222222222222
|
|
TAP version 13
|
|
# Subtest: buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
ok 1 - buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
---
|
|
duration_ms: 3.156341
|
|
type: 'test'
|
|
...
|
|
# Subtest: getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
ok 2 - getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
---
|
|
duration_ms: 2.555881
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
ok 3 - fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
---
|
|
duration_ms: 9.427191
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
ok 4 - fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
---
|
|
duration_ms: 2.337398
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
ok 5 - publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
---
|
|
duration_ms: 4.56391
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot caches successful snapshot results
|
|
ok 6 - publishWatchHistorySnapshot caches successful snapshot results
|
|
---
|
|
duration_ms: 3.989988
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 33.873477
|
|
|
|
→ Running tests/nostr/watchHistoryBindings.test.js
|
|
TAP version 13
|
|
# Subtest: updateWatchHistoryList delegates to the client's manager
|
|
ok 1 - updateWatchHistoryList delegates to the client's manager
|
|
---
|
|
duration_ms: 2.640881
|
|
type: 'test'
|
|
...
|
|
# Subtest: removeWatchHistoryItem delegates to the client's manager
|
|
ok 2 - removeWatchHistoryItem delegates to the client's manager
|
|
---
|
|
duration_ms: 0.579432
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when the manager is unavailable
|
|
ok 3 - watch history bindings throw when the manager is unavailable
|
|
---
|
|
duration_ms: 0.79833
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when a required method is missing
|
|
ok 4 - watch history bindings throw when a required method is missing
|
|
---
|
|
duration_ms: 0.343514
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.424228
|
|
|
|
→ Running tests/nwc-settings-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: nwc settings service preserves settings across profile switches
|
|
ok 1 - nwc settings service preserves settings across profile switches
|
|
---
|
|
duration_ms: 2.117666
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateActiveNwcSettings returns cloned values
|
|
ok 2 - updateActiveNwcSettings returns cloned values
|
|
---
|
|
duration_ms: 0.511521
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.686
|
|
|
|
→ Running tests/performance/resolvePostedAt.test.mjs
|
|
pool.list calls: 2
|
|
pool.get calls: 0
|
|
TAP version 13
|
|
# Subtest: hydrateVideoHistoryBatch optimizes network calls
|
|
ok 1 - hydrateVideoHistoryBatch optimizes network calls
|
|
---
|
|
duration_ms: 4.876277
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPostedAtBatch uses batch hydration
|
|
ok 2 - resolveVideoPostedAtBatch uses batch hydration
|
|
---
|
|
duration_ms: 0.727177
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.704617
|
|
|
|
→ Running tests/position-floating-panel.test.mjs
|
|
TAP version 13
|
|
# Subtest: flips placement when bottom placement would collide with viewport
|
|
ok 1 - flips placement when bottom placement would collide with viewport
|
|
---
|
|
duration_ms: 357.362634
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes previously open popovers without restoring focus
|
|
ok 2 - closes previously open popovers without restoring focus
|
|
---
|
|
duration_ms: 68.039185
|
|
type: 'test'
|
|
...
|
|
# Subtest: restores focus to the trigger when closed
|
|
ok 3 - restores focus to the trigger when closed
|
|
---
|
|
duration_ms: 44.858289
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 478.912948
|
|
|
|
→ Running tests/profile-cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: ProfileCache: setActiveProfile and getActiveProfile
|
|
ok 1 - ProfileCache: setActiveProfile and getActiveProfile
|
|
---
|
|
duration_ms: 2.152896
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolveAddressKey
|
|
ok 2 - ProfileCache: resolveAddressKey
|
|
---
|
|
duration_ms: 0.547203
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: set and get (memory and persistence)
|
|
ok 3 - ProfileCache: set and get (memory and persistence)
|
|
---
|
|
duration_ms: 23.07364
|
|
type: 'test'
|
|
...
|
|
[bitvid] [ProfileCache] Expired watchHistory for eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
|
|
# Subtest: ProfileCache: setProfile normalization and storage
|
|
ok 4 - ProfileCache: setProfile normalization and storage
|
|
---
|
|
duration_ms: 21.919366
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: TTL expiration
|
|
ok 5 - ProfileCache: TTL expiration
|
|
---
|
|
duration_ms: 2.016785
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
ok 6 - ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
---
|
|
duration_ms: 0.717061
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: listeners
|
|
ok 7 - ProfileCache: listeners
|
|
---
|
|
duration_ms: 0.397852
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 60.428137
|
|
|
|
→ Running tests/profile-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: Profile modal Escape closes and restores trigger focus
|
|
ok 1 - Profile modal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 1459.635915
|
|
type: 'test'
|
|
...
|
|
# Subtest: Add profile request suspends focus trap and elevates login modal
|
|
ok 2 - Add profile request suspends focus trap and elevates login modal
|
|
---
|
|
duration_ms: 1378.877754
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal navigation buttons toggle active state
|
|
ok 3 - Profile modal navigation buttons toggle active state
|
|
---
|
|
duration_ms: 1560.379642
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal toggles mobile menu and pane views
|
|
ok 4 - Profile modal toggles mobile menu and pane views
|
|
---
|
|
duration_ms: 1701.195184
|
|
type: 'test'
|
|
...
|
|
# Subtest: wallet URI input masks persisted values and restores on focus
|
|
ok 5 - wallet URI input masks persisted values and restores on focus
|
|
---
|
|
duration_ms: 1124.283606
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal uses abbreviated npub display
|
|
ok 6 - Profile modal uses abbreviated npub display
|
|
---
|
|
duration_ms: 850.766463
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSavedProfiles applies provider metadata
|
|
ok 7 - renderSavedProfiles applies provider metadata
|
|
---
|
|
duration_ms: 854.811187
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane shows empty states by default
|
|
ok 8 - Hashtag pane shows empty states by default
|
|
---
|
|
duration_ms: 1032.807854
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane adds, moves, and removes tags
|
|
ok 9 - Hashtag pane adds, moves, and removes tags
|
|
---
|
|
duration_ms: 997.503738
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddHashtagPreference publishes updates
|
|
ok 10 - handleAddHashtagPreference publishes updates
|
|
---
|
|
duration_ms: 975.206304
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane resets after logout when service clears tags
|
|
ok 11 - Hashtag pane resets after logout when service clears tags
|
|
---
|
|
duration_ms: 1252.49781
|
|
type: 'test'
|
|
...
|
|
# Subtest: load() injects markup and caches expected elements
|
|
ok 12 - load() injects markup and caches expected elements
|
|
---
|
|
duration_ms: 523.938619
|
|
type: 'test'
|
|
...
|
|
# Subtest: show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
ok 13 - show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
---
|
|
duration_ms: 1002.775472
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateProfileRelays renders entries and wires action buttons
|
|
ok 14 - populateProfileRelays renders entries and wires action buttons
|
|
---
|
|
duration_ms: 513.450883
|
|
type: 'test'
|
|
...
|
|
# Subtest: admin mutations invoke accessControl stubs and update admin DOM
|
|
ok 15 - admin mutations invoke accessControl stubs and update admin DOM
|
|
---
|
|
duration_ms: 518.996831
|
|
type: 'test'
|
|
...
|
|
# Subtest: history pane lazily initializes the watch history renderer
|
|
ok 16 - history pane lazily initializes the watch history renderer
|
|
---
|
|
duration_ms: 1376.370266
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning throttles status updates
|
|
ok 17 - handleDirectMessagesRelayWarning throttles status updates
|
|
---
|
|
duration_ms: 503.573354
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
ok 18 - handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
---
|
|
duration_ms: 514.649293
|
|
type: 'test'
|
|
...
|
|
1..18
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18152.118795
|
|
|
|
→ Running tests/reaction-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildReactionEvent includes pointer and author tags when pubkey provided
|
|
ok 1 - buildReactionEvent includes pointer and author tags when pubkey provided
|
|
---
|
|
duration_ms: 3.026014
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildReactionEvent merges address and event pointers for addressable targets
|
|
ok 2 - buildReactionEvent merges address and event pointers for addressable targets
|
|
---
|
|
duration_ms: 0.662029
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.931801
|
|
|
|
→ Running tests/revert-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: RevertModalController
|
|
# Subtest: open() fetches history and opens modal
|
|
ok 1 - open() fetches history and opens modal
|
|
---
|
|
duration_ms: 2.083403
|
|
type: 'test'
|
|
...
|
|
# Subtest: open() shows error if not logged in
|
|
ok 2 - open() shows error if not logged in
|
|
---
|
|
duration_ms: 0.430974
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleConfirm() calls revertVideo and refreshes
|
|
ok 3 - handleConfirm() calls revertVideo and refreshes
|
|
---
|
|
duration_ms: 0.637654
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - RevertModalController
|
|
---
|
|
duration_ms: 4.948174
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.385831
|
|
|
|
→ Running tests/safe-decode.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeURIComponent returns original value on malformed sequences
|
|
ok 1 - safeDecodeURIComponent returns original value on malformed sequences
|
|
---
|
|
duration_ms: 1.206942
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecode helpers handle double-encoded values when applied repeatedly
|
|
ok 2 - safeDecode helpers handle double-encoded values when applied repeatedly
|
|
---
|
|
duration_ms: 0.253651
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose trims inputs by default
|
|
ok 3 - safeDecodeURIComponentLoose trims inputs by default
|
|
---
|
|
duration_ms: 0.265908
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
ok 4 - safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
---
|
|
duration_ms: 0.172606
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponent handles empty strings consistently
|
|
ok 5 - safeDecodeURIComponent handles empty strings consistently
|
|
---
|
|
duration_ms: 0.317457
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.891592
|
|
|
|
→ Running tests/services/attachmentService.test.mjs
|
|
TAP version 13
|
|
# Subtest: attachmentService
|
|
# Subtest: prepareAttachmentUpload
|
|
# Subtest: should prepare upload without encryption
|
|
ok 1 - should prepare upload without encryption
|
|
---
|
|
duration_ms: 3.052032
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prepare upload with encryption
|
|
ok 2 - should prepare upload with encryption
|
|
---
|
|
duration_ms: 9.832912
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - prepareAttachmentUpload
|
|
---
|
|
duration_ms: 13.710917
|
|
type: 'suite'
|
|
...
|
|
# Subtest: downloadAttachment
|
|
# Subtest: should download attachment
|
|
ok 1 - should download attachment
|
|
---
|
|
duration_ms: 1.885675
|
|
type: 'test'
|
|
...
|
|
# Subtest: should verify hash
|
|
ok 2 - should verify hash
|
|
---
|
|
duration_ms: 1.118563
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on hash mismatch
|
|
ok 3 - should throw on hash mismatch
|
|
---
|
|
duration_ms: 1.288271
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - downloadAttachment
|
|
---
|
|
duration_ms: 4.721208
|
|
type: 'suite'
|
|
...
|
|
# Subtest: caching
|
|
# Subtest: should cache downloaded attachments
|
|
ok 1 - should cache downloaded attachments
|
|
---
|
|
duration_ms: 1.197855
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 2 - should clear cache
|
|
---
|
|
duration_ms: 1.388668
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - caching
|
|
---
|
|
duration_ms: 3.022836
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - attachmentService
|
|
---
|
|
duration_ms: 23.176776
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 4
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 37.416554
|
|
|
|
→ Running tests/services/authUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: authUtils
|
|
# Subtest: normalizeProviderId
|
|
# Subtest: returns trimmed string if valid
|
|
ok 1 - returns trimmed string if valid
|
|
---
|
|
duration_ms: 2.142142
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if empty
|
|
ok 2 - returns 'nip07' fallback if empty
|
|
---
|
|
duration_ms: 0.190555
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if null
|
|
ok 3 - returns 'nip07' fallback if null
|
|
---
|
|
duration_ms: 0.265862
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if undefined
|
|
ok 4 - returns 'nip07' fallback if undefined
|
|
---
|
|
duration_ms: 0.250137
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if not a string
|
|
ok 5 - returns 'nip07' fallback if not a string
|
|
---
|
|
duration_ms: 0.177825
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - normalizeProviderId
|
|
---
|
|
duration_ms: 4.652097
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAuthType
|
|
# Subtest: prioritizes authTypeCandidate
|
|
ok 1 - prioritizes authTypeCandidate
|
|
---
|
|
duration_ms: 0.406072
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.authType
|
|
ok 2 - falls back to providerResult.authType
|
|
---
|
|
duration_ms: 0.205207
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.providerId
|
|
ok 3 - falls back to providerResult.providerId
|
|
---
|
|
duration_ms: 0.335382
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerId
|
|
ok 4 - falls back to providerId
|
|
---
|
|
duration_ms: 0.225463
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' if all else fails
|
|
ok 5 - returns 'nip07' if all else fails
|
|
---
|
|
duration_ms: 0.125314
|
|
type: 'test'
|
|
...
|
|
# Subtest: trims whitespace from results
|
|
ok 6 - trims whitespace from results
|
|
---
|
|
duration_ms: 0.116464
|
|
type: 'test'
|
|
...
|
|
# Subtest: ignores empty strings in candidates
|
|
ok 7 - ignores empty strings in candidates
|
|
---
|
|
duration_ms: 0.127014
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - normalizeAuthType
|
|
---
|
|
duration_ms: 2.963718
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - authUtils
|
|
---
|
|
duration_ms: 8.823927
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.993539
|
|
|
|
→ Running tests/services/discussionCountService.test.mjs
|
|
TAP version 13
|
|
# Subtest: DiscussionCountService
|
|
# Subtest: initialization sets defaults
|
|
ok 1 - initialization sets defaults
|
|
---
|
|
duration_ms: 1.134266
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if videos array is empty or invalid
|
|
ok 2 - refreshCounts returns early if videos array is empty or invalid
|
|
---
|
|
duration_ms: 0.854982
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if dependencies are missing
|
|
ok 3 - refreshCounts returns early if dependencies are missing
|
|
---
|
|
duration_ms: 1.110586
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles happy path (fetches and updates DOM)
|
|
ok 4 - refreshCounts handles happy path (fetches and updates DOM)
|
|
---
|
|
duration_ms: 42.135387
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts uses cached count if available
|
|
ok 5 - refreshCounts uses cached count if available
|
|
---
|
|
duration_ms: 2.541466
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles API errors gracefully
|
|
ok 6 - refreshCounts handles API errors gracefully
|
|
---
|
|
duration_ms: 4.252978
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles partial results
|
|
ok 7 - refreshCounts handles partial results
|
|
---
|
|
duration_ms: 3.567812
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles unsupported relays (empty perRelay)
|
|
ok 8 - refreshCounts handles unsupported relays (empty perRelay)
|
|
---
|
|
duration_ms: 2.240418
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - DiscussionCountService
|
|
---
|
|
duration_ms: 143.906768
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 160.542562
|
|
|
|
→ Running tests/services/exploreDataService.optimization.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService optimization
|
|
# Subtest: toLightweightVideo extracts necessary fields
|
|
ok 1 - toLightweightVideo extracts necessary fields
|
|
---
|
|
duration_ms: 1.775775
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags works with lightweight object
|
|
ok 2 - collectVideoTags works with lightweight object
|
|
---
|
|
duration_ms: 13.534291
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildVideoAddressPointer works with lightweight object
|
|
ok 3 - buildVideoAddressPointer works with lightweight object
|
|
---
|
|
duration_ms: 0.39956
|
|
type: 'test'
|
|
...
|
|
# Subtest: toLightweightVideo handles invalid input
|
|
ok 4 - toLightweightVideo handles invalid input
|
|
---
|
|
duration_ms: 0.235155
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - exploreDataService optimization
|
|
---
|
|
duration_ms: 17.578118
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.893964
|
|
|
|
→ Running tests/services/exploreDataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService - buildWatchHistoryTagCounts
|
|
# Subtest: should return empty Map if watchHistoryService is missing
|
|
ok 1 - should return empty Map if watchHistoryService is missing
|
|
---
|
|
duration_ms: 1.297382
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing loadLatest method gracefully
|
|
ok 2 - should handle missing loadLatest method gracefully
|
|
---
|
|
duration_ms: 0.414861
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle loadLatest failure gracefully
|
|
ok 3 - should handle loadLatest failure gracefully
|
|
---
|
|
duration_ms: 7.685264
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return counts from worker on success
|
|
ok 4 - should return counts from worker on success
|
|
---
|
|
duration_ms: 2.220021
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error gracefully
|
|
ok 5 - should handle worker error gracefully
|
|
---
|
|
duration_ms: 1.536676
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - exploreDataService - buildWatchHistoryTagCounts
|
|
---
|
|
duration_ms: 22.531874
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.012664
|
|
|
|
→ Running tests/services/link-preview-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: LinkPreviewService
|
|
# Subtest: initializes IndexedDB
|
|
ok 1 - initializes IndexedDB
|
|
---
|
|
duration_ms: 9.015189
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetches and caches preview
|
|
ok 2 - fetches and caches preview
|
|
---
|
|
duration_ms: 25.403727
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null on fetch failure
|
|
ok 3 - returns null on fetch failure
|
|
---
|
|
duration_ms: 2.437336
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects TTL
|
|
ok 4 - respects TTL
|
|
---
|
|
duration_ms: 13.396149
|
|
type: 'test'
|
|
...
|
|
# Subtest: deletePreview removes from cache
|
|
ok 5 - deletePreview removes from cache
|
|
---
|
|
duration_ms: 1.992136
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - LinkPreviewService
|
|
---
|
|
duration_ms: 55.291171
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 62.948503
|
|
|
|
→ Running tests/services/moderation-action-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationActionController: handles moderation override
|
|
ok 1 - ModerationActionController: handles moderation override
|
|
---
|
|
duration_ms: 1.885111
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: blocks user and updates state
|
|
ok 2 - ModerationActionController: blocks user and updates state
|
|
---
|
|
duration_ms: 0.953645
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: prevents blocking self
|
|
ok 3 - ModerationActionController: prevents blocking self
|
|
---
|
|
duration_ms: 0.377822
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: requires login to block
|
|
ok 4 - ModerationActionController: requires login to block
|
|
---
|
|
duration_ms: 0.369448
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: handles hide action
|
|
ok 5 - ModerationActionController: handles hide action
|
|
---
|
|
duration_ms: 0.40744
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.632668
|
|
|
|
→ Running tests/services/nostr-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrService
|
|
# Subtest: loadVideos
|
|
# Subtest: should load cached videos and start subscription
|
|
ok 1 - should load cached videos and start subscription
|
|
---
|
|
duration_ms: 3.473023
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - loadVideos
|
|
---
|
|
duration_ms: 4.472899
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideosByAuthors
|
|
# Subtest: should fetch videos from relays for specific authors
|
|
ok 1 - should fetch videos from relays for specific authors
|
|
---
|
|
duration_ms: 2.341556
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - fetchVideosByAuthors
|
|
---
|
|
duration_ms: 2.58281
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - NostrService
|
|
---
|
|
duration_ms: 7.927124
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 3
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.375361
|
|
|
|
→ Running tests/services/playbackService_forcedSource.test.mjs
|
|
(node:6238) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Forced Source Logic
|
|
# Subtest: Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
ok 1 - Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
---
|
|
duration_ms: 12.12387
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
ok 2 - Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
---
|
|
duration_ms: 4.011871
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
ok 3 - Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
---
|
|
duration_ms: 1.980868
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
ok 4 - Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
---
|
|
duration_ms: 1.599747
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
ok 5 - Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
---
|
|
duration_ms: 1.970752
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - PlaybackService Forced Source Logic
|
|
---
|
|
duration_ms: 102.471974
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 114.717755
|
|
|
|
→ Running tests/services/playbackService_order.test.mjs
|
|
(node:6245) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Ordering
|
|
# Subtest: Playback Execution Order
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, succeeds
|
|
ok 1 - urlFirstEnabled=true: Tries URL first, succeeds
|
|
---
|
|
duration_ms: 8.274972
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
ok 2 - urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
---
|
|
duration_ms: 1.636836
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
ok 3 - urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
---
|
|
duration_ms: 1.313797
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
ok 4 - urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
---
|
|
duration_ms: 1.946797
|
|
type: 'test'
|
|
...
|
|
# Subtest: forcedSource=torrent overrides urlFirstEnabled=true
|
|
ok 5 - forcedSource=torrent overrides urlFirstEnabled=true
|
|
---
|
|
duration_ms: 0.829728
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Playback Execution Order
|
|
---
|
|
duration_ms: 15.093629
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - PlaybackService Ordering
|
|
---
|
|
duration_ms: 16.611772
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 2
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.218047
|
|
|
|
→ Running tests/services/playbackService.test.mjs
|
|
(node:6252) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService
|
|
# Subtest: Initialization sets defaults and dependencies
|
|
ok 1 - Initialization sets defaults and dependencies
|
|
---
|
|
duration_ms: 1.488651
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoElement respects localStorage and binds listener
|
|
ok 2 - prepareVideoElement respects localStorage and binds listener
|
|
---
|
|
duration_ms: 4.657875
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
ok 3 - registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
---
|
|
duration_ms: 1.663013
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
ok 4 - registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
---
|
|
duration_ms: 0.671117
|
|
type: 'test'
|
|
...
|
|
# Subtest: createSession returns a PlaybackSession
|
|
ok 5 - createSession returns a PlaybackSession
|
|
---
|
|
duration_ms: 0.51587
|
|
type: 'test'
|
|
...
|
|
# Subtest: PlaybackSession Flow
|
|
# Subtest: URL Probe Success starts playback
|
|
ok 1 - URL Probe Success starts playback
|
|
---
|
|
duration_ms: 8.660793
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Probe Failure triggers fallback
|
|
ok 2 - URL Probe Failure triggers fallback
|
|
---
|
|
duration_ms: 2.605594
|
|
type: 'test'
|
|
...
|
|
# Subtest: Watchdog Stall triggers fallback
|
|
ok 3 - Watchdog Stall triggers fallback
|
|
---
|
|
duration_ms: 2.978819
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 6 - PlaybackSession Flow
|
|
---
|
|
duration_ms: 14.747368
|
|
type: 'suite'
|
|
...
|
|
1..6
|
|
ok 1 - PlaybackService
|
|
---
|
|
duration_ms: 106.8732
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 121.720203
|
|
|
|
→ Running tests/services/profileMetadataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: profileMetadataService
|
|
# Subtest: fetchProfileMetadataBatch
|
|
# Subtest: should return empty map if no pubkeys provided
|
|
ok 1 - should return empty map if no pubkeys provided
|
|
---
|
|
duration_ms: 1.795477
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fetch profiles for provided pubkeys
|
|
ok 2 - should fetch profiles for provided pubkeys
|
|
---
|
|
duration_ms: 2.455948
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle relay failures gracefully
|
|
ok 3 - should handle relay failures gracefully
|
|
---
|
|
duration_ms: 0.618656
|
|
type: 'test'
|
|
...
|
|
# Subtest: should parse profile content correctly
|
|
ok 4 - should parse profile content correctly
|
|
---
|
|
duration_ms: 0.821687
|
|
type: 'test'
|
|
...
|
|
# Subtest: should deduplicate concurrent requests (inflight)
|
|
ok 5 - should deduplicate concurrent requests (inflight)
|
|
---
|
|
duration_ms: 7.339465
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - fetchProfileMetadataBatch
|
|
---
|
|
duration_ms: 14.420027
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchProfileMetadata
|
|
# Subtest: should return null for invalid pubkey
|
|
ok 1 - should return null for invalid pubkey
|
|
---
|
|
duration_ms: 0.453113
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return single profile result
|
|
ok 2 - should return single profile result
|
|
---
|
|
duration_ms: 0.507022
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - fetchProfileMetadata
|
|
---
|
|
duration_ms: 1.491389
|
|
type: 'suite'
|
|
...
|
|
# Subtest: ensureProfileMetadataSubscription
|
|
# Subtest: should return null if nostr pool is missing
|
|
ok 1 - should return null if nostr pool is missing
|
|
---
|
|
duration_ms: 0.538181
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a subscription via relaySubscriptionService
|
|
ok 2 - should create a subscription via relaySubscriptionService
|
|
---
|
|
duration_ms: 13.909156
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle onProfile callback
|
|
ok 3 - should handle onProfile callback
|
|
---
|
|
duration_ms: 1.010312
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - ensureProfileMetadataSubscription
|
|
---
|
|
duration_ms: 15.80176
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - profileMetadataService
|
|
---
|
|
duration_ms: 32.564903
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 4
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 46.650283
|
|
|
|
→ Running tests/services/r2Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/services/r2Service.js
|
|
# Subtest: Default Settings
|
|
ok 1 - Default Settings
|
|
---
|
|
duration_ms: 2.344398
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Valid Input
|
|
ok 2 - handleCloudflareSettingsSubmit - Valid Input
|
|
---
|
|
duration_ms: 0.705031
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
ok 3 - handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
---
|
|
duration_ms: 0.987548
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Missing Fields
|
|
ok 4 - handleCloudflareSettingsSubmit - Missing Fields
|
|
---
|
|
duration_ms: 0.680508
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
ok 5 - ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
---
|
|
duration_ms: 2.024647
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
ok 6 - ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
---
|
|
duration_ms: 0.438799
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Maps meta bucket into settings
|
|
ok 7 - resolveConnection - Maps meta bucket into settings
|
|
---
|
|
duration_ms: 0.83861
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Returns null without StorageService entries
|
|
ok 8 - resolveConnection - Returns null without StorageService entries
|
|
---
|
|
duration_ms: 0.338553
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - js/services/r2Service.js
|
|
---
|
|
duration_ms: 11.769752
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.020697
|
|
|
|
→ Running tests/services/relay-health-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: RelayHealthService: initializes with default values
|
|
ok 1 - RelayHealthService: initializes with default values
|
|
---
|
|
duration_ms: 1.62283
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: manages telemetry opt-in
|
|
ok 2 - RelayHealthService: manages telemetry opt-in
|
|
---
|
|
duration_ms: 0.401474
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: getRelayUrls fetches from relayManager
|
|
ok 3 - RelayHealthService: getRelayUrls fetches from relayManager
|
|
---
|
|
duration_ms: 1.010927
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: ensureRelayState creates default state
|
|
ok 4 - RelayHealthService: ensureRelayState creates default state
|
|
---
|
|
duration_ms: 0.244444
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay success flow
|
|
ok 5 - RelayHealthService: checkRelay success flow
|
|
---
|
|
duration_ms: 0.905396
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay failure flow
|
|
ok 6 - RelayHealthService: checkRelay failure flow
|
|
---
|
|
duration_ms: 0.600909
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay handles missing nostrClient
|
|
ok 7 - RelayHealthService: checkRelay handles missing nostrClient
|
|
---
|
|
duration_ms: 0.275469
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: refresh checks all relays
|
|
ok 8 - RelayHealthService: refresh checks all relays
|
|
---
|
|
duration_ms: 0.682157
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: emits telemetry if opted in
|
|
ok 9 - RelayHealthService: emits telemetry if opted in
|
|
---
|
|
duration_ms: 0.945564
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
ok 10 - RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
---
|
|
duration_ms: 9.620172
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: failure threshold triggers user warning
|
|
ok 11 - RelayHealthService: failure threshold triggers user warning
|
|
---
|
|
duration_ms: 0.843029
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: user warning respects cooldown
|
|
ok 12 - RelayHealthService: user warning respects cooldown
|
|
---
|
|
duration_ms: 0.477081
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: relay disconnect/error events trigger failure
|
|
ok 13 - RelayHealthService: relay disconnect/error events trigger failure
|
|
---
|
|
duration_ms: 0.309294
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
ok 14 - RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
---
|
|
duration_ms: 0.252146
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 5015.406704
|
|
|
|
→ Running tests/services/s3Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: s3Service
|
|
# Subtest: validateS3Connection
|
|
# Subtest: should validate correct configuration
|
|
ok 1 - should validate correct configuration
|
|
---
|
|
duration_ms: 1.537744
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on missing required fields
|
|
ok 2 - should throw on missing required fields
|
|
---
|
|
duration_ms: 0.754626
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - validateS3Connection
|
|
---
|
|
duration_ms: 3.387379
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getCorsOrigins
|
|
# Subtest: should return current origin
|
|
ok 1 - should return current origin
|
|
---
|
|
duration_ms: 88.85011
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle localhost
|
|
ok 2 - should handle localhost
|
|
---
|
|
duration_ms: 13.855725
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - getCorsOrigins
|
|
---
|
|
duration_ms: 103.101176
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - s3Service
|
|
---
|
|
duration_ms: 107.327299
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 3
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 126.427701
|
|
|
|
→ Running tests/services/s3UploadService.test.mjs
|
|
TAP version 13
|
|
# Subtest: S3UploadService
|
|
# Subtest: constructor initializes listeners
|
|
ok 1 - constructor initializes listeners
|
|
---
|
|
duration_ms: 1.552565
|
|
type: 'test'
|
|
...
|
|
# Subtest: Event Emitter Logic
|
|
ok 2 - Event Emitter Logic
|
|
---
|
|
duration_ms: 1.539785
|
|
type: 'test'
|
|
...
|
|
# Subtest: emit handles listener errors safely
|
|
ok 3 - emit handles listener errors safely
|
|
---
|
|
duration_ms: 0.648109
|
|
type: 'test'
|
|
...
|
|
# Subtest: verifyConnection
|
|
ok 4 - verifyConnection
|
|
---
|
|
duration_ms: 0.607624
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareUpload
|
|
ok 5 - prepareUpload
|
|
---
|
|
duration_ms: 0.455837
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadFile
|
|
# Subtest: validates parameters
|
|
ok 1 - validates parameters
|
|
---
|
|
duration_ms: 1.008123
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads successfully
|
|
ok 2 - uploads successfully
|
|
---
|
|
duration_ms: 1.263618
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - uploadFile
|
|
---
|
|
duration_ms: 3.114295
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadVideo
|
|
# Subtest: fails if npub missing
|
|
ok 1 - fails if npub missing
|
|
---
|
|
duration_ms: 1.231625
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if title missing
|
|
ok 2 - fails if title missing
|
|
---
|
|
duration_ms: 0.569379
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if file missing
|
|
ok 3 - fails if file missing
|
|
---
|
|
duration_ms: 0.275111
|
|
type: 'test'
|
|
...
|
|
# Subtest: successful upload flow
|
|
ok 4 - successful upload flow
|
|
---
|
|
duration_ms: 2.903867
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads thumbnail if provided
|
|
ok 5 - uploads thumbnail if provided
|
|
---
|
|
duration_ms: 0.664107
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles validation errors from normalizeVideoNotePayload
|
|
ok 6 - handles validation errors from normalizeVideoNotePayload
|
|
---
|
|
duration_ms: 0.39011
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles upload exception
|
|
ok 7 - handles upload exception
|
|
---
|
|
duration_ms: 0.418631
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 7 - uploadVideo
|
|
---
|
|
duration_ms: 7.988608
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - S3UploadService
|
|
---
|
|
duration_ms: 18.697344
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 42.103524
|
|
|
|
→ Running tests/services/trustBootstrap.test.mjs
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:150:11)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at runAsyncRetry (file:///app/js/services/trustBootstrap.js:160:13)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl failed
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:164:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:171:30)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
TAP version 13
|
|
# Subtest: trustBootstrap
|
|
# Subtest: should return early if feature is disabled
|
|
ok 1 - should return early if feature is disabled
|
|
---
|
|
duration_ms: 2.415748
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply seeds when accessControl is ready
|
|
ok 2 - should apply seeds when accessControl is ready
|
|
---
|
|
duration_ms: 1.449836
|
|
type: 'test'
|
|
...
|
|
# Subtest: should subscribe to accessControl changes
|
|
ok 3 - should subscribe to accessControl changes
|
|
---
|
|
duration_ms: 1.067354
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle accessControl timeout and apply seeds anyway
|
|
ok 4 - should handle accessControl timeout and apply seeds anyway
|
|
---
|
|
duration_ms: 2.710452
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recompute summaries after applying seeds
|
|
ok 5 - should recompute summaries after applying seeds
|
|
---
|
|
duration_ms: 0.569838
|
|
type: 'test'
|
|
...
|
|
# Subtest: should wait for relays if hydration fails initially
|
|
ok 6 - should wait for relays if hydration fails initially
|
|
---
|
|
duration_ms: 301.631096
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - trustBootstrap
|
|
---
|
|
duration_ms: 311.731394
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3767.262737
|
|
|
|
→ Running tests/share-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildShareEvent preserves share content
|
|
ok 1 - buildShareEvent preserves share content
|
|
---
|
|
duration_ms: 2.31449
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent normalizes hex identifiers for e and p tags
|
|
ok 2 - buildShareEvent normalizes hex identifiers for e and p tags
|
|
---
|
|
duration_ms: 1.942959
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent includes sanitized relay hints
|
|
ok 3 - buildShareEvent includes sanitized relay hints
|
|
---
|
|
duration_ms: 0.723309
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent tolerates missing optional fields
|
|
ok 4 - buildShareEvent tolerates missing optional fields
|
|
---
|
|
duration_ms: 0.239556
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.40987
|
|
|
|
→ Running tests/shareNostrController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ShareNostrController
|
|
# Subtest: handleShare shares video successfully
|
|
ok 1 - handleShare shares video successfully
|
|
---
|
|
duration_ms: 2.170872
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleShare throws error if missing video details
|
|
ok 2 - handleShare throws error if missing video details
|
|
---
|
|
duration_ms: 0.891373
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal shows error if no video
|
|
ok 3 - openModal shows error if no video
|
|
---
|
|
duration_ms: 0.627776
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal opens modal with correct payload
|
|
ok 4 - openModal opens modal with correct payload
|
|
---
|
|
duration_ms: 0.44519
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - ShareNostrController
|
|
---
|
|
duration_ms: 6.319712
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.430209
|
|
|
|
→ Running tests/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent executes successfully
|
|
ok 1 - queueSignEvent executes successfully
|
|
---
|
|
duration_ms: 1.928536
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes sequentially for same signer
|
|
ok 2 - queueSignEvent executes sequentially for same signer
|
|
---
|
|
duration_ms: 102.252643
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes concurrently for different signers
|
|
ok 3 - queueSignEvent executes concurrently for different signers
|
|
---
|
|
duration_ms: 51.256724
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent times out
|
|
ok 4 - queueSignEvent times out
|
|
---
|
|
duration_ms: 51.91382
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent normalizes errors
|
|
ok 5 - queueSignEvent normalizes errors
|
|
---
|
|
duration_ms: 0.601187
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles signer disconnect
|
|
ok 6 - queueSignEvent handles signer disconnect
|
|
---
|
|
duration_ms: 0.594522
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles missing signer
|
|
ok 7 - queueSignEvent handles missing signer
|
|
---
|
|
duration_ms: 0.407575
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 362.857806
|
|
|
|
→ Running tests/state/appState.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: getters and setters work for simple values
|
|
ok 1 - getters and setters work for simple values
|
|
---
|
|
duration_ms: 1.554359
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppStateKey fires on change
|
|
ok 2 - subscribeToAppStateKey fires on change
|
|
---
|
|
duration_ms: 0.697684
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppState fires on any change
|
|
ok 3 - subscribeToAppState fires on any change
|
|
---
|
|
duration_ms: 0.432081
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState updates state and notifies
|
|
ok 4 - setModalState updates state and notifies
|
|
---
|
|
duration_ms: 0.637036
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState clears everything
|
|
ok 5 - resetAppState clears everything
|
|
---
|
|
duration_ms: 0.661049
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap only accepts Maps or null
|
|
ok 6 - setVideosMap only accepts Maps or null
|
|
---
|
|
duration_ms: 0.412537
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 5.959308
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.295857
|
|
|
|
→ Running tests/state/cache-saved-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: persistSavedProfiles preserves custom authType strings
|
|
ok 1 - persistSavedProfiles preserves custom authType strings
|
|
---
|
|
duration_ms: 2.085319
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage retains custom provider authType
|
|
ok 2 - loadSavedProfilesFromStorage retains custom provider authType
|
|
---
|
|
duration_ms: 0.594066
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
ok 3 - loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
---
|
|
duration_ms: 0.337786
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage trims stored authType values
|
|
ok 4 - loadSavedProfilesFromStorage trims stored authType values
|
|
---
|
|
duration_ms: 0.349011
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
ok 5 - loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
---
|
|
duration_ms: 0.239021
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.906445
|
|
|
|
→ Running tests/state/cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/state/cache.js
|
|
# Subtest: Saved Profiles Persistence
|
|
ok 1 - Saved Profiles Persistence
|
|
---
|
|
duration_ms: 2.248683
|
|
type: 'test'
|
|
...
|
|
# Subtest: Active Profile Pubkey
|
|
ok 2 - Active Profile Pubkey
|
|
---
|
|
duration_ms: 0.550106
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Caching
|
|
ok 3 - URL Health Caching
|
|
---
|
|
duration_ms: 0.609742
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Expiration
|
|
ok 4 - URL Health Expiration
|
|
---
|
|
duration_ms: 11.1397
|
|
type: 'test'
|
|
...
|
|
# Subtest: Moderation Settings
|
|
ok 5 - Moderation Settings
|
|
---
|
|
duration_ms: 1.269372
|
|
type: 'test'
|
|
...
|
|
# Subtest: Legacy Moderation Overrides Support
|
|
# Subtest: ignores legacy v1 overrides
|
|
ok 1 - ignores legacy v1 overrides
|
|
---
|
|
duration_ms: 0.574219
|
|
type: 'test'
|
|
...
|
|
# Subtest: loads v2 overrides
|
|
ok 2 - loads v2 overrides
|
|
---
|
|
duration_ms: 0.487501
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - Legacy Moderation Overrides Support
|
|
---
|
|
duration_ms: 1.960551
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - js/state/cache.js
|
|
---
|
|
duration_ms: 21.133698
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.218241
|
|
|
|
→ Running tests/state/profile-cache.test.mjs
|
|
[bitvid] [ProfileCache] Expired watchHistory for 1111111111111111111111111111111111111111111111111111111111111111
|
|
TAP version 13
|
|
# Subtest: ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
ok 1 - ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
---
|
|
duration_ms: 1.798108
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolves storage keys correctly
|
|
ok 2 - ProfileCache: resolves storage keys correctly
|
|
---
|
|
duration_ms: 0.597753
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: persists data to localStorage and memory
|
|
ok 3 - ProfileCache: persists data to localStorage and memory
|
|
---
|
|
duration_ms: 1.71623
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: loads from localStorage if memory miss
|
|
ok 4 - ProfileCache: loads from localStorage if memory miss
|
|
---
|
|
duration_ms: 0.329232
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: handles active profile switching
|
|
ok 5 - ProfileCache: handles active profile switching
|
|
---
|
|
duration_ms: 0.973836
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile normalizes and saves
|
|
ok 6 - ProfileCache: setProfile normalizes and saves
|
|
---
|
|
duration_ms: 1.038879
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: emits events on active profile change
|
|
ok 7 - ProfileCache: emits events on active profile change
|
|
---
|
|
duration_ms: 0.500957
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: respects TTL expiration
|
|
ok 8 - ProfileCache: respects TTL expiration
|
|
---
|
|
duration_ms: 1.196294
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile sanitizes XSS in media URLs
|
|
ok 9 - ProfileCache: setProfile sanitizes XSS in media URLs
|
|
---
|
|
duration_ms: 1.251501
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.69801
|
|
|
|
→ Running tests/state/profile-settings-store.test.mjs
|
|
TAP version 13
|
|
# Subtest: profile settings store clones values and tracks entries
|
|
ok 1 - profile settings store clones values and tracks entries
|
|
---
|
|
duration_ms: 2.468683
|
|
type: 'test'
|
|
...
|
|
# Subtest: profile settings store ignores falsy keys and survives clone failures
|
|
ok 2 - profile settings store ignores falsy keys and survives clone failures
|
|
---
|
|
duration_ms: 0.323903
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.756263
|
|
|
|
→ Running tests/storage-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: StorageService
|
|
# Subtest: init() creates database and object store
|
|
ok 1 - init() creates database and object store
|
|
---
|
|
duration_ms: 10.927496
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() generates and stores master key with NIP-44
|
|
ok 2 - unlock() generates and stores master key with NIP-44
|
|
---
|
|
duration_ms: 9.893867
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() restores existing master key
|
|
ok 3 - unlock() restores existing master key
|
|
---
|
|
duration_ms: 4.350995
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
ok 4 - unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
---
|
|
duration_ms: 3.115204
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes permission denied decrypt errors
|
|
ok 5 - unlock() normalizes permission denied decrypt errors
|
|
---
|
|
duration_ms: 4.071837
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes missing decryptor errors
|
|
ok 6 - unlock() normalizes missing decryptor errors
|
|
---
|
|
duration_ms: 4.516935
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes unknown decrypt errors
|
|
ok 7 - unlock() normalizes unknown decrypt errors
|
|
---
|
|
duration_ms: 2.714346
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: saveConnection() encrypts and stores connection
|
|
ok 8 - saveConnection() encrypts and stores connection
|
|
---
|
|
duration_ms: 4.167587
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: getConnection() decrypts and returns connection
|
|
ok 9 - getConnection() decrypts and returns connection
|
|
---
|
|
duration_ms: 3.954914
|
|
type: 'test'
|
|
...
|
|
# Subtest: getConnection() throws if locked
|
|
ok 10 - getConnection() throws if locked
|
|
---
|
|
duration_ms: 1.1524
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Deleted connection conn_1
|
|
# Subtest: deleteConnection() removes connection
|
|
ok 11 - deleteConnection() removes connection
|
|
---
|
|
duration_ms: 3.144443
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: setDefaultConnection() updates metadata
|
|
ok 12 - setDefaultConnection() updates metadata
|
|
---
|
|
duration_ms: 3.397021
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: saveConnection() with defaultForUploads=true clears other defaults
|
|
ok 13 - saveConnection() with defaultForUploads=true clears other defaults
|
|
---
|
|
duration_ms: 3.10944
|
|
type: 'test'
|
|
...
|
|
1..13
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 61.000822
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 1
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 69.205456
|
|
|
|
→ Running tests/subscriptions-manager.test.mjs
|
|
[bitvid] [nostr] Relay backoff applied. {
|
|
relay: 'wss://relay-b.example',
|
|
backoffMs: 1000,
|
|
failureCount: 1,
|
|
retryAt: 1770906503918,
|
|
reason: null
|
|
}
|
|
TAP version 13
|
|
# Subtest: loadSubscriptions aggregates relay results when one rejects
|
|
ok 1 - loadSubscriptions aggregates relay results when one rejects
|
|
---
|
|
duration_ms: 10.510488
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions queries the correct subscription list kind
|
|
ok 2 - loadSubscriptions queries the correct subscription list kind
|
|
---
|
|
duration_ms: 0.953261
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions falls back to nip44 when hinted
|
|
ok 3 - loadSubscriptions falls back to nip44 when hinted
|
|
---
|
|
duration_ms: 1.773905
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions handles nip44.v2 decryptors
|
|
ok 4 - loadSubscriptions handles nip44.v2 decryptors
|
|
---
|
|
duration_ms: 1.202641
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions prefers nip44 decryptors when both are available
|
|
ok 5 - loadSubscriptions prefers nip44 decryptors when both are available
|
|
---
|
|
duration_ms: 1.612483
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
ok 6 - loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
---
|
|
duration_ms: 1.229041
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions retries permission-required decrypts only when enabled
|
|
ok 7 - loadSubscriptions retries permission-required decrypts only when enabled
|
|
---
|
|
duration_ms: 1.316341
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
ok 8 - showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
---
|
|
duration_ms: 91.256825
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureLoaded memoizes concurrent loads
|
|
ok 9 - ensureLoaded memoizes concurrent loads
|
|
---
|
|
duration_ms: 8.772024
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
ok 10 - publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
---
|
|
duration_ms: 2.72447
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList prefers nip44 encryption when available
|
|
ok 11 - publishSubscriptionList prefers nip44 encryption when available
|
|
---
|
|
duration_ms: 0.960316
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList falls back to nip04 when nip44 fails
|
|
ok 12 - publishSubscriptionList falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.909682
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle shows empty state message
|
|
ok 13 - renderSameGridStyle shows empty state message
|
|
---
|
|
duration_ms: 13.628476
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle forwards moderation badge actions to the application
|
|
ok 14 - renderSameGridStyle forwards moderation badge actions to the application
|
|
---
|
|
duration_ms: 64.017255
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 6025.15185
|
|
|
|
→ Running tests/torrent/service-worker-fallback-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: returns generic message when error missing
|
|
ok 1 - returns generic message when error missing
|
|
---
|
|
duration_ms: 1.627411
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies HTTPS requirement errors
|
|
ok 2 - identifies HTTPS requirement errors
|
|
---
|
|
duration_ms: 0.230957
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies disabled service worker errors
|
|
ok 3 - identifies disabled service worker errors
|
|
---
|
|
duration_ms: 0.275576
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies Brave specific guidance
|
|
ok 4 - identifies Brave specific guidance
|
|
---
|
|
duration_ms: 0.27619
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies blocked script errors
|
|
ok 5 - identifies blocked script errors
|
|
---
|
|
duration_ms: 0.245287
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies controller claim timeout
|
|
ok 6 - identifies controller claim timeout
|
|
---
|
|
duration_ms: 0.284338
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.589266
|
|
|
|
→ Running tests/torrent/style-helpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/styleHelpers
|
|
# Subtest: returns null when no element is provided
|
|
ok 1 - returns null when no element is provided
|
|
---
|
|
duration_ms: 1.120453
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns the original element without mutations
|
|
ok 2 - returns the original element without mutations
|
|
---
|
|
duration_ms: 82.236399
|
|
type: 'test'
|
|
...
|
|
# Subtest: provides an empty, frozen fallback map
|
|
ok 3 - provides an empty, frozen fallback map
|
|
---
|
|
duration_ms: 1.469587
|
|
type: 'test'
|
|
...
|
|
# Subtest: no-ops when removing styles
|
|
ok 4 - no-ops when removing styles
|
|
---
|
|
duration_ms: 11.534083
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - torrent/ui/styleHelpers
|
|
---
|
|
duration_ms: 97.923864
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 112.525822
|
|
|
|
→ Running tests/torrent/toast-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/toastService
|
|
# Subtest: renders a toast with Tailwind token classes and removes it on dismiss
|
|
ok 1 - renders a toast with Tailwind token classes and removes it on dismiss
|
|
---
|
|
duration_ms: 352.916793
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - torrent/ui/toastService
|
|
---
|
|
duration_ms: 354.326926
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 1
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 363.515807
|
|
|
|
→ Running tests/ui/app-chrome-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppChromeController binds upload button when elements hydrate later
|
|
ok 1 - AppChromeController binds upload button when elements hydrate later
|
|
---
|
|
duration_ms: 89.054358
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 99.942919
|
|
|
|
→ Running tests/ui/components/debug_hashtag_strip_helper.test.mjs
|
|
Global ResizeObserver type: function
|
|
Helper window ResizeObserver: undefined
|
|
TAP version 13
|
|
# Subtest: Debug HashtagStripHelper fallback
|
|
ok 1 - Debug HashtagStripHelper fallback
|
|
---
|
|
duration_ms: 101.473294
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 117.599388
|
|
|
|
→ Running tests/ui/components/hashtagStripHelper.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper uses ResizeObserver when available
|
|
ok 1 - HashtagStripHelper uses ResizeObserver when available
|
|
---
|
|
duration_ms: 120.644859
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with RAF
|
|
ok 2 - HashtagStripHelper falls back to window resize with RAF
|
|
---
|
|
duration_ms: 27.659682
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
ok 3 - HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
---
|
|
duration_ms: 14.93673
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper handles teardown correctly
|
|
ok 4 - HashtagStripHelper handles teardown correctly
|
|
---
|
|
duration_ms: 10.039987
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 190.478611
|
|
|
|
→ Running tests/ui/components/videoMenuRenderers.test.mjs
|
|
TAP version 13
|
|
# Subtest: createVideoMoreMenuPanel - basic rendering
|
|
ok 1 - createVideoMoreMenuPanel - basic rendering
|
|
---
|
|
duration_ms: 120.408997
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - pointer info rendering
|
|
ok 2 - createVideoMoreMenuPanel - pointer info rendering
|
|
---
|
|
duration_ms: 15.949524
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - mirror logic
|
|
ok 3 - createVideoMoreMenuPanel - mirror logic
|
|
---
|
|
duration_ms: 13.68249
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - blacklist logic
|
|
ok 4 - createVideoMoreMenuPanel - blacklist logic
|
|
---
|
|
duration_ms: 14.097141
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - permission logic
|
|
ok 5 - createVideoShareMenuPanel - permission logic
|
|
---
|
|
duration_ms: 23.546183
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - magnet/cdn logic
|
|
ok 6 - createVideoShareMenuPanel - magnet/cdn logic
|
|
---
|
|
duration_ms: 11.661186
|
|
type: 'test'
|
|
...
|
|
# Subtest: createChannelProfileMenuPanel - basic actions
|
|
ok 7 - createChannelProfileMenuPanel - basic actions
|
|
---
|
|
duration_ms: 13.207447
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoSettingsMenuPanel - capabilities
|
|
ok 8 - createVideoSettingsMenuPanel - capabilities
|
|
---
|
|
duration_ms: 11.980779
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 242.080954
|
|
|
|
→ Running tests/ui/creatorProfileController.test.mjs
|
|
TAP version 13
|
|
# Subtest: CreatorProfileController
|
|
# Subtest: resolveCreatorProfileFromSources prioritizes cached profile
|
|
ok 1 - resolveCreatorProfileFromSources prioritizes cached profile
|
|
---
|
|
duration_ms: 1.333891
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCreatorProfileFromSources falls back to fetched profile
|
|
ok 2 - resolveCreatorProfileFromSources falls back to fetched profile
|
|
---
|
|
duration_ms: 0.291796
|
|
type: 'test'
|
|
...
|
|
# Subtest: decorateVideoCreatorIdentity modifies video object
|
|
ok 3 - decorateVideoCreatorIdentity modifies video object
|
|
---
|
|
duration_ms: 0.56208
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchModalCreatorProfile fetches profile and updates modal
|
|
ok 4 - fetchModalCreatorProfile fetches profile and updates modal
|
|
---
|
|
duration_ms: 1.087687
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - CreatorProfileController
|
|
---
|
|
duration_ms: 5.017977
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.934052
|
|
|
|
→ Running tests/ui/dm/zapHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: formatZapAmount
|
|
# Subtest: formats standard amounts correctly
|
|
ok 1 - formats standard amounts correctly
|
|
---
|
|
duration_ms: 24.713937
|
|
type: 'test'
|
|
...
|
|
# Subtest: formats compact amounts correctly
|
|
ok 2 - formats compact amounts correctly
|
|
---
|
|
duration_ms: 0.858016
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles zero and small numbers
|
|
ok 3 - handles zero and small numbers
|
|
---
|
|
duration_ms: 0.556088
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 4 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.438536
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles string number inputs
|
|
ok 5 - handles string number inputs
|
|
---
|
|
duration_ms: 0.275686
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - formatZapAmount
|
|
---
|
|
duration_ms: 28.58956
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aggregateZapTotals
|
|
# Subtest: aggregates totals correctly
|
|
ok 1 - aggregates totals correctly
|
|
---
|
|
duration_ms: 0.412301
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles empty input
|
|
ok 2 - handles empty input
|
|
---
|
|
duration_ms: 0.338684
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-array input
|
|
ok 3 - handles non-array input
|
|
---
|
|
duration_ms: 0.375798
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing or invalid amounts
|
|
ok 4 - handles missing or invalid amounts
|
|
---
|
|
duration_ms: 0.413278
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing IDs
|
|
ok 5 - handles missing IDs
|
|
---
|
|
duration_ms: 0.41415
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - aggregateZapTotals
|
|
---
|
|
duration_ms: 2.464209
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeZapReceipt
|
|
# Subtest: normalizes valid receipt
|
|
ok 1 - normalizes valid receipt
|
|
---
|
|
duration_ms: 0.37081
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes receipt with amount fallback
|
|
ok 2 - normalizes receipt with amount fallback
|
|
---
|
|
duration_ms: 0.142576
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes empty receipt
|
|
ok 3 - normalizes empty receipt
|
|
---
|
|
duration_ms: 0.105797
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes undefined receipt
|
|
ok 4 - normalizes undefined receipt
|
|
---
|
|
duration_ms: 0.092421
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes invalid amount
|
|
ok 5 - normalizes invalid amount
|
|
---
|
|
duration_ms: 0.095791
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - normalizeZapReceipt
|
|
---
|
|
duration_ms: 1.017707
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
# tests 15
|
|
# suites 3
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 55.406453
|
|
|
|
→ Running tests/ui/engagement-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: EngagementController
|
|
# Subtest: handleRepostAction - should show error if no event ID is available
|
|
ok 1 - handleRepostAction - should show error if no event ID is available
|
|
---
|
|
duration_ms: 4.07175
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should call repostEvent with correct parameters
|
|
ok 2 - handleRepostAction - should call repostEvent with correct parameters
|
|
---
|
|
duration_ms: 0.809737
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should handle failure from repostEvent
|
|
ok 3 - handleRepostAction - should handle failure from repostEvent
|
|
---
|
|
duration_ms: 0.608488
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should use currentVideoPointer when in modal context
|
|
ok 4 - handleRepostAction - should use currentVideoPointer when in modal context
|
|
---
|
|
duration_ms: 0.777825
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should show error if video has no URL
|
|
ok 5 - handleMirrorAction - should show error if video has no URL
|
|
---
|
|
duration_ms: 1.113294
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
ok 6 - handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
---
|
|
duration_ms: 0.807619
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should prevent mirroring private videos
|
|
ok 7 - handleMirrorAction - should prevent mirroring private videos
|
|
---
|
|
duration_ms: 0.542082
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show error if no event ID
|
|
ok 8 - handleEnsurePresenceAction - should show error if no event ID
|
|
---
|
|
duration_ms: 0.649469
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should handle throttled response
|
|
ok 9 - handleEnsurePresenceAction - should handle throttled response
|
|
---
|
|
duration_ms: 0.787085
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
ok 10 - handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
---
|
|
duration_ms: 0.485516
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
ok 1 - EngagementController
|
|
---
|
|
duration_ms: 15.490208
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 37.44781
|
|
|
|
→ Running tests/ui/hashtag-strip-helper-bounce.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper triggers scroll hint when content overflows
|
|
ok 1 - HashtagStripHelper triggers scroll hint when content overflows
|
|
---
|
|
duration_ms: 100.287152
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper does not trigger scroll hint when no overflow
|
|
ok 2 - HashtagStripHelper does not trigger scroll hint when no overflow
|
|
---
|
|
duration_ms: 13.564967
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 126.964148
|
|
|
|
→ Running tests/ui/popoverEngine.test.mjs
|
|
TAP version 13
|
|
# Subtest: opens a popover in the overlay root and positions the panel
|
|
ok 1 - opens a popover in the overlay root and positions the panel
|
|
---
|
|
duration_ms: 375.690368
|
|
type: 'test'
|
|
...
|
|
# Subtest: positions bottom-end panels flush with the trigger's right edge
|
|
ok 2 - positions bottom-end panels flush with the trigger's right edge
|
|
---
|
|
duration_ms: 63.82378
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes on outside pointer events and restores focus
|
|
ok 3 - closes on outside pointer events and restores focus
|
|
---
|
|
duration_ms: 37.743473
|
|
type: 'test'
|
|
...
|
|
# Subtest: supports roving focus, home/end navigation, and typeahead
|
|
ok 4 - supports roving focus, home/end navigation, and typeahead
|
|
---
|
|
duration_ms: 53.992191
|
|
type: 'test'
|
|
...
|
|
# Subtest: escape closes the popover and restores trigger focus
|
|
ok 5 - escape closes the popover and restores trigger focus
|
|
---
|
|
duration_ms: 34.537431
|
|
type: 'test'
|
|
...
|
|
# Subtest: close respects restoreFocus option for contextual menus
|
|
ok 6 - close respects restoreFocus option for contextual menus
|
|
---
|
|
duration_ms: 29.554685
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensures only one popover is open at a time
|
|
ok 7 - ensures only one popover is open at a time
|
|
---
|
|
duration_ms: 74.926195
|
|
type: 'test'
|
|
...
|
|
# Subtest: applies token-based sizing and arrow positioning
|
|
ok 8 - applies token-based sizing and arrow positioning
|
|
---
|
|
duration_ms: 41.66762
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 729.979252
|
|
|
|
→ Running tests/ui/profile-modal-moderation-settings.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation settings save updates service and disables control
|
|
ok 1 - moderation settings save updates service and disables control
|
|
---
|
|
duration_ms: 169.422893
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation reset restores defaults and clearing inputs uses defaults
|
|
ok 2 - moderation reset restores defaults and clearing inputs uses defaults
|
|
---
|
|
duration_ms: 37.980404
|
|
type: 'test'
|
|
...
|
|
# Subtest: guest fallback uses config moderation defaults
|
|
ok 3 - guest fallback uses config moderation defaults
|
|
---
|
|
duration_ms: 22.591851
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 248.274604
|
|
|
|
→ Running tests/ui/profileModalController-addProfile.test.mjs
|
|
Success: Profile added. Select it when you're ready to switch.
|
|
Success: That profile is already saved on this device.
|
|
TAP version 13
|
|
# Subtest: handleAddProfile adds a new profile correctly
|
|
ok 1 - handleAddProfile adds a new profile correctly
|
|
---
|
|
duration_ms: 168.646917
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile prevents duplicates
|
|
ok 2 - handleAddProfile prevents duplicates
|
|
---
|
|
duration_ms: 34.519017
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles missing login result
|
|
ok 3 - handleAddProfile handles missing login result
|
|
---
|
|
duration_ms: 29.091902
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles errors gracefully
|
|
ok 4 - handleAddProfile handles errors gracefully
|
|
---
|
|
duration_ms: 17.991786
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 265.37754
|
|
|
|
→ Running tests/ui/reactionController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ReactionController
|
|
# Subtest: should subscribe to reactions
|
|
ok 1 - should subscribe to reactions
|
|
---
|
|
duration_ms: 2.772008
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle reaction update from subscription
|
|
ok 2 - should handle reaction update from subscription
|
|
---
|
|
duration_ms: 0.848974
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply optimistic update on handleReaction
|
|
ok 3 - should apply optimistic update on handleReaction
|
|
---
|
|
duration_ms: 0.99869
|
|
type: 'test'
|
|
...
|
|
# Subtest: should rollback optimistic update on publish failure
|
|
ok 4 - should rollback optimistic update on publish failure
|
|
---
|
|
duration_ms: 0.72411
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not react if user not logged in
|
|
ok 5 - should not react if user not logged in
|
|
---
|
|
duration_ms: 0.769632
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - ReactionController
|
|
---
|
|
duration_ms: 8.065091
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.655864
|
|
|
|
→ Running tests/ui/similar-content-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: cached thumbnails reuse existing src without lazy-loading
|
|
ok 1 - cached thumbnails reuse existing src without lazy-loading
|
|
---
|
|
duration_ms: 295.143952
|
|
type: 'test'
|
|
...
|
|
# Subtest: uncached thumbnails use fallback, cache on load, and retain blur state
|
|
ok 2 - uncached thumbnails use fallback, cache on load, and retain blur state
|
|
---
|
|
duration_ms: 42.931267
|
|
type: 'test'
|
|
...
|
|
# Subtest: primary clicks trigger onPlay while modifiers and right clicks do not
|
|
ok 3 - primary clicks trigger onPlay while modifiers and right clicks do not
|
|
---
|
|
duration_ms: 22.396878
|
|
type: 'test'
|
|
...
|
|
# Subtest: author identity fields render supplied values and datasets
|
|
ok 4 - author identity fields render supplied values and datasets
|
|
---
|
|
duration_ms: 17.144446
|
|
type: 'test'
|
|
...
|
|
# Subtest: view counter wiring exposes pointer datasets
|
|
ok 5 - view counter wiring exposes pointer datasets
|
|
---
|
|
duration_ms: 19.523398
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 421.112376
|
|
|
|
→ Running tests/ui/similarContentController.test.mjs
|
|
TAP version 13
|
|
# Subtest: SimilarContentController
|
|
# Subtest: extractDTagValue
|
|
# Subtest: should return the 'd' tag value
|
|
ok 1 - should return the 'd' tag value
|
|
---
|
|
duration_ms: 1.734758
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string if no 'd' tag
|
|
ok 2 - should return empty string if no 'd' tag
|
|
---
|
|
duration_ms: 0.457118
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - extractDTagValue
|
|
---
|
|
duration_ms: 3.300515
|
|
type: 'suite'
|
|
...
|
|
# Subtest: computeCandidates
|
|
# Subtest: should return empty array if no active video
|
|
ok 1 - should return empty array if no active video
|
|
---
|
|
duration_ms: 2.030365
|
|
type: 'test'
|
|
...
|
|
# Subtest: should compute similar candidates based on tags
|
|
ok 2 - should compute similar candidates based on tags
|
|
---
|
|
duration_ms: 1.613575
|
|
type: 'test'
|
|
...
|
|
# Subtest: should exclude blocked authors
|
|
ok 3 - should exclude blocked authors
|
|
---
|
|
duration_ms: 0.928896
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prioritize higher shared tag count
|
|
ok 4 - should prioritize higher shared tag count
|
|
---
|
|
duration_ms: 0.794458
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - computeCandidates
|
|
---
|
|
duration_ms: 5.783596
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateModal
|
|
# Subtest: should clear similar content if no active video
|
|
ok 1 - should clear similar content if no active video
|
|
---
|
|
duration_ms: 0.476131
|
|
type: 'test'
|
|
...
|
|
# Subtest: should set similar content if matches found
|
|
ok 2 - should set similar content if matches found
|
|
---
|
|
duration_ms: 0.845478
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear similar content if no matches found
|
|
ok 3 - should clear similar content if no matches found
|
|
---
|
|
duration_ms: 0.765323
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - updateModal
|
|
---
|
|
duration_ms: 2.446267
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - SimilarContentController
|
|
---
|
|
duration_ms: 12.791493
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 4
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 35.051102
|
|
|
|
→ Running tests/ui/storageService.test.mjs
|
|
TAP version 13
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: StorageService
|
|
# Subtest: should unlock storage with a valid signer
|
|
ok 1 - should unlock storage with a valid signer
|
|
---
|
|
duration_ms: 15.414921
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection r2-test-1
|
|
# Subtest: should save and retrieve an R2 connection
|
|
ok 2 - should save and retrieve an R2 connection
|
|
---
|
|
duration_ms: 7.50469
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection s3-generic-1
|
|
# Subtest: should save and retrieve a Generic S3 connection with extra fields
|
|
ok 3 - should save and retrieve a Generic S3 connection with extra fields
|
|
---
|
|
duration_ms: 4.267718
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail to get connection if locked
|
|
ok 4 - should fail to get connection if locked
|
|
---
|
|
duration_ms: 1.291919
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 148.006767
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 156.056601
|
|
|
|
→ Running tests/ui/tag-pill-list.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderTagPillStrip builds buttons with labels and icons
|
|
ok 1 - renderTagPillStrip builds buttons with labels and icons
|
|
---
|
|
duration_ms: 105.019597
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip applies preference state styling
|
|
ok 2 - renderTagPillStrip applies preference state styling
|
|
---
|
|
duration_ms: 11.874184
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip wires the activation callback
|
|
ok 3 - renderTagPillStrip wires the activation callback
|
|
---
|
|
duration_ms: 11.818519
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 143.746281
|
|
|
|
→ Running tests/ui/tag-preference-menu.test.mjs
|
|
TAP version 13
|
|
# Subtest: createTagPreferenceMenu renders heading and actions
|
|
ok 1 - createTagPreferenceMenu renders heading and actions
|
|
---
|
|
duration_ms: 134.364448
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu disables actions based on membership and login
|
|
ok 2 - createTagPreferenceMenu disables actions based on membership and login
|
|
---
|
|
duration_ms: 21.876406
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu forwards actions to callback
|
|
ok 3 - createTagPreferenceMenu forwards actions to callback
|
|
---
|
|
duration_ms: 19.605524
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 196.376658
|
|
|
|
→ Running tests/ui/tagPreferenceMenuController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TagPreferenceMenuController
|
|
# Subtest: ensurePopover
|
|
# Subtest: should create a new popover entry if one does not exist
|
|
ok 1 - should create a new popover entry if one does not exist
|
|
---
|
|
duration_ms: 6.516374
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return existing entry if one exists
|
|
ok 2 - should return existing entry if one exists
|
|
---
|
|
duration_ms: 1.652974
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return null if trigger or tag is missing
|
|
ok 3 - should return null if trigger or tag is missing
|
|
---
|
|
duration_ms: 2.446432
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - ensurePopover
|
|
---
|
|
duration_ms: 13.519778
|
|
type: 'suite'
|
|
...
|
|
# Subtest: requestMenu
|
|
# Subtest: should ensure popover, close others, and open the requested one
|
|
ok 1 - should ensure popover, close others, and open the requested one
|
|
---
|
|
duration_ms: 3.086203
|
|
type: 'test'
|
|
...
|
|
# Subtest: should close the popover if it is already open
|
|
ok 2 - should close the popover if it is already open
|
|
---
|
|
duration_ms: 1.729812
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - requestMenu
|
|
---
|
|
duration_ms: 5.375839
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleMenuAction
|
|
# Subtest: should call service method and notify update
|
|
ok 1 - should call service method and notify update
|
|
---
|
|
duration_ms: 1.37935
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle error and call showError
|
|
ok 2 - should handle error and call showError
|
|
---
|
|
duration_ms: 1.928172
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - handleMenuAction
|
|
---
|
|
duration_ms: 4.089902
|
|
type: 'suite'
|
|
...
|
|
# Subtest: persistPreferencesFromMenu
|
|
# Subtest: should call service.publish
|
|
ok 1 - should call service.publish
|
|
---
|
|
duration_ms: 1.459272
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reuse in-flight promise
|
|
ok 2 - should reuse in-flight promise
|
|
---
|
|
duration_ms: 1.418582
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - persistPreferencesFromMenu
|
|
---
|
|
duration_ms: 3.450432
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - TagPreferenceMenuController
|
|
---
|
|
duration_ms: 29.293396
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 5
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 70.055601
|
|
|
|
→ Running tests/ui/torrentStatusController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TorrentStatusController throws if accessor is missing
|
|
ok 1 - TorrentStatusController throws if accessor is missing
|
|
---
|
|
duration_ms: 2.890366
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController updates video modal and calls onRemovePoster
|
|
ok 2 - TorrentStatusController updates video modal and calls onRemovePoster
|
|
---
|
|
duration_ms: 1.288985
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController handles missing modal gracefully
|
|
ok 3 - TorrentStatusController handles missing modal gracefully
|
|
---
|
|
duration_ms: 0.756748
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.676944
|
|
|
|
→ Running tests/ui/uploadModal-integration.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Integration
|
|
# Subtest: should detect default R2 connection and show summary when loaded and unlocked
|
|
ok 1 - should detect default R2 connection and show summary when loaded and unlocked
|
|
---
|
|
duration_ms: 75.882652
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle locked state and unlock flow
|
|
ok 2 - should handle locked state and unlock flow
|
|
---
|
|
duration_ms: 36.451764
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - UploadModal Integration
|
|
---
|
|
duration_ms: 12422.532088
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12434.694049
|
|
|
|
→ Running tests/ui/uploadModal-reset.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Reset Logic
|
|
# Subtest: should reset upload state and inputs when resetUploads is called
|
|
ok 1 - should reset upload state and inputs when resetUploads is called
|
|
---
|
|
duration_ms: 57.098207
|
|
type: 'test'
|
|
...
|
|
# Subtest: should guard against zombie callbacks when upload is reset during process
|
|
ok 2 - should guard against zombie callbacks when upload is reset during process
|
|
---
|
|
duration_ms: 22.805033
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call resetUploads when close is called
|
|
ok 3 - should call resetUploads when close is called
|
|
---
|
|
duration_ms: 17.117602
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - UploadModal Reset Logic
|
|
---
|
|
duration_ms: 12304.303289
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 1
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12322.205803
|
|
|
|
→ Running tests/ui/url-health-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: UrlHealthController
|
|
# Subtest: probeUrl returns ok for valid URL
|
|
ok 1 - probeUrl returns ok for valid URL
|
|
---
|
|
duration_ms: 95.107449
|
|
type: 'test'
|
|
...
|
|
# Subtest: probeUrl returns error for 404
|
|
ok 2 - probeUrl returns error for 404
|
|
---
|
|
duration_ms: 22.984788
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleUrlHealthBadge updates badge
|
|
ok 3 - handleUrlHealthBadge updates badge
|
|
---
|
|
duration_ms: 75.705608
|
|
type: 'test'
|
|
...
|
|
# Subtest: getUrlHealthPlaceholderMarkup returns string
|
|
ok 4 - getUrlHealthPlaceholderMarkup returns string
|
|
---
|
|
duration_ms: 9.496448
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - UrlHealthController
|
|
---
|
|
duration_ms: 205.178435
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 213.710608
|
|
|
|
→ Running tests/ui/video-list-view-popular-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView renders sorted popular tag pills
|
|
ok 1 - VideoListView renders sorted popular tag pills
|
|
---
|
|
duration_ms: 149.881842
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView applies tag preference variants to popular tags
|
|
ok 2 - VideoListView applies tag preference variants to popular tags
|
|
---
|
|
duration_ms: 29.281262
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView hides popular tags when no tags are available
|
|
ok 3 - VideoListView hides popular tags when no tags are available
|
|
---
|
|
duration_ms: 20.091849
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView setModerationBlockHandler stores callable
|
|
ok 4 - VideoListView setModerationBlockHandler stores callable
|
|
---
|
|
duration_ms: 8.706792
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 222.344077
|
|
|
|
→ Running tests/ui/video-list-view-sorting.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView sorts cards by original posted timestamp
|
|
ok 1 - VideoListView sorts cards by original posted timestamp
|
|
---
|
|
duration_ms: 137.105811
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 152.393258
|
|
|
|
→ Running tests/unit/app_guard_logic.test.mjs
|
|
TAP version 13
|
|
# Subtest: Application.resetTorrentStats logic
|
|
# Subtest: does not throw when videoModal is null
|
|
ok 1 - does not throw when videoModal is null
|
|
---
|
|
duration_ms: 0.913218
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal is undefined
|
|
ok 2 - does not throw when videoModal is undefined
|
|
---
|
|
duration_ms: 0.247784
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal lacks resetStats
|
|
ok 3 - does not throw when videoModal lacks resetStats
|
|
---
|
|
duration_ms: 0.243498
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls resetStats when available
|
|
ok 4 - calls resetStats when available
|
|
---
|
|
duration_ms: 0.304596
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Application.resetTorrentStats logic
|
|
---
|
|
duration_ms: 4.684832
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.681242
|
|
|
|
→ Running tests/unit/client-count-resilience.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient resilience to COUNT timeouts
|
|
ok 1 - NostrClient resilience to COUNT timeouts
|
|
---
|
|
duration_ms: 3408.67294
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3416.315815
|
|
|
|
→ Running tests/unit/comment-avatar.test.mjs
|
|
TAP version 13
|
|
# Subtest: normalizeCommentAvatarKey handles inputs correctly
|
|
ok 1 - normalizeCommentAvatarKey handles inputs correctly
|
|
---
|
|
duration_ms: 1.214512
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCommentAvatarAsset resolves avatars correctly
|
|
ok 2 - resolveCommentAvatarAsset resolves avatars correctly
|
|
---
|
|
duration_ms: 2.520082
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerCommentAvatarFailure registers failures correctly
|
|
ok 3 - registerCommentAvatarFailure registers failures correctly
|
|
---
|
|
duration_ms: 0.439998
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.459949
|
|
|
|
→ Running tests/unit/editModalController.test.mjs
|
|
TAP version 13
|
|
# Subtest: EditModalController
|
|
# Subtest: open()
|
|
# Subtest: should resolve target and open modal if authorized
|
|
ok 1 - should resolve target and open modal if authorized
|
|
---
|
|
duration_ms: 2.442233
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.805767
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if user does not own video
|
|
ok 3 - should show error if user does not own video
|
|
---
|
|
duration_ms: 0.477962
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle modal load errors
|
|
ok 4 - should handle modal load errors
|
|
---
|
|
duration_ms: 0.907725
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - open()
|
|
---
|
|
duration_ms: 5.812529
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleSubmit()
|
|
# Subtest: should handle successful submission
|
|
ok 1 - should handle successful submission
|
|
---
|
|
duration_ms: 1.010228
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.428585
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle submission errors
|
|
ok 3 - should handle submission errors
|
|
---
|
|
duration_ms: 1.324742
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - handleSubmit()
|
|
---
|
|
duration_ms: 3.419643
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - EditModalController
|
|
---
|
|
duration_ms: 10.028308
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 3
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.716451
|
|
|
|
→ Running tests/unit/embed_player_modal.test.mjs
|
|
TAP version 13
|
|
# Subtest: EmbedPlayerModal interface
|
|
# Subtest: has expected methods
|
|
ok 1 - has expected methods
|
|
---
|
|
duration_ms: 2.345394
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetStats is no-op and does not throw
|
|
ok 2 - resetStats is no-op and does not throw
|
|
---
|
|
duration_ms: 0.32439
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - EmbedPlayerModal interface
|
|
---
|
|
duration_ms: 4.217943
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.260723
|
|
|
|
→ Running tests/unit/embed-accent.test.mjs
|
|
TAP version 13
|
|
# Subtest: embed accent color configuration
|
|
ok 1 - embed accent color configuration
|
|
---
|
|
duration_ms: 1.259727
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.376568
|
|
|
|
→ Running tests/unit/hashChangeHandler.test.mjs
|
|
TAP version 13
|
|
# Subtest: createHashChangeHandler
|
|
# Subtest: loads default view if hash is empty
|
|
ok 1 - loads default view if hash is empty
|
|
---
|
|
duration_ms: 1.195884
|
|
type: 'test'
|
|
...
|
|
# Subtest: redirects legacy view
|
|
ok 2 - redirects legacy view
|
|
---
|
|
duration_ms: 0.257052
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips redundant reload
|
|
ok 3 - skips redundant reload
|
|
---
|
|
duration_ms: 0.256351
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - createHashChangeHandler
|
|
---
|
|
duration_ms: 3.388356
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.025372
|
|
|
|
→ Running tests/unit/notificationController.test.mjs
|
|
TAP version 13
|
|
# Subtest: NotificationController
|
|
# Subtest: should instantiate correctly
|
|
ok 1 - should instantiate correctly
|
|
---
|
|
duration_ms: 2.380214
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should update text content and show container
|
|
ok 2 - showError should update text content and show container
|
|
---
|
|
duration_ms: 0.993885
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should hide container when msg is empty
|
|
ok 3 - showError should hide container when msg is empty
|
|
---
|
|
duration_ms: 1.062514
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateNotificationPortalVisibility should toggle active class on portal
|
|
ok 4 - updateNotificationPortalVisibility should toggle active class on portal
|
|
---
|
|
duration_ms: 0.933941
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSuccess should update text content and show container
|
|
ok 5 - showSuccess should update text content and show container
|
|
---
|
|
duration_ms: 0.698496
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should update text content and show container
|
|
ok 6 - showStatus should update text content and show container
|
|
---
|
|
duration_ms: 0.781852
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should handle spinner option
|
|
ok 7 - showStatus should handle spinner option
|
|
---
|
|
duration_ms: 0.566227
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - NotificationController
|
|
---
|
|
duration_ms: 9.17373
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.393867
|
|
|
|
→ Running tests/unit/searchFilters.test.mjs
|
|
TAP version 13
|
|
# Subtest: parseFilterQuery collects filters and text tokens
|
|
ok 1 - parseFilterQuery collects filters and text tokens
|
|
---
|
|
duration_ms: 2.957887
|
|
type: 'test'
|
|
...
|
|
# Subtest: serializeFiltersToQuery emits filter tokens in order
|
|
ok 2 - serializeFiltersToQuery emits filter tokens in order
|
|
---
|
|
duration_ms: 0.356323
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
ok 3 - video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
---
|
|
duration_ms: 0.595514
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher blocks nsfw when disallowed and requires url
|
|
ok 4 - video search filter matcher blocks nsfw when disallowed and requires url
|
|
---
|
|
duration_ms: 0.224448
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.753524
|
|
|
|
→ Running tests/unit/security-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: Security configuration: Development mode should be disabled in production
|
|
ok 1 - Security configuration: Development mode should be disabled in production
|
|
---
|
|
duration_ms: 1.192536
|
|
type: 'test'
|
|
...
|
|
# Subtest: Security configuration: Verbose diagnostics should be disabled in production
|
|
ok 2 - Security configuration: Verbose diagnostics should be disabled in production
|
|
---
|
|
duration_ms: 1.503445
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.449331
|
|
|
|
→ Running tests/unit/services/moderationDecorator.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationDecorator
|
|
# Subtest: deriveModerationReportType
|
|
# Subtest: should return empty string for null summary
|
|
ok 1 - should return empty string for null summary
|
|
---
|
|
duration_ms: 1.928743
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty types
|
|
ok 2 - should return empty string for empty types
|
|
---
|
|
duration_ms: 0.237247
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the type with highest trusted count
|
|
ok 3 - should return the type with highest trusted count
|
|
---
|
|
duration_ms: 0.292478
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - deriveModerationReportType
|
|
---
|
|
duration_ms: 4.366163
|
|
type: 'suite'
|
|
...
|
|
# Subtest: deriveModerationTrustedCount
|
|
# Subtest: should return trusted count for specific type
|
|
ok 1 - should return trusted count for specific type
|
|
---
|
|
duration_ms: 1.017368
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to totalTrusted if type not found
|
|
ok 2 - should fall back to totalTrusted if type not found
|
|
---
|
|
duration_ms: 0.285936
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - deriveModerationTrustedCount
|
|
---
|
|
duration_ms: 1.792
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getReporterDisplayName
|
|
# Subtest: should return name from cache if available
|
|
ok 1 - should return name from cache if available
|
|
---
|
|
duration_ms: 0.726095
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return short formatted string if not in cache
|
|
ok 2 - should return short formatted string if not in cache
|
|
---
|
|
duration_ms: 1.36669
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - getReporterDisplayName
|
|
---
|
|
duration_ms: 2.971303
|
|
type: 'suite'
|
|
...
|
|
# Subtest: decorateVideo
|
|
# Subtest: should return the video object if input is invalid
|
|
ok 1 - should return the video object if input is invalid
|
|
---
|
|
duration_ms: 1.00619
|
|
type: 'test'
|
|
...
|
|
# Subtest: should decorate video with basic moderation
|
|
ok 2 - should decorate video with basic moderation
|
|
---
|
|
duration_ms: 1.142418
|
|
type: 'test'
|
|
...
|
|
# Subtest: should flag video as hidden if trusted mute count exceeds threshold
|
|
ok 3 - should flag video as hidden if trusted mute count exceeds threshold
|
|
---
|
|
duration_ms: 0.827982
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - decorateVideo
|
|
---
|
|
duration_ms: 3.354853
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateSettings
|
|
# Subtest: should update moderation settings and affect decoration
|
|
ok 1 - should update moderation settings and affect decoration
|
|
---
|
|
duration_ms: 0.815277
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - updateSettings
|
|
---
|
|
duration_ms: 0.94925
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - ModerationDecorator
|
|
---
|
|
duration_ms: 15.754481
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 6
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 55.03719
|
|
|
|
→ Running tests/unit/services/r2Service.storage-config.test.mjs
|
|
TAP version 13
|
|
[bitvid] [R2] Verifying access for Bucket: 'r2-meta-bucket' in Account: 'acc…23'
|
|
# Subtest: R2Service bucket selection
|
|
# Subtest: uses meta.bucket for ensureBucketExists and multipartUpload
|
|
ok 1 - uses meta.bucket for ensureBucketExists and multipartUpload
|
|
---
|
|
duration_ms: 28.489666
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses configured meta.bucket when verifying public access
|
|
ok 2 - uses configured meta.bucket when verifying public access
|
|
---
|
|
duration_ms: 1.949735
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - R2Service bucket selection
|
|
---
|
|
duration_ms: 31.869772
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 42.071976
|
|
|
|
→ Running tests/utils/cardSourceVisibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: cardSourceVisibility
|
|
# Subtest: updateVideoCardSourceVisibility
|
|
# Subtest: should handle null or undefined input gracefully
|
|
ok 1 - should handle null or undefined input gracefully
|
|
---
|
|
duration_ms: 4.845937
|
|
type: 'test'
|
|
...
|
|
# Subtest: should resolve card from object with .card property
|
|
ok 2 - should resolve card from object with .card property
|
|
---
|
|
duration_ms: 2.433523
|
|
type: 'test'
|
|
...
|
|
# Subtest: should always show card if owner is viewer
|
|
ok 3 - should always show card if owner is viewer
|
|
---
|
|
duration_ms: 1.448184
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is healthy
|
|
ok 4 - should show card if at least one source is healthy
|
|
---
|
|
duration_ms: 1.473907
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is checking/pending
|
|
ok 5 - should show card if at least one source is checking/pending
|
|
---
|
|
duration_ms: 1.614933
|
|
type: 'test'
|
|
...
|
|
# Subtest: should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
ok 6 - should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
---
|
|
duration_ms: 1.012002
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recover from hidden state when source becomes healthy
|
|
ok 7 - should recover from hidden state when source becomes healthy
|
|
---
|
|
duration_ms: 0.988959
|
|
type: 'test'
|
|
...
|
|
# Subtest: should check closest .card if element is not .card itself
|
|
ok 8 - should check closest .card if element is not .card itself
|
|
---
|
|
duration_ms: 7.720089
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - updateVideoCardSourceVisibility
|
|
---
|
|
duration_ms: 22.888078
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - cardSourceVisibility
|
|
---
|
|
duration_ms: 23.658684
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 41.175964
|
|
|
|
→ Running tests/utils/domUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: domUtils
|
|
# Subtest: escapeHTML
|
|
# Subtest: should return empty string for null or undefined
|
|
ok 1 - should return empty string for null or undefined
|
|
---
|
|
duration_ms: 1.176046
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the string as is if no special characters are present
|
|
ok 2 - should return the string as is if no special characters are present
|
|
---
|
|
duration_ms: 0.243846
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape special characters
|
|
ok 3 - should escape special characters
|
|
---
|
|
duration_ms: 0.293499
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape multiple occurrences of special characters
|
|
ok 4 - should escape multiple occurrences of special characters
|
|
---
|
|
duration_ms: 0.287675
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle mixed content correctly
|
|
ok 5 - should handle mixed content correctly
|
|
---
|
|
duration_ms: 0.258509
|
|
type: 'test'
|
|
...
|
|
# Subtest: should convert non-string inputs to string and escape
|
|
ok 6 - should convert non-string inputs to string and escape
|
|
---
|
|
duration_ms: 0.163395
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - escapeHTML
|
|
---
|
|
duration_ms: 3.627931
|
|
type: 'suite'
|
|
...
|
|
# Subtest: removeTrackingScripts
|
|
# Subtest: should do nothing if root is null or undefined
|
|
ok 1 - should do nothing if root is null or undefined
|
|
---
|
|
duration_ms: 0.387632
|
|
type: 'test'
|
|
...
|
|
# Subtest: should do nothing if root has no querySelectorAll
|
|
ok 2 - should do nothing if root has no querySelectorAll
|
|
---
|
|
duration_ms: 0.501238
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts matching the tracking pattern
|
|
ok 3 - should remove scripts matching the tracking pattern
|
|
---
|
|
duration_ms: 21.30392
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not remove inline scripts (no src)
|
|
ok 4 - should not remove inline scripts (no src)
|
|
---
|
|
duration_ms: 2.530689
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src ends with tracking.js
|
|
ok 5 - should remove scripts where src ends with tracking.js
|
|
---
|
|
duration_ms: 1.124594
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src contains /tracking.js
|
|
ok 6 - should remove scripts where src contains /tracking.js
|
|
---
|
|
duration_ms: 0.897975
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - removeTrackingScripts
|
|
---
|
|
duration_ms: 27.423901
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - domUtils
|
|
---
|
|
duration_ms: 31.915556
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 51.835761
|
|
|
|
→ Running tests/utils/hex.test.mjs
|
|
TAP version 13
|
|
# Subtest: hex utils
|
|
# Subtest: normalizeHexString
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 1.001885
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty or whitespace-only strings
|
|
ok 2 - should return empty string for empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.279037
|
|
type: 'test'
|
|
...
|
|
# Subtest: should trim and lowercase valid hex strings
|
|
ok 3 - should trim and lowercase valid hex strings
|
|
---
|
|
duration_ms: 0.169025
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - normalizeHexString
|
|
---
|
|
duration_ms: 2.465217
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aliases
|
|
# Subtest: should export normalizeHexId as an alias
|
|
ok 1 - should export normalizeHexId as an alias
|
|
---
|
|
duration_ms: 0.211878
|
|
type: 'test'
|
|
...
|
|
# Subtest: should export normalizeHexPubkey as an alias
|
|
ok 2 - should export normalizeHexPubkey as an alias
|
|
---
|
|
duration_ms: 0.130042
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - aliases
|
|
---
|
|
duration_ms: 0.62454
|
|
type: 'suite'
|
|
...
|
|
# Subtest: HEX64_REGEX
|
|
# Subtest: should match valid 64-character hex strings
|
|
ok 1 - should match valid 64-character hex strings
|
|
---
|
|
duration_ms: 0.455597
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with incorrect length
|
|
ok 2 - should not match strings with incorrect length
|
|
---
|
|
duration_ms: 0.520441
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with non-hex characters
|
|
ok 3 - should not match strings with non-hex characters
|
|
---
|
|
duration_ms: 0.172785
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match empty strings
|
|
ok 4 - should not match empty strings
|
|
---
|
|
duration_ms: 0.227237
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - HEX64_REGEX
|
|
---
|
|
duration_ms: 2.044492
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeHexHash
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.291591
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for invalid hex
|
|
ok 2 - should return empty string for invalid hex
|
|
---
|
|
duration_ms: 0.119934
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return normalized hex for valid inputs
|
|
ok 3 - should return normalized hex for valid inputs
|
|
---
|
|
duration_ms: 0.109348
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - normalizeHexHash
|
|
---
|
|
duration_ms: 0.744861
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - hex utils
|
|
---
|
|
duration_ms: 6.974515
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 5
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.606296
|
|
|
|
→ Running tests/utils/linkPreviewSettings.test.mjs
|
|
TAP version 13
|
|
# Subtest: linkPreviewSettings
|
|
# Subtest: getLinkPreviewSettings
|
|
# Subtest: returns defaults when storage is empty
|
|
ok 1 - returns defaults when storage is empty
|
|
---
|
|
duration_ms: 2.690023
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns stored settings
|
|
ok 2 - returns stored settings
|
|
---
|
|
duration_ms: 1.069651
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns defaults when storage is invalid
|
|
ok 3 - returns defaults when storage is invalid
|
|
---
|
|
duration_ms: 0.959108
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizes settings from storage
|
|
ok 4 - sanitizes settings from storage
|
|
---
|
|
duration_ms: 0.782823
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getLinkPreviewSettings
|
|
---
|
|
duration_ms: 6.728736
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setLinkPreviewAutoFetch
|
|
# Subtest: updates settings and persists to storage
|
|
ok 1 - updates settings and persists to storage
|
|
---
|
|
duration_ms: 1.180262
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 2 - emits an event on change
|
|
---
|
|
duration_ms: 1.283868
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setLinkPreviewAutoFetch
|
|
---
|
|
duration_ms: 2.851687
|
|
type: 'suite'
|
|
...
|
|
# Subtest: allowLinkPreviewDomain
|
|
# Subtest: adds a domain and persists to storage
|
|
ok 1 - adds a domain and persists to storage
|
|
---
|
|
duration_ms: 0.646073
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles duplicates
|
|
ok 2 - handles duplicates
|
|
---
|
|
duration_ms: 0.657986
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes domains
|
|
ok 3 - normalizes domains
|
|
---
|
|
duration_ms: 0.645436
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 4 - emits an event on change
|
|
---
|
|
duration_ms: 0.675874
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects silent option
|
|
ok 5 - respects silent option
|
|
---
|
|
duration_ms: 0.41525
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - allowLinkPreviewDomain
|
|
---
|
|
duration_ms: 3.60879
|
|
type: 'suite'
|
|
...
|
|
# Subtest: isLinkPreviewDomainAllowed
|
|
# Subtest: returns true for allowed domains
|
|
ok 1 - returns true for allowed domains
|
|
---
|
|
duration_ms: 0.61779
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for disallowed domains
|
|
ok 2 - returns false for disallowed domains
|
|
---
|
|
duration_ms: 0.26988
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles normalization
|
|
ok 3 - handles normalization
|
|
---
|
|
duration_ms: 0.699033
|
|
type: 'test'
|
|
...
|
|
# Subtest: accepts settings object as second argument
|
|
ok 4 - accepts settings object as second argument
|
|
---
|
|
duration_ms: 0.305869
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 4 - isLinkPreviewDomainAllowed
|
|
---
|
|
duration_ms: 2.123713
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeToLinkPreviewSettings
|
|
# Subtest: calls callback on event emission
|
|
ok 1 - calls callback on event emission
|
|
---
|
|
duration_ms: 0.706709
|
|
type: 'test'
|
|
...
|
|
# Subtest: unsubscribes correctly
|
|
ok 2 - unsubscribes correctly
|
|
---
|
|
duration_ms: 0.730297
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - subscribeToLinkPreviewSettings
|
|
---
|
|
duration_ms: 1.578151
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - linkPreviewSettings
|
|
---
|
|
duration_ms: 18.097674
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 6
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 51.017418
|
|
|
|
→ Running tests/utils/lruCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: LRUCache
|
|
# Subtest: should initialize with default options
|
|
ok 1 - should initialize with default options
|
|
---
|
|
duration_ms: 1.431778
|
|
type: 'test'
|
|
...
|
|
# Subtest: should store and retrieve values
|
|
ok 2 - should store and retrieve values
|
|
---
|
|
duration_ms: 0.498771
|
|
type: 'test'
|
|
...
|
|
# Subtest: should evict oldest item when limit is reached
|
|
ok 3 - should evict oldest item when limit is reached
|
|
---
|
|
duration_ms: 0.261428
|
|
type: 'test'
|
|
...
|
|
# Subtest: should refresh recency on access
|
|
ok 4 - should refresh recency on access
|
|
---
|
|
duration_ms: 0.462816
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update value and refresh recency on set
|
|
ok 5 - should update value and refresh recency on set
|
|
---
|
|
duration_ms: 0.5667
|
|
type: 'test'
|
|
...
|
|
# Subtest: should track stats
|
|
ok 6 - should track stats
|
|
---
|
|
duration_ms: 0.400873
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 7 - should clear cache
|
|
---
|
|
duration_ms: 0.21508
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - LRUCache
|
|
---
|
|
duration_ms: 5.528895
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.192729
|
|
|
|
→ Running tests/utils/profileMedia.test.mjs
|
|
TAP version 13
|
|
# Subtest: sanitizeProfileMediaUrl handles non-string inputs
|
|
ok 1 - sanitizeProfileMediaUrl handles non-string inputs
|
|
---
|
|
duration_ms: 1.483333
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
ok 2 - sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.264137
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
ok 3 - sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
---
|
|
duration_ms: 0.814689
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows data:image/ URLs
|
|
ok 4 - sanitizeProfileMediaUrl allows data:image/ URLs
|
|
---
|
|
duration_ms: 0.173116
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows blob: URLs
|
|
ok 5 - sanitizeProfileMediaUrl allows blob: URLs
|
|
---
|
|
duration_ms: 0.251107
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects specific placeholder images
|
|
ok 6 - sanitizeProfileMediaUrl rejects specific placeholder images
|
|
---
|
|
duration_ms: 0.18986
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
ok 7 - sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
---
|
|
duration_ms: 0.445818
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
ok 8 - sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
---
|
|
duration_ms: 0.16357
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows relative paths
|
|
ok 9 - sanitizeProfileMediaUrl allows relative paths
|
|
---
|
|
duration_ms: 0.537753
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
ok 10 - sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
---
|
|
duration_ms: 0.983958
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
ok 11 - sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
---
|
|
duration_ms: 0.232833
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects unsupported patterns
|
|
ok 12 - sanitizeProfileMediaUrl rejects unsupported patterns
|
|
---
|
|
duration_ms: 0.149785
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.153494
|
|
|
|
→ Running tests/utils/video-deduper.test.mjs
|
|
TAP version 13
|
|
# Subtest: dedupeToNewestByRoot replaces entries with missing timestamps
|
|
ok 1 - dedupeToNewestByRoot replaces entries with missing timestamps
|
|
---
|
|
duration_ms: 1.179099
|
|
type: 'test'
|
|
...
|
|
# Subtest: dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
ok 2 - dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
---
|
|
duration_ms: 0.225925
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.470847
|
|
|
|
→ Running tests/utils/video-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectVideoTags dedupes across metadata sources and respects casing
|
|
ok 1 - collectVideoTags dedupes across metadata sources and respects casing
|
|
---
|
|
duration_ms: 15.173895
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
ok 2 - collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
---
|
|
duration_ms: 1.387907
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags handles malformed inputs safely
|
|
ok 3 - collectVideoTags handles malformed inputs safely
|
|
---
|
|
duration_ms: 0.254878
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.945324
|
|
|
|
→ Running tests/utils/videoPointer.test.mjs
|
|
TAP version 13
|
|
# Subtest: resolveVideoPointer returns address pointer with dTag
|
|
ok 1 - resolveVideoPointer returns address pointer with dTag
|
|
---
|
|
duration_ms: 2.355459
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns address pointer with videoRootId
|
|
ok 2 - resolveVideoPointer returns address pointer with videoRootId
|
|
---
|
|
duration_ms: 0.291574
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns event pointer with fallbackEventId
|
|
ok 3 - resolveVideoPointer returns event pointer with fallbackEventId
|
|
---
|
|
duration_ms: 0.247302
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over videoRootId
|
|
ok 4 - resolveVideoPointer prioritizes dTag over videoRootId
|
|
---
|
|
duration_ms: 0.207281
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
ok 5 - resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
---
|
|
duration_ms: 0.195365
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
ok 6 - resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
---
|
|
duration_ms: 0.179264
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer includes relay in pointer
|
|
ok 7 - resolveVideoPointer includes relay in pointer
|
|
---
|
|
duration_ms: 0.311409
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer normalizes inputs
|
|
ok 8 - resolveVideoPointer normalizes inputs
|
|
---
|
|
duration_ms: 0.17257
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer uses default kind when kind is missing or invalid
|
|
ok 9 - resolveVideoPointer uses default kind when kind is missing or invalid
|
|
---
|
|
duration_ms: 0.626708
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns null for invalid inputs
|
|
ok 10 - resolveVideoPointer returns null for invalid inputs
|
|
---
|
|
duration_ms: 0.534776
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.580291
|
|
|
|
→ Running tests/utils/videoTimestamps.test.mjs
|
|
TAP version 13
|
|
# Subtest: getVideoRootIdentifier
|
|
# Subtest: returns empty string for invalid inputs
|
|
ok 1 - returns empty string for invalid inputs
|
|
---
|
|
duration_ms: 2.12166
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns videoRootId when present
|
|
ok 2 - returns videoRootId when present
|
|
---
|
|
duration_ms: 0.241942
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is missing
|
|
ok 3 - returns id when videoRootId is missing
|
|
---
|
|
duration_ms: 0.266618
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is not a string
|
|
ok 4 - returns id when videoRootId is not a string
|
|
---
|
|
duration_ms: 0.161445
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getVideoRootIdentifier
|
|
---
|
|
duration_ms: 4.404309
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyRootTimestampToVideosMap
|
|
# Subtest: returns early if videosMap is not a Map
|
|
ok 1 - returns early if videosMap is not a Map
|
|
---
|
|
duration_ms: 0.263375
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for matching video ID
|
|
ok 2 - updates rootCreatedAt for matching video ID
|
|
---
|
|
duration_ms: 0.235132
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for other videos with same rootId
|
|
ok 3 - updates rootCreatedAt for other videos with same rootId
|
|
---
|
|
duration_ms: 0.329621
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips invalid stored objects in map
|
|
ok 4 - skips invalid stored objects in map
|
|
---
|
|
duration_ms: 0.382459
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyRootTimestampToVideosMap
|
|
---
|
|
duration_ms: 2.608282
|
|
type: 'test'
|
|
...
|
|
# Subtest: syncActiveVideoRootTimestamp
|
|
# Subtest: returns false for invalid timestamp
|
|
ok 1 - returns false for invalid timestamp
|
|
---
|
|
duration_ms: 0.293491
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for invalid activeVideo
|
|
ok 2 - returns false for invalid activeVideo
|
|
---
|
|
duration_ms: 0.13688
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if activeVideo has no root identifier
|
|
ok 3 - returns false if activeVideo has no root identifier
|
|
---
|
|
duration_ms: 0.1149
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if rootId mismatch
|
|
ok 4 - returns false if rootId mismatch
|
|
---
|
|
duration_ms: 0.206599
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if timestamp already matches
|
|
ok 5 - returns false if timestamp already matches
|
|
---
|
|
duration_ms: 0.141353
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates activeVideo and displayTags
|
|
ok 6 - updates activeVideo and displayTags
|
|
---
|
|
duration_ms: 0.440605
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls videoModal.updateMetadata if provided
|
|
ok 7 - calls videoModal.updateMetadata if provided
|
|
---
|
|
duration_ms: 0.303686
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 3 - syncActiveVideoRootTimestamp
|
|
---
|
|
duration_ms: 2.507735
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.345589
|
|
|
|
→ Running tests/validate-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: validateInstanceConfig succeeds with valid configuration
|
|
ok 1 - validateInstanceConfig succeeds with valid configuration
|
|
---
|
|
duration_ms: 1.952396
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when platform fee is positive without a platform override
|
|
ok 2 - validateInstanceConfig throws when platform fee is positive without a platform override
|
|
---
|
|
duration_ms: 0.943679
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
ok 3 - validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
---
|
|
duration_ms: 0.236691
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
ok 4 - validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
---
|
|
duration_ms: 0.203048
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
ok 5 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
---
|
|
duration_ms: 0.277814
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
ok 6 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
---
|
|
duration_ms: 0.216864
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
ok 7 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
---
|
|
duration_ms: 0.205806
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
ok 8 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
---
|
|
duration_ms: 0.290853
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
ok 9 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
---
|
|
duration_ms: 0.509025
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL is invalid
|
|
ok 10 - validateInstanceConfig throws when optional URL is invalid
|
|
---
|
|
duration_ms: 0.782077
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL has invalid protocol
|
|
ok 11 - validateInstanceConfig throws when optional URL has invalid protocol
|
|
---
|
|
duration_ms: 0.396584
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.213359
|
|
|
|
→ Running tests/video-card-source-visibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
ok 1 - updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
---
|
|
duration_ms: 88.268179
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
ok 2 - VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
---
|
|
duration_ms: 36.228195
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
ok 3 - VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 16.465009
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
ok 4 - VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 16.47287
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 170.945519
|
|
|
|
→ Running tests/video-modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 333.373207
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 23.203255
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 306.577493
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 113.8409
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 87.842838
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 92.17543
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 82.003984
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 92.681406
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 233.621509
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 70.970477
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1451.13177
|
|
|
|
→ Running tests/video-modal-comments.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 327.164075
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 24.513737
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 309.437182
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 106.534815
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 88.587156
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 86.021131
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 84.853017
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 90.600794
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 237.060087
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 66.978009
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section toggles visibility and renders hydrated comments
|
|
ok 11 - VideoModal comment section toggles visibility and renders hydrated comments
|
|
---
|
|
duration_ms: 86.379657
|
|
type: 'test'
|
|
...
|
|
# Subtest: Unauthenticated users can read comments while the composer stays disabled
|
|
ok 12 - Unauthenticated users can read comments while the composer stays disabled
|
|
---
|
|
duration_ms: 75.503046
|
|
type: 'test'
|
|
...
|
|
# Subtest: Guest users render loaded thread snapshots before composer auth enforcement
|
|
ok 13 - Guest users render loaded thread snapshots before composer auth enforcement
|
|
---
|
|
duration_ms: 66.200428
|
|
type: 'test'
|
|
...
|
|
# Subtest: Thread ready snapshots force comments visible before composer gating
|
|
ok 14 - Thread ready snapshots force comments visible before composer gating
|
|
---
|
|
duration_ms: 64.29184
|
|
type: 'test'
|
|
...
|
|
# Subtest: Controller renders synchronous loadThread snapshots immediately
|
|
ok 15 - Controller renders synchronous loadThread snapshots immediately
|
|
---
|
|
duration_ms: 60.949172
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController attaches profiles using normalized pubkeys
|
|
ok 16 - VideoModalCommentController attaches profiles using normalized pubkeys
|
|
---
|
|
duration_ms: 1.584171
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
ok 17 - VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
---
|
|
duration_ms: 0.586581
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment composer updates messaging and dispatches events
|
|
ok 18 - VideoModal comment composer updates messaging and dispatches events
|
|
---
|
|
duration_ms: 63.783089
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController load preserves current video for submissions
|
|
ok 19 - VideoModalCommentController load preserves current video for submissions
|
|
---
|
|
duration_ms: 1.013681
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
ok 20 - VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
---
|
|
duration_ms: 0.485678
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
ok 21 - VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
---
|
|
duration_ms: 0.708015
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
ok 22 - VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
---
|
|
duration_ms: 0.618306
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController publishes comment using event id fallback
|
|
ok 23 - VideoModalCommentController publishes comment using event id fallback
|
|
---
|
|
duration_ms: 0.483121
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController disposes safely during in-flight comment loads
|
|
ok 24 - VideoModalCommentController disposes safely during in-flight comment loads
|
|
---
|
|
duration_ms: 0.724523
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController prompts login when publish requires authentication
|
|
ok 25 - VideoModalCommentController prompts login when publish requires authentication
|
|
---
|
|
duration_ms: 0.630403
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController includes parent metadata when replying
|
|
ok 26 - VideoModalCommentController includes parent metadata when replying
|
|
---
|
|
duration_ms: 0.458569
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
ok 27 - VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
---
|
|
duration_ms: 70.340881
|
|
type: 'test'
|
|
...
|
|
1..27
|
|
# tests 27
|
|
# suites 0
|
|
# pass 27
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1986.670245
|
|
|
|
→ Running tests/video-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoModalController
|
|
# Subtest: ensureVideoModalReady throws if modal is missing
|
|
ok 1 - ensureVideoModalReady throws if modal is missing
|
|
---
|
|
duration_ms: 1.652285
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureVideoModalReady loads modal if needs rehydrate
|
|
ok 2 - ensureVideoModalReady loads modal if needs rehydrate
|
|
---
|
|
duration_ms: 0.624591
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster uses provided video
|
|
ok 3 - showModalWithPoster uses provided video
|
|
---
|
|
duration_ms: 0.852157
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster falls back to current video
|
|
ok 4 - showModalWithPoster falls back to current video
|
|
---
|
|
duration_ms: 0.529404
|
|
type: 'test'
|
|
...
|
|
# Subtest: forceRemoveModalPoster calls modal method
|
|
ok 5 - forceRemoveModalPoster calls modal method
|
|
---
|
|
duration_ms: 0.300723
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - VideoModalController
|
|
---
|
|
duration_ms: 6.093418
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.320818
|
|
|
|
→ Running tests/video-modal-controllers.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 339.991469
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 25.983794
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 334.8349
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 117.16607
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 96.401803
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 90.185945
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 83.022088
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 91.476666
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 236.137451
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 66.673277
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentsController lifecycle manages comment references
|
|
ok 11 - CommentsController lifecycle manages comment references
|
|
---
|
|
duration_ms: 72.19764
|
|
type: 'test'
|
|
...
|
|
# Subtest: ReactionsController delegates reaction updates
|
|
ok 12 - ReactionsController delegates reaction updates
|
|
---
|
|
duration_ms: 65.368631
|
|
type: 'test'
|
|
...
|
|
# Subtest: SimilarContentController toggles section visibility
|
|
ok 13 - SimilarContentController toggles section visibility
|
|
---
|
|
duration_ms: 62.251549
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationController reset clears moderation overlay references
|
|
ok 14 - ModerationController reset clears moderation overlay references
|
|
---
|
|
duration_ms: 60.677841
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal trims tag strip to fit modal width
|
|
ok 15 - VideoModal trims tag strip to fit modal width
|
|
---
|
|
duration_ms: 70.50568
|
|
type: 'test'
|
|
...
|
|
1..15
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1875.926888
|
|
|
|
→ Running tests/video-modal-moderation.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 283.903585
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 30.793237
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 343.200759
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 116.123668
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 95.379092
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 88.558905
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 91.582242
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 136.983657
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 245.466835
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 73.4498
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal blurs and restores playback when moderation overlay toggles
|
|
# Subtest: trusted reports blur the active video
|
|
ok 1 - trusted reports blur the active video
|
|
---
|
|
duration_ms: 9.618069
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute blur state matches moderation context
|
|
ok 2 - trusted mute blur state matches moderation context
|
|
---
|
|
duration_ms: 4.145878
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 11 - VideoModal blurs and restores playback when moderation overlay toggles
|
|
---
|
|
duration_ms: 84.442385
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 13
|
|
# suites 0
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1603.512625
|
|
|
|
→ Running tests/video-modal-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 335.042612
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 23.250944
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 302.853368
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 104.754432
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 87.005839
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 85.70706
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 85.078434
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 88.699875
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 240.755822
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 77.429798
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal renders tag metadata and toggles visibility
|
|
ok 11 - VideoModal renders tag metadata and toggles visibility
|
|
---
|
|
duration_ms: 85.646472
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1531.700459
|
|
|
|
→ Running tests/video-note-payload.test.mjs
|
|
TAP version 13
|
|
# Subtest: normalizes minimal payload with hosted URL
|
|
ok 1 - normalizes minimal payload with hosted URL
|
|
---
|
|
duration_ms: 3.03097
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes mode and boolean flags
|
|
ok 2 - normalizes mode and boolean flags
|
|
---
|
|
duration_ms: 0.384622
|
|
type: 'test'
|
|
...
|
|
# Subtest: augments magnets with ws/xs hints
|
|
ok 3 - augments magnets with ws/xs hints
|
|
---
|
|
duration_ms: 2.08789
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes nip71 metadata collections
|
|
ok 4 - normalizes nip71 metadata collections
|
|
---
|
|
duration_ms: 1.190816
|
|
type: 'test'
|
|
...
|
|
# Subtest: derives legacy duration fallback from imeta variants
|
|
ok 5 - derives legacy duration fallback from imeta variants
|
|
---
|
|
duration_ms: 0.368218
|
|
type: 'test'
|
|
...
|
|
# Subtest: reports validation errors for missing fields
|
|
ok 6 - reports validation errors for missing fields
|
|
---
|
|
duration_ms: 0.210267
|
|
type: 'test'
|
|
...
|
|
# Subtest: rejects insecure hosted URLs
|
|
ok 7 - rejects insecure hosted URLs
|
|
---
|
|
duration_ms: 0.379502
|
|
type: 'test'
|
|
...
|
|
# Subtest: allows publishing with only imeta variants
|
|
ok 8 - allows publishing with only imeta variants
|
|
---
|
|
duration_ms: 0.311029
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.793926
|
|
|
|
→ Running tests/video-schema-and-conversion.test.mjs
|
|
TAP version 13
|
|
# Subtest: video post schema documents nsfw and kids flags
|
|
ok 1 - video post schema documents nsfw and kids flags
|
|
---
|
|
duration_ms: 1.542553
|
|
type: 'test'
|
|
...
|
|
# Subtest: convertEventToVideo normalizes nsfw and kids booleans
|
|
ok 2 - convertEventToVideo normalizes nsfw and kids booleans
|
|
---
|
|
duration_ms: 0.960607
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.21393
|
|
|
|
→ Running tests/video-settings-menu-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoSettingsMenuController - requestMenu opens popover
|
|
ok 1 - VideoSettingsMenuController - requestMenu opens popover
|
|
---
|
|
duration_ms: 1.54427
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - closeMenu closes popover
|
|
ok 2 - VideoSettingsMenuController - closeMenu closes popover
|
|
---
|
|
duration_ms: 0.328855
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - requestMenu toggles if open
|
|
ok 3 - VideoSettingsMenuController - requestMenu toggles if open
|
|
---
|
|
duration_ms: 0.287125
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoSettingsMenuController - closeAll closes all popovers
|
|
ok 4 - VideoSettingsMenuController - closeAll closes all popovers
|
|
---
|
|
duration_ms: 0.39814
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.31187
|
|
|
|
→ Running tests/webtorrent-handlers.test.mjs
|
|
TAP version 13
|
|
# Subtest: TorrentClient Handlers
|
|
# Subtest: handleTorrentStream (chrome) should set up video correctly
|
|
ok 1 - handleTorrentStream (chrome) should set up video correctly
|
|
---
|
|
duration_ms: 22.163249
|
|
type: 'test'
|
|
...
|
|
[bitvid] CORS warning detected. Attempting to remove the failing webseed/tracker.
|
|
[bitvid] Cleaned up webseeds => [ 'http://good.com/video.mp4' ]
|
|
[bitvid] Cleaned up trackers => [ 'ws://good.com' ]
|
|
# Subtest: handleTorrentStream (firefox) should set up video correctly with highWaterMark
|
|
ok 2 - handleTorrentStream (firefox) should set up video correctly with highWaterMark
|
|
---
|
|
duration_ms: 20.160045
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleTorrentStream (chrome) should handle CORS warning logic
|
|
ok 3 - handleTorrentStream (chrome) should handle CORS warning logic
|
|
---
|
|
duration_ms: 1.293682
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - TorrentClient Handlers
|
|
---
|
|
duration_ms: 45.668831
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 1
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 60.711928
|
|
|
|
→ Running tests/webtorrent-regression.test.mjs
|
|
TAP version 13
|
|
# Subtest: WebTorrent Regression Tests
|
|
# Subtest: probePeers should report healthy if webseed is present even with 0 peers
|
|
ok 1 - probePeers should report healthy if webseed is present even with 0 peers
|
|
---
|
|
duration_ms: 7.459089
|
|
type: 'test'
|
|
...
|
|
# Subtest: probePeers should report unhealthy if no webseed and 0 peers
|
|
ok 2 - probePeers should report unhealthy if no webseed and 0 peers
|
|
---
|
|
duration_ms: 51.23717
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - WebTorrent Regression Tests
|
|
---
|
|
duration_ms: 60.961905
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 68.293632
|
|
|
|
✔ All unit tests passed
|
|
Run 2
|
|
|
|
> [email protected] test:unit
|
|
> node scripts/run-unit-tests.mjs
|
|
|
|
|
|
→ Running tests/app-batch-fetch-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: batchFetchProfiles handles fast and failing relays
|
|
ok 1 - batchFetchProfiles handles fast and failing relays
|
|
---
|
|
duration_ms: 3.753254
|
|
type: 'test'
|
|
...
|
|
# Subtest: batchFetchProfiles respects forceRefresh
|
|
ok 2 - batchFetchProfiles respects forceRefresh
|
|
---
|
|
duration_ms: 0.867133
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.757744
|
|
|
|
→ Running tests/app-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: Initial state is clean
|
|
ok 1 - Initial state is clean
|
|
---
|
|
duration_ms: 2.377771
|
|
type: 'test'
|
|
...
|
|
# Subtest: setPubkey() updates state and notifies subscribers
|
|
ok 2 - setPubkey() updates state and notifies subscribers
|
|
---
|
|
duration_ms: 0.94602
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentUserNpub() updates state
|
|
ok 3 - setCurrentUserNpub() updates state
|
|
---
|
|
duration_ms: 0.431681
|
|
type: 'test'
|
|
...
|
|
# Subtest: setCurrentVideo() updates state
|
|
ok 4 - setCurrentVideo() updates state
|
|
---
|
|
duration_ms: 0.617601
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap() updates state
|
|
ok 5 - setVideosMap() updates state
|
|
---
|
|
duration_ms: 0.578003
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideoSubscription() updates state
|
|
ok 6 - setVideoSubscription() updates state
|
|
---
|
|
duration_ms: 0.315435
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState() updates state and notifies modal subscribers
|
|
ok 7 - setModalState() updates state and notifies modal subscribers
|
|
---
|
|
duration_ms: 0.771639
|
|
type: 'test'
|
|
...
|
|
# Subtest: Global subscriber receives updates
|
|
ok 8 - Global subscriber receives updates
|
|
---
|
|
duration_ms: 0.630034
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState() clears all state and notifies
|
|
ok 9 - resetAppState() clears all state and notifies
|
|
---
|
|
duration_ms: 0.618897
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 9.221873
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.535171
|
|
|
|
→ Running tests/app/channel-profile-moderation.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderChannelVideosFromList decorates videos before storing
|
|
ok 1 - renderChannelVideosFromList decorates videos before storing
|
|
---
|
|
duration_ms: 135.524098
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderChannelVideosFromList applies moderation blur without existing metadata
|
|
ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata
|
|
---
|
|
duration_ms: 49.45545
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
ok 3 - applyChannelVisualBlur blurs banner and avatar when viewer mutes author
|
|
---
|
|
duration_ms: 15.716186
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation override clears channel blur via event wiring
|
|
ok 4 - moderation override clears channel blur via event wiring
|
|
---
|
|
duration_ms: 30.454439
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel header moderation badge reflects blur state and override actions
|
|
ok 5 - channel header moderation badge reflects blur state and override actions
|
|
---
|
|
duration_ms: 27.59911
|
|
type: 'test'
|
|
...
|
|
# Subtest: channel video cards update moderation state in place when summary changes
|
|
ok 6 - channel video cards update moderation state in place when summary changes
|
|
---
|
|
duration_ms: 28.626094
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 302.597943
|
|
|
|
→ Running tests/app/feedCoordinator.test.mjs
|
|
TAP version 13
|
|
# Subtest: createFeedCoordinator - loadForYouVideos
|
|
# Subtest: loadForYouVideos executes successfully
|
|
ok 1 - loadForYouVideos executes successfully
|
|
---
|
|
duration_ms: 2.399402
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - createFeedCoordinator - loadForYouVideos
|
|
---
|
|
duration_ms: 4.338551
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.042778
|
|
|
|
→ Running tests/app/hash-change-handler.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleHashChange defaults to for-you when logged in
|
|
ok 1 - handleHashChange defaults to for-you when logged in
|
|
---
|
|
duration_ms: 79.712253
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange defaults to most-recent-videos when logged out
|
|
ok 2 - handleHashChange defaults to most-recent-videos when logged out
|
|
---
|
|
duration_ms: 9.575486
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleHashChange respects explicit view regardless of login state
|
|
ok 3 - handleHashChange respects explicit view regardless of login state
|
|
---
|
|
duration_ms: 9.341997
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 111.228388
|
|
|
|
→ Running tests/app/hydrate-sidebar-navigation.test.mjs
|
|
TAP version 13
|
|
# Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
ok 1 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers
|
|
---
|
|
duration_ms: 94.165301
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
ok 2 - hydrateSidebarNavigation hides chrome controls for logged-out viewers
|
|
---
|
|
duration_ms: 12.97666
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 118.640772
|
|
|
|
→ Running tests/app/is-user-logged-in.test.mjs
|
|
TAP version 13
|
|
# Subtest: isUserLoggedIn returns false when no user pubkey is set
|
|
ok 1 - isUserLoggedIn returns false when no user pubkey is set
|
|
---
|
|
duration_ms: 1.260356
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn treats extension logins as authenticated
|
|
ok 2 - isUserLoggedIn treats extension logins as authenticated
|
|
---
|
|
duration_ms: 0.305435
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn guards against mismatched nostrClient state
|
|
ok 3 - isUserLoggedIn guards against mismatched nostrClient state
|
|
---
|
|
duration_ms: 0.269474
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn ignores anonymous session actor mismatches
|
|
ok 4 - isUserLoggedIn ignores anonymous session actor mismatches
|
|
---
|
|
duration_ms: 0.225084
|
|
type: 'test'
|
|
...
|
|
# Subtest: isUserLoggedIn rejects mismatched managed session actors
|
|
ok 5 - isUserLoggedIn rejects mismatched managed session actors
|
|
---
|
|
duration_ms: 0.319749
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.370208
|
|
|
|
→ Running tests/app/moderation-overrides.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationOverride decorates stored and current videos then refreshes UI
|
|
ok 1 - handleModerationOverride decorates stored and current videos then refreshes UI
|
|
---
|
|
duration_ms: 5.815225
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationOverride resumes deferred playback
|
|
ok 2 - handleModerationOverride resumes deferred playback
|
|
---
|
|
duration_ms: 1.151538
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
ok 3 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state
|
|
---
|
|
duration_ms: 3.635556
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleModerationBlock returns false when viewer is logged out
|
|
ok 4 - handleModerationBlock returns false when viewer is logged out
|
|
---
|
|
duration_ms: 1.04271
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 26.859821
|
|
|
|
→ Running tests/app/moderation-settings-refresh.test.mjs
|
|
TAP version 13
|
|
# Subtest: handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
ok 1 - handleModerationSettingsChange refreshes feeds with updated thresholds
|
|
---
|
|
duration_ms: 4.594576
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.666603
|
|
|
|
→ Running tests/app/similar-content.test.mjs
|
|
TAP version 13
|
|
# Subtest: orders similar videos by shared tags then timestamp
|
|
ok 1 - orders similar videos by shared tags then timestamp
|
|
---
|
|
duration_ms: 3.201848
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns no matches when the active video lacks tags
|
|
ok 2 - returns no matches when the active video lacks tags
|
|
---
|
|
duration_ms: 0.446398
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips candidates without tag metadata
|
|
ok 3 - skips candidates without tag metadata
|
|
---
|
|
duration_ms: 0.357717
|
|
type: 'test'
|
|
...
|
|
# Subtest: filters NSFW and private videos when NSFW content is disabled
|
|
ok 4 - filters NSFW and private videos when NSFW content is disabled
|
|
---
|
|
duration_ms: 0.588113
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.11384
|
|
|
|
→ Running tests/auth/signingAdapter.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNip07SigningAdapter
|
|
# Subtest: uses explicit extension if provided
|
|
ok 1 - uses explicit extension if provided
|
|
---
|
|
duration_ms: 2.200596
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to window.nostr if no extension provided
|
|
ok 2 - falls back to window.nostr if no extension provided
|
|
---
|
|
duration_ms: 0.577862
|
|
type: 'test'
|
|
...
|
|
# Subtest: throws error if no extension available
|
|
ok 3 - throws error if no extension available
|
|
---
|
|
duration_ms: 1.425563
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizes explicit extension over window.nostr
|
|
ok 4 - prioritizes explicit extension over window.nostr
|
|
---
|
|
duration_ms: 0.765708
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - createNip07SigningAdapter
|
|
---
|
|
duration_ms: 7.718417
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.66356
|
|
|
|
→ Running tests/comment-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
ok 1 - buildCommentEvent emits NIP-22 root metadata while keeping legacy fallbacks
|
|
---
|
|
duration_ms: 2.80738
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
ok 2 - buildCommentEvent includes parent pointers, kinds, and authors for replies
|
|
---
|
|
duration_ms: 0.551843
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent normalizes relays and preserves explicit overrides
|
|
ok 3 - buildCommentEvent normalizes relays and preserves explicit overrides
|
|
---
|
|
duration_ms: 0.874492
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent falls back to event pointers when no address is supplied
|
|
ok 4 - buildCommentEvent falls back to event pointers when no address is supplied
|
|
---
|
|
duration_ms: 0.281084
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent accepts partial metadata for parent overrides
|
|
ok 5 - buildCommentEvent accepts partial metadata for parent overrides
|
|
---
|
|
duration_ms: 0.428178
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildCommentEvent sanitizes additional tags before signing
|
|
ok 6 - buildCommentEvent sanitizes additional tags before signing
|
|
---
|
|
duration_ms: 0.868141
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.468505
|
|
|
|
→ Running tests/comment-thread-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: CommentThreadService caches mixed-case video ids consistently
|
|
ok 1 - CommentThreadService caches mixed-case video ids consistently
|
|
---
|
|
duration_ms: 3.993456
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache read failures
|
|
ok 2 - CommentThreadService surfaces cache read failures
|
|
---
|
|
duration_ms: 0.938862
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces cache write failures
|
|
ok 3 - CommentThreadService surfaces cache write failures
|
|
---
|
|
duration_ms: 0.586593
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService persists caches safely during teardown failures
|
|
ok 4 - CommentThreadService persists caches safely during teardown failures
|
|
---
|
|
duration_ms: 2.161161
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService logs cache usage and fallback decisions
|
|
ok 5 - CommentThreadService logs cache usage and fallback decisions
|
|
---
|
|
duration_ms: 1.61104
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case event ids in thread state
|
|
ok 6 - CommentThreadService normalizes mixed-case event ids in thread state
|
|
---
|
|
duration_ms: 2.452592
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
ok 7 - CommentThreadService normalizes mixed-case pubkeys during hydration
|
|
---
|
|
duration_ms: 0.993106
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
ok 8 - CommentThreadService deduplicates mixed-case event ids and pubkeys
|
|
---
|
|
duration_ms: 0.896793
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService retries profile hydration before succeeding
|
|
ok 9 - CommentThreadService retries profile hydration before succeeding
|
|
---
|
|
duration_ms: 77.468069
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService surfaces profile hydration failures after retries
|
|
ok 10 - CommentThreadService surfaces profile hydration failures after retries
|
|
---
|
|
duration_ms: 200.889268
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments accepts builder events without parent ids and filters replies
|
|
ok 11 - listVideoComments accepts builder events without parent ids and filters replies
|
|
---
|
|
duration_ms: 5.994521
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
ok 12 - CommentThreadService hydrates, subscribes, and dedupes incoming comment events
|
|
---
|
|
duration_ms: 33.010554
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService loadThread falls back to event id when address is missing
|
|
ok 13 - CommentThreadService loadThread falls back to event id when address is missing
|
|
---
|
|
duration_ms: 0.788866
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService requests and snapshots comments by root identifier
|
|
ok 14 - CommentThreadService requests and snapshots comments by root identifier
|
|
---
|
|
duration_ms: 0.78024
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService falls back to pointerIdentifiers root id
|
|
ok 15 - CommentThreadService falls back to pointerIdentifiers root id
|
|
---
|
|
duration_ms: 0.774973
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
ok 16 - CommentThreadService preserves raw video author pubkeys during hydration fetches
|
|
---
|
|
duration_ms: 5.519321
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentThreadService teardown cancels hydration timers
|
|
ok 17 - CommentThreadService teardown cancels hydration timers
|
|
---
|
|
duration_ms: 81.294355
|
|
type: 'test'
|
|
...
|
|
1..17
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 430.961868
|
|
|
|
→ Running tests/compliance/nip04_44_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-04/44 Compliance: Encryption Preference
|
|
# Subtest: createNip46Cipher prefers nip44.v2 when available
|
|
ok 1 - createNip46Cipher prefers nip44.v2 when available
|
|
---
|
|
duration_ms: 20.00467
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Cipher falls back to nip04 if nip44 is missing
|
|
ok 2 - createNip46Cipher falls back to nip04 if nip44 is missing
|
|
---
|
|
duration_ms: 8.993875
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-04/44 Compliance: Encryption Preference
|
|
---
|
|
duration_ms: 98.2462
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-04/44 Compliance: Decryption Fallback
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
ok 1 - decryptNip46PayloadWithKeys handles nip44 (v2) payload
|
|
---
|
|
duration_ms: 23.594362
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip04 payload
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip04 payload
|
|
---
|
|
duration_ms: 27.717513
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - NIP-04/44 Compliance: Decryption Fallback
|
|
---
|
|
duration_ms: 53.202133
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 165.398188
|
|
|
|
→ Running tests/compliance/nip07_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Compliance: Retry Logic
|
|
# Subtest: runNip07WithRetry succeeds on first try
|
|
ok 1 - runNip07WithRetry succeeds on first try
|
|
---
|
|
duration_ms: 1.926194
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry retries on timeout error
|
|
ok 2 - runNip07WithRetry retries on timeout error
|
|
---
|
|
duration_ms: 20.714373
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry fails after max retries or if error is not timeout
|
|
ok 3 - runNip07WithRetry fails after max retries or if error is not timeout
|
|
---
|
|
duration_ms: 1.19349
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - NIP-07 Compliance: Retry Logic
|
|
---
|
|
duration_ms: 25.400337
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 58.839944
|
|
|
|
→ Running tests/compliance/nip65_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-65 Compliance: Relay List Loading
|
|
# Subtest: loadRelayList requests Kind 10002
|
|
ok 1 - loadRelayList requests Kind 10002
|
|
---
|
|
duration_ms: 4.257063
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadRelayList parses r tags correctly
|
|
ok 2 - loadRelayList parses r tags correctly
|
|
---
|
|
duration_ms: 0.367677
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-65 Compliance: Relay List Loading
|
|
---
|
|
duration_ms: 137.984077
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 151.183881
|
|
|
|
→ Running tests/compliance/video_note_compliance.test.mjs
|
|
TAP version 13
|
|
# Subtest: Video Note Compliance (Kind 30078 & NIP-71)
|
|
# Subtest: prepareVideoPublishPayload creates Kind 30078 event
|
|
ok 1 - prepareVideoPublishPayload creates Kind 30078 event
|
|
---
|
|
duration_ms: 2.561016
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
ok 2 - prepareVideoPublishPayload includes NIP-71 tags when provided
|
|
---
|
|
duration_ms: 0.95189
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Video Note Compliance (Kind 30078 & NIP-71)
|
|
---
|
|
duration_ms: 35.805719
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 47.511595
|
|
|
|
→ Running tests/design-system-metrics.test.mjs
|
|
TAP version 13
|
|
# Subtest: metric probe falls back to numeric parsing when measurement fails
|
|
ok 1 - metric probe falls back to numeric parsing when measurement fails
|
|
---
|
|
duration_ms: 237.823336
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 247.992625
|
|
|
|
→ Running tests/designSystem/dynamicStyles.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/designSystem/dynamicStyles.js
|
|
# Subtest: registerScope
|
|
# Subtest: should register a scope and return a string ID
|
|
ok 1 - should register a scope and return a string ID
|
|
---
|
|
duration_ms: 101.34066
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a style element or use adoptedStyleSheets
|
|
ok 2 - should create a style element or use adoptedStyleSheets
|
|
---
|
|
duration_ms: 18.306686
|
|
type: 'test'
|
|
...
|
|
# Subtest: should insert rules with the correct selector
|
|
ok 3 - should insert rules with the correct selector
|
|
---
|
|
duration_ms: 14.196502
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle "&" in selectors
|
|
ok 4 - should handle "&" in selectors
|
|
---
|
|
duration_ms: 11.224832
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - registerScope
|
|
---
|
|
duration_ms: 146.358611
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setVariables
|
|
# Subtest: should update CSS variables on the scope
|
|
ok 1 - should update CSS variables on the scope
|
|
---
|
|
duration_ms: 13.167544
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle removing variables
|
|
ok 2 - should handle removing variables
|
|
---
|
|
duration_ms: 10.589902
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setVariables
|
|
---
|
|
duration_ms: 24.277163
|
|
type: 'suite'
|
|
...
|
|
# Subtest: releaseScope
|
|
# Subtest: should remove rules and clean up
|
|
ok 1 - should remove rules and clean up
|
|
---
|
|
duration_ms: 10.395003
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for non-existent scope
|
|
ok 2 - should return false for non-existent scope
|
|
---
|
|
duration_ms: 12.726163
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - releaseScope
|
|
---
|
|
duration_ms: 23.486929
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Isolation
|
|
# Subtest: should manage scopes independently for different documents
|
|
ok 1 - should manage scopes independently for different documents
|
|
---
|
|
duration_ms: 26.90354
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 4 - Isolation
|
|
---
|
|
duration_ms: 27.035897
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Edge cases
|
|
# Subtest: should handle invalid selectors gracefully
|
|
ok 1 - should handle invalid selectors gracefully
|
|
---
|
|
duration_ms: 9.78114
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing document gracefully
|
|
ok 2 - should handle missing document gracefully
|
|
---
|
|
duration_ms: 6.577406
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fallback to <style> element if CSSStyleSheet is missing
|
|
ok 3 - should fallback to <style> element if CSSStyleSheet is missing
|
|
---
|
|
duration_ms: 13.751834
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 5 - Edge cases
|
|
---
|
|
duration_ms: 30.566515
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - js/designSystem/dynamicStyles.js
|
|
---
|
|
duration_ms: 253.095882
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 6
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 283.095719
|
|
|
|
→ Running tests/dm-block-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM block/mute filtering
|
|
# Subtest: setDmBlockChecker
|
|
# Subtest: should accept a function
|
|
ok 1 - should accept a function
|
|
---
|
|
duration_ms: 1.766525
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed null
|
|
ok 2 - should clear checker when passed null
|
|
---
|
|
duration_ms: 0.431636
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear checker when passed non-function
|
|
ok 3 - should clear checker when passed non-function
|
|
---
|
|
duration_ms: 0.735562
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - setDmBlockChecker
|
|
---
|
|
duration_ms: 4.413768
|
|
type: 'suite'
|
|
...
|
|
# Subtest: applyDirectMessage with block checker
|
|
# Subtest: should drop messages from blocked senders
|
|
ok 1 - should drop messages from blocked senders
|
|
---
|
|
duration_ms: 1.264134
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow messages from non-blocked senders
|
|
ok 2 - should allow messages from non-blocked senders
|
|
---
|
|
duration_ms: 3.149088
|
|
type: 'test'
|
|
...
|
|
# Subtest: should allow all messages when no block checker is set
|
|
ok 3 - should allow all messages when no block checker is set
|
|
---
|
|
duration_ms: 0.791701
|
|
type: 'test'
|
|
...
|
|
# Subtest: should block outgoing messages to blocked recipients
|
|
ok 4 - should block outgoing messages to blocked recipients
|
|
---
|
|
duration_ms: 0.465027
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyDirectMessage with block checker
|
|
---
|
|
duration_ms: 6.311504
|
|
type: 'suite'
|
|
...
|
|
# Subtest: _isDmRemoteBlocked
|
|
# Subtest: should return false when no checker is set
|
|
ok 1 - should return false when no checker is set
|
|
---
|
|
duration_ms: 0.59128
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true for blocked remote pubkey
|
|
ok 2 - should return true for blocked remote pubkey
|
|
---
|
|
duration_ms: 2.258619
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false for allowed remote pubkey
|
|
ok 3 - should return false for allowed remote pubkey
|
|
---
|
|
duration_ms: 0.506212
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle checker that throws
|
|
ok 4 - should handle checker that throws
|
|
---
|
|
duration_ms: 0.34357
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - _isDmRemoteBlocked
|
|
---
|
|
duration_ms: 3.996025
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - DM block/mute filtering
|
|
---
|
|
duration_ms: 15.671817
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 4
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.719167
|
|
|
|
→ Running tests/dm-db.test.mjs
|
|
TAP version 13
|
|
# Subtest: writeMessages normalizes records before storing
|
|
ok 1 - writeMessages normalizes records before storing
|
|
---
|
|
duration_ms: 16.258754
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateConversationFromMessage persists metadata updates
|
|
ok 2 - updateConversationFromMessage persists metadata updates
|
|
---
|
|
duration_ms: 4.400822
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 27.822605
|
|
|
|
→ Running tests/dm-decryptor.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM handles kind 4 events with nip04 ciphertext
|
|
ok 1 - decryptDM handles kind 4 events with nip04 ciphertext
|
|
---
|
|
duration_ms: 79.326251
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM prefers recipient pubkeys when actor is the sender
|
|
ok 2 - decryptDM prefers recipient pubkeys when actor is the sender
|
|
---
|
|
duration_ms: 23.048254
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM unwraps kind 1059 gift wraps with nip44
|
|
ok 3 - decryptDM unwraps kind 1059 gift wraps with nip44
|
|
---
|
|
duration_ms: 61.709204
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM returns failure when decryptors are unavailable
|
|
ok 4 - decryptDM returns failure when decryptors are unavailable
|
|
---
|
|
duration_ms: 0.325683
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 177.755037
|
|
|
|
→ Running tests/dm-normalization.test.mjs
|
|
TAP version 13
|
|
# Subtest: direct message normalization hashes conversations consistently
|
|
ok 1 - direct message normalization hashes conversations consistently
|
|
---
|
|
duration_ms: 17.635442
|
|
type: 'test'
|
|
...
|
|
# Subtest: direct message list dedupes entries by event id
|
|
ok 2 - direct message list dedupes entries by event id
|
|
---
|
|
duration_ms: 6.413491
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/docs/verify-upload-claims.test.mjs
|
|
TAP version 13
|
|
# Subtest: Documentation Accuracy Verification
|
|
# Subtest: setup
|
|
ok 1 - setup
|
|
---
|
|
duration_ms: 7.363379
|
|
type: 'test'
|
|
...
|
|
# Subtest: should list accepted video file extensions in docs matching the HTML accept attribute
|
|
ok 2 - should list accepted video file extensions in docs matching the HTML accept attribute
|
|
---
|
|
duration_ms: 0.633398
|
|
type: 'test'
|
|
...
|
|
# Subtest: should state Title is required in docs and be required in HTML
|
|
ok 3 - should state Title is required in docs and be required in HTML
|
|
---
|
|
duration_ms: 0.402513
|
|
type: 'test'
|
|
...
|
|
# Subtest: should mention 2GB limit recommendation in docs and HTML
|
|
ok 4 - should mention 2GB limit recommendation in docs and HTML
|
|
---
|
|
duration_ms: 0.322363
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Documentation Accuracy Verification
|
|
---
|
|
duration_ms: 10.411454
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.616898
|
|
|
|
→ Running tests/edit-modal-submit-state.test.mjs
|
|
TAP version 13
|
|
# Subtest: ignores additional submissions while pending without spurious errors
|
|
ok 1 - ignores additional submissions while pending without spurious errors
|
|
---
|
|
duration_ms: 272.02256
|
|
type: 'test'
|
|
...
|
|
# Subtest: editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
ok 2 - editing the magnet refreshes torrent hints when ws/xs remain locked
|
|
---
|
|
duration_ms: 107.023022
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not show missing video error after modal closes
|
|
ok 3 - does not show missing video error after modal closes
|
|
---
|
|
duration_ms: 83.689129
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 476.862226
|
|
|
|
→ Running tests/event-schemas.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Event Schemas
|
|
# Subtest: should validate buildVideoPostEvent
|
|
ok 1 - should validate buildVideoPostEvent
|
|
---
|
|
duration_ms: 2.575143
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildVideoMirrorEvent
|
|
ok 2 - should validate buildVideoMirrorEvent
|
|
---
|
|
duration_ms: 0.511996
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRepostEvent
|
|
ok 3 - should validate buildRepostEvent
|
|
---
|
|
duration_ms: 0.443275
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildShareEvent
|
|
ok 4 - should validate buildShareEvent
|
|
---
|
|
duration_ms: 0.745921
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildRelayListEvent
|
|
ok 5 - should validate buildRelayListEvent
|
|
---
|
|
duration_ms: 0.621778
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmRelayListEvent
|
|
ok 6 - should validate buildDmRelayListEvent
|
|
---
|
|
duration_ms: 0.410613
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildProfileMetadataEvent
|
|
ok 7 - should validate buildProfileMetadataEvent
|
|
---
|
|
duration_ms: 0.55067
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildMuteListEvent
|
|
ok 8 - should validate buildMuteListEvent
|
|
---
|
|
duration_ms: 0.526813
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDeletionEvent
|
|
ok 9 - should validate buildDeletionEvent
|
|
---
|
|
duration_ms: 0.834664
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildLegacyDirectMessageEvent
|
|
ok 10 - should validate buildLegacyDirectMessageEvent
|
|
---
|
|
duration_ms: 0.678947
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmAttachmentEvent
|
|
ok 11 - should validate buildDmAttachmentEvent
|
|
---
|
|
duration_ms: 0.315724
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmReadReceiptEvent
|
|
ok 12 - should validate buildDmReadReceiptEvent
|
|
---
|
|
duration_ms: 0.252664
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildDmTypingIndicatorEvent
|
|
ok 13 - should validate buildDmTypingIndicatorEvent
|
|
---
|
|
duration_ms: 0.293081
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildViewEvent
|
|
ok 14 - should validate buildViewEvent
|
|
---
|
|
duration_ms: 0.433733
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildZapRequestEvent
|
|
ok 15 - should validate buildZapRequestEvent
|
|
---
|
|
duration_ms: 0.339903
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildReactionEvent
|
|
ok 16 - should validate buildReactionEvent
|
|
---
|
|
duration_ms: 0.775899
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildCommentEvent
|
|
ok 17 - should validate buildCommentEvent
|
|
---
|
|
duration_ms: 0.857934
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildWatchHistoryEvent
|
|
ok 18 - should validate buildWatchHistoryEvent
|
|
---
|
|
duration_ms: 0.366426
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildSubscriptionListEvent
|
|
ok 19 - should validate buildSubscriptionListEvent
|
|
---
|
|
duration_ms: 0.252989
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildBlockListEvent
|
|
ok 20 - should validate buildBlockListEvent
|
|
---
|
|
duration_ms: 0.186488
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildHashtagPreferenceEvent
|
|
ok 21 - should validate buildHashtagPreferenceEvent
|
|
---
|
|
duration_ms: 0.161298
|
|
type: 'test'
|
|
...
|
|
# Subtest: should validate buildAdminListEvent (moderation)
|
|
ok 22 - should validate buildAdminListEvent (moderation)
|
|
---
|
|
duration_ms: 0.363363
|
|
type: 'test'
|
|
...
|
|
1..22
|
|
ok 1 - Nostr Event Schemas
|
|
---
|
|
duration_ms: 15.975949
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 22
|
|
# suites 1
|
|
# pass 22
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 39.933128
|
|
|
|
→ Running tests/feed-engine/explore-diversity.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore diversity sorter increases tag diversity in the top results
|
|
ok 1 - explore diversity sorter increases tag diversity in the top results
|
|
---
|
|
duration_ms: 2.167177
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore diversity sorter logs why when MMR re-orders similar candidates
|
|
ok 2 - explore diversity sorter logs why when MMR re-orders similar candidates
|
|
---
|
|
duration_ms: 0.994804
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.492868
|
|
|
|
→ Running tests/feed-engine/explore-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: explore disinterest filter drops videos with disinterested tags
|
|
ok 1 - explore disinterest filter drops videos with disinterested tags
|
|
---
|
|
duration_ms: 1.745921
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer penalizes disinterest overlap and logs why metadata
|
|
ok 2 - explore scorer penalizes disinterest overlap and logs why metadata
|
|
---
|
|
duration_ms: 1.916086
|
|
type: 'test'
|
|
...
|
|
# Subtest: explore scorer rewards novelty and new tag fraction
|
|
ok 3 - explore scorer rewards novelty and new tag fraction
|
|
---
|
|
duration_ms: 0.571339
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.545712
|
|
|
|
→ Running tests/feed-engine/kids-scorer.test.mjs
|
|
TAP version 13
|
|
# Subtest: kids scorer correctly identifies dominant positive component
|
|
ok 1 - kids scorer correctly identifies dominant positive component
|
|
---
|
|
duration_ms: 3.848619
|
|
type: 'test'
|
|
...
|
|
# Subtest: kids scorer picks educational-boost when dominant
|
|
ok 2 - kids scorer picks educational-boost when dominant
|
|
---
|
|
duration_ms: 0.513168
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.362258
|
|
|
|
→ Running tests/feed-engine/tag-preference-filter.test.mjs
|
|
TAP version 13
|
|
# Subtest: tag preference stage filters by interests and excludes disinterests
|
|
ok 1 - tag preference stage filters by interests and excludes disinterests
|
|
---
|
|
duration_ms: 2.9526
|
|
type: 'test'
|
|
...
|
|
# Subtest: tag preference stage accepts interests from nip71 hashtags
|
|
ok 2 - tag preference stage accepts interests from nip71 hashtags
|
|
---
|
|
duration_ms: 0.374204
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.300589
|
|
|
|
→ Running tests/grid-health.test.mjs
|
|
TAP version 13
|
|
# Subtest: prioritizeEntries input validation
|
|
ok 1 - prioritizeEntries input validation
|
|
---
|
|
duration_ms: 80.716636
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries filtering
|
|
ok 2 - prioritizeEntries filtering
|
|
---
|
|
duration_ms: 11.894974
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries without viewport center
|
|
ok 3 - prioritizeEntries without viewport center
|
|
---
|
|
duration_ms: 10.486787
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries with viewport center
|
|
ok 4 - prioritizeEntries with viewport center
|
|
---
|
|
duration_ms: 8.627474
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries ratio prioritization when distances are similar
|
|
ok 5 - prioritizeEntries ratio prioritization when distances are similar
|
|
---
|
|
duration_ms: 10.021254
|
|
type: 'test'
|
|
...
|
|
# Subtest: prioritizeEntries uses boundingClientRect fallback
|
|
ok 6 - prioritizeEntries uses boundingClientRect fallback
|
|
---
|
|
duration_ms: 8.223637
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 148.72072
|
|
|
|
→ Running tests/hashtag-preferences.test.mjs
|
|
[bitvid] [HashtagPreferences] Failed to decrypt hashtag preferences Error: Decrypt permissions are required to read hashtag preferences.
|
|
at HashtagPreferencesService.decryptEvent (file:///app/js/services/hashtagPreferencesService.js:1011:23)
|
|
at async HashtagPreferencesService.loadInternal (file:///app/js/services/hashtagPreferencesService.js:854:25)
|
|
at async HashtagPreferencesService.load (file:///app/js/services/hashtagPreferencesService.js:566:7)
|
|
at async TestContext.<anonymous> (file:///app/tests/hashtag-preferences.test.mjs:291:7)
|
|
at async Test.run (node:internal/test_runner/test:1054:7)
|
|
at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) {
|
|
code: 'hashtag-preferences-permission-required'
|
|
}
|
|
TAP version 13
|
|
# Subtest: load decrypts nip44 payloads and normalizes tags
|
|
ok 1 - load decrypts nip44 payloads and normalizes tags
|
|
---
|
|
duration_ms: 22.182275
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to nip04 decryption
|
|
ok 2 - load falls back to nip04 decryption
|
|
---
|
|
duration_ms: 2.709076
|
|
type: 'test'
|
|
...
|
|
# Subtest: load retries decryptors when hinted scheme fails
|
|
ok 3 - load retries decryptors when hinted scheme fails
|
|
---
|
|
duration_ms: 2.476019
|
|
type: 'test'
|
|
...
|
|
# Subtest: load defers permission-required decrypts until explicitly enabled
|
|
ok 4 - load defers permission-required decrypts until explicitly enabled
|
|
---
|
|
duration_ms: 6.449372
|
|
type: 'test'
|
|
...
|
|
# Subtest: interest and disinterest lists remain exclusive
|
|
ok 5 - interest and disinterest lists remain exclusive
|
|
---
|
|
duration_ms: 14.026472
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish encrypts payload and builds event via builder
|
|
ok 6 - publish encrypts payload and builds event via builder
|
|
---
|
|
duration_ms: 2.627513
|
|
type: 'test'
|
|
...
|
|
# Subtest: publish falls back to window nostr encryptors
|
|
ok 7 - publish falls back to window nostr encryptors
|
|
---
|
|
duration_ms: 2.859418
|
|
type: 'test'
|
|
...
|
|
# Subtest: load prefers canonical kind when timestamps match while accepting legacy payload
|
|
ok 8 - load prefers canonical kind when timestamps match while accepting legacy payload
|
|
---
|
|
duration_ms: 2.388874
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer is missing
|
|
ok 9 - load falls back to window.nostr when active signer is missing
|
|
---
|
|
duration_ms: 2.125283
|
|
type: 'test'
|
|
...
|
|
# Subtest: load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
ok 10 - load falls back to window.nostr when active signer lacks decrypt capabilities
|
|
---
|
|
duration_ms: 1.757882
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/login-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: LoginModalController shows custom error for empty nsec input
|
|
ok 1 - LoginModalController shows custom error for empty nsec input
|
|
---
|
|
duration_ms: 205.571102
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController does not set required attribute when toggling modes
|
|
ok 2 - LoginModalController does not set required attribute when toggling modes
|
|
---
|
|
duration_ms: 60.653029
|
|
type: 'test'
|
|
...
|
|
# Subtest: LoginModalController shows NIP-46 handshake panel
|
|
ok 3 - LoginModalController shows NIP-46 handshake panel
|
|
---
|
|
duration_ms: 55.042649
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 334.576334
|
|
|
|
→ Running tests/magnet-utils.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeMagnet handles encoded values
|
|
ok 1 - safeDecodeMagnet handles encoded values
|
|
---
|
|
duration_ms: 1.457411
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeMagnet leaves plain strings untouched
|
|
ok 2 - safeDecodeMagnet leaves plain strings untouched
|
|
---
|
|
duration_ms: 0.271228
|
|
type: 'test'
|
|
...
|
|
# Subtest: bare hashes normalize consistently
|
|
ok 3 - bare hashes normalize consistently
|
|
---
|
|
duration_ms: 3.06096
|
|
type: 'test'
|
|
...
|
|
# Subtest: legacy %3A payloads decode
|
|
ok 4 - legacy %3A payloads decode
|
|
---
|
|
duration_ms: 0.723323
|
|
type: 'test'
|
|
...
|
|
# Subtest: duplicate trackers and hints stay in sync
|
|
ok 5 - duplicate trackers and hints stay in sync
|
|
---
|
|
duration_ms: 0.961803
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper enforces HTTPS web seeds when on HTTPS
|
|
ok 6 - object helper enforces HTTPS web seeds when on HTTPS
|
|
---
|
|
duration_ms: 0.542901
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper allows HTTP seeds on HTTP origins
|
|
ok 7 - object helper allows HTTP seeds on HTTP origins
|
|
---
|
|
duration_ms: 0.51702
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractMagnetHints returns first ws/xs pair
|
|
ok 8 - extractMagnetHints returns first ws/xs pair
|
|
---
|
|
duration_ms: 0.502025
|
|
type: 'test'
|
|
...
|
|
# Subtest: object helper reports didChange when output differs
|
|
ok 9 - object helper reports didChange when output differs
|
|
---
|
|
duration_ms: 0.733972
|
|
type: 'test'
|
|
...
|
|
# Subtest: helpers trim fragments from non-magnet values
|
|
ok 10 - helpers trim fragments from non-magnet values
|
|
---
|
|
duration_ms: 0.771111
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet filters out known broken trackers
|
|
ok 11 - normalizeAndAugmentMagnet filters out known broken trackers
|
|
---
|
|
duration_ms: 0.682614
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput parses each inbound parameter exactly once
|
|
ok 12 - normalizeMagnetInput parses each inbound parameter exactly once
|
|
---
|
|
duration_ms: 0.415523
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
ok 13 - normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular
|
|
---
|
|
duration_ms: 0.550772
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
ok 14 - normalizeMagnetInput preserves parameter values containing additional equals signs
|
|
---
|
|
duration_ms: 0.398112
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.43506
|
|
|
|
→ Running tests/media-loader.test.mjs
|
|
TAP version 13
|
|
# Subtest: MediaLoader assigns image sources once intersecting
|
|
ok 1 - MediaLoader assigns image sources once intersecting
|
|
---
|
|
duration_ms: 93.959254
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader loads video sources and poster fallbacks
|
|
ok 2 - MediaLoader loads video sources and poster fallbacks
|
|
---
|
|
duration_ms: 20.713039
|
|
type: 'test'
|
|
...
|
|
# Subtest: MediaLoader clears unsupported lazy targets without inline styles
|
|
ok 3 - MediaLoader clears unsupported lazy targets without inline styles
|
|
---
|
|
duration_ms: 10.237985
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 137.232079
|
|
|
|
→ Running tests/minimal-channel-profile.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import channelProfile
|
|
ok 1 - can import channelProfile
|
|
---
|
|
duration_ms: 1.021523
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.367414
|
|
|
|
→ Running tests/minimal-webtorrent.test.mjs
|
|
TAP version 13
|
|
# Subtest: can import WebTorrent
|
|
ok 1 - can import WebTorrent
|
|
---
|
|
duration_ms: 1.027097
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 10.960672
|
|
|
|
→ Running tests/modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal closes on Escape and restores trigger focus
|
|
ok 1 - UploadModal closes on Escape and restores trigger focus
|
|
---
|
|
duration_ms: 231.110797
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal backdrop click closes and restores trigger focus
|
|
ok 2 - UploadModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 78.669326
|
|
type: 'test'
|
|
...
|
|
# Subtest: UploadModal mode toggle updates button states
|
|
ok 3 - UploadModal mode toggle updates button states
|
|
---
|
|
duration_ms: 69.123354
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal Escape closes and restores trigger focus
|
|
ok 4 - EditModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 94.320575
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal backdrop click closes and restores trigger focus
|
|
ok 5 - EditModal backdrop click closes and restores trigger focus
|
|
---
|
|
duration_ms: 78.840495
|
|
type: 'test'
|
|
...
|
|
# Subtest: EditModal visibility toggle updates button state
|
|
ok 6 - EditModal visibility toggle updates button state
|
|
---
|
|
duration_ms: 77.067618
|
|
type: 'test'
|
|
...
|
|
# Subtest: RevertModal Escape closes and restores trigger focus
|
|
ok 7 - RevertModal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 48.592411
|
|
type: 'test'
|
|
...
|
|
# Subtest: static modal helper toggles accessibility hooks
|
|
ok 8 - static modal helper toggles accessibility hooks
|
|
---
|
|
duration_ms: 12.528134
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 701.315884
|
|
|
|
→ Running tests/moderation-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted report summaries respect personal blocks and admin lists
|
|
ok 1 - trusted report summaries respect personal blocks and admin lists
|
|
---
|
|
duration_ms: 4.875666
|
|
type: 'test'
|
|
...
|
|
# Subtest: user block updates recompute summaries and emit notifications
|
|
ok 2 - user block updates recompute summaries and emit notifications
|
|
---
|
|
duration_ms: 4.346469
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation thresholds emit logger hooks only when crossing
|
|
ok 3 - moderation thresholds emit logger hooks only when crossing
|
|
---
|
|
duration_ms: 1.694083
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted mute aggregation tracks F1 mute lists
|
|
ok 4 - trusted mute aggregation tracks F1 mute lists
|
|
---
|
|
duration_ms: 1.605515
|
|
type: 'test'
|
|
...
|
|
# Subtest: viewer mute list publishes and updates aggregation
|
|
ok 5 - viewer mute list publishes and updates aggregation
|
|
---
|
|
duration_ms: 2.562621
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2022.278952
|
|
|
|
→ Running tests/moderation-stage.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage enforces admin lists without whitelist bypass
|
|
ok 1 - moderation stage enforces admin lists without whitelist bypass
|
|
---
|
|
duration_ms: 4.222495
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage annotates trusted mute metadata
|
|
ok 2 - moderation stage annotates trusted mute metadata
|
|
---
|
|
duration_ms: 0.947745
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage applies provided thresholds
|
|
ok 3 - moderation stage applies provided thresholds
|
|
---
|
|
duration_ms: 1.059759
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime threshold changes
|
|
ok 4 - moderation stage respects runtime threshold changes
|
|
---
|
|
duration_ms: 2.354753
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports function-based threshold resolvers
|
|
ok 5 - moderation stage supports function-based threshold resolvers
|
|
---
|
|
duration_ms: 0.741691
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage propagates whitelist, muters, and threshold updates
|
|
ok 6 - moderation stage propagates whitelist, muters, and threshold updates
|
|
---
|
|
duration_ms: 1.175476
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage blurs viewer-muted authors
|
|
ok 7 - moderation stage blurs viewer-muted authors
|
|
---
|
|
duration_ms: 0.608474
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage clears cached reporters and muters after service signals
|
|
ok 8 - moderation stage clears cached reporters and muters after service signals
|
|
---
|
|
duration_ms: 0.975672
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 27.492455
|
|
|
|
→ Running tests/moderation/hide-thresholds.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation stage hides videos muted by trusted when threshold met
|
|
ok 1 - moderation stage hides videos muted by trusted when threshold met
|
|
---
|
|
duration_ms: 4.166423
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides videos when trusted reports exceed threshold
|
|
ok 2 - moderation stage hides videos when trusted reports exceed threshold
|
|
---
|
|
duration_ms: 0.649511
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage respects runtime hide threshold changes
|
|
ok 3 - moderation stage respects runtime hide threshold changes
|
|
---
|
|
duration_ms: 0.908635
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage supports trusted mute hide resolver functions
|
|
ok 4 - moderation stage supports trusted mute hide resolver functions
|
|
---
|
|
duration_ms: 1.157893
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage bypasses hard hides on home feed
|
|
ok 5 - moderation stage bypasses hard hides on home feed
|
|
---
|
|
duration_ms: 0.59353
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation stage hides admin-whitelisted videos once thresholds fire
|
|
ok 6 - moderation stage hides admin-whitelisted videos once thresholds fire
|
|
---
|
|
duration_ms: 0.705574
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.303397
|
|
|
|
→ Running tests/moderation/submit-report.test.mjs
|
|
TAP version 13
|
|
# Subtest: submitReport emits NIP-56 compliant report tags
|
|
ok 1 - submitReport emits NIP-56 compliant report tags
|
|
---
|
|
duration_ms: 11.88155
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.128461
|
|
|
|
→ Running tests/moderation/trust-seeds.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: default trust seeds derive from config
|
|
ok 1 - default trust seeds derive from config
|
|
---
|
|
duration_ms: 2.377088
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted mute counts
|
|
ok 2 - trusted seeds contribute to trusted mute counts
|
|
---
|
|
duration_ms: 4.277817
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seeds contribute to trusted report counts
|
|
ok 3 - trusted seeds contribute to trusted report counts
|
|
---
|
|
duration_ms: 3.799809
|
|
type: 'test'
|
|
...
|
|
# Subtest: trusted seed updates recompute guest report summaries
|
|
ok 4 - trusted seed updates recompute guest report summaries
|
|
---
|
|
duration_ms: 1.217263
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderator seeds populate trusted contacts
|
|
ok 5 - moderator seeds populate trusted contacts
|
|
---
|
|
duration_ms: 1.008117
|
|
type: 'test'
|
|
...
|
|
# Subtest: bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
ok 6 - bootstrap seeds track editor roster and ignore whitelist-only changes
|
|
---
|
|
duration_ms: 86.188688
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3606.08008
|
|
|
|
→ Running tests/moderation/trusted-mute-lists.test.mjs
|
|
TAP version 13
|
|
# Subtest: trusted mute lists from seeds hide authors for anonymous viewers
|
|
ok 1 - trusted mute lists from seeds hide authors for anonymous viewers
|
|
---
|
|
duration_ms: 13.8468
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2016.291384
|
|
|
|
→ Running tests/moderation/trusted-report-count.test.mjs
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
[bitvid] [moderationService] moderation threshold crossed
|
|
TAP version 13
|
|
# Subtest: trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
ok 1 - trustedReportCount dedupes multiple reports from the same trusted reporter
|
|
---
|
|
duration_ms: 6.237753
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount ignores reports from muted or blocked reporters
|
|
ok 2 - trustedReportCount ignores reports from muted or blocked reporters
|
|
---
|
|
duration_ms: 2.637158
|
|
type: 'test'
|
|
...
|
|
# Subtest: blocking and unblocking reporters recomputes trusted summaries
|
|
ok 3 - blocking and unblocking reporters recomputes trusted summaries
|
|
---
|
|
duration_ms: 3.297351
|
|
type: 'test'
|
|
...
|
|
# Subtest: trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
ok 4 - trustedReportCount only counts eligible F1 reporters and admin whitelist
|
|
---
|
|
duration_ms: 2.445202
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2019.888648
|
|
|
|
→ Running tests/moderation/video-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoCard renders moderation badges and respects viewer override
|
|
ok 1 - VideoCard renders moderation badges and respects viewer override
|
|
---
|
|
duration_ms: 146.47077
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides content when hide metadata is present and override unmasks it
|
|
ok 2 - VideoCard hides content when hide metadata is present and override unmasks it
|
|
---
|
|
duration_ms: 36.225467
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs viewer-muted creators
|
|
ok 3 - VideoCard blurs viewer-muted creators
|
|
---
|
|
duration_ms: 19.662066
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
ok 4 - VideoCard blurs thumbnails when trusted mute triggers without reports
|
|
---
|
|
duration_ms: 17.55489
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard block action restores trusted mute hide state after override
|
|
ok 5 - VideoCard block action restores trusted mute hide state after override
|
|
---
|
|
duration_ms: 31.392547
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyModerationContextDatasets clears blur when overrides are active
|
|
ok 6 - applyModerationContextDatasets clears blur when overrides are active
|
|
---
|
|
duration_ms: 9.986833
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
ok 7 - buildModerationBadgeText returns trusted contact block copy when autoplay block and trusted mute combine
|
|
---
|
|
duration_ms: 0.207713
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 279.762283
|
|
|
|
→ Running tests/more-menu-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: copy-link action writes to clipboard and shows success
|
|
ok 1 - copy-link action writes to clipboard and shows success
|
|
---
|
|
duration_ms: 3.181584
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author requires moderator access and refreshes subscriptions
|
|
ok 2 - blacklist-author requires moderator access and refreshes subscriptions
|
|
---
|
|
duration_ms: 0.587822
|
|
type: 'test'
|
|
...
|
|
# Subtest: blacklist-author shows error when no moderator session is available
|
|
ok 3 - blacklist-author shows error when no moderator session is available
|
|
---
|
|
duration_ms: 0.458898
|
|
type: 'test'
|
|
...
|
|
# Subtest: block-author updates user blocks, reloads videos, and refreshes feeds
|
|
ok 4 - block-author updates user blocks, reloads videos, and refreshes feeds
|
|
---
|
|
duration_ms: 0.72663
|
|
type: 'test'
|
|
...
|
|
# Subtest: mute-author updates viewer mute list and refreshes feeds
|
|
ok 5 - mute-author updates viewer mute list and refreshes feeds
|
|
---
|
|
duration_ms: 0.606921
|
|
type: 'test'
|
|
...
|
|
# Subtest: unmute-author removes creators from viewer mute list
|
|
ok 6 - unmute-author removes creators from viewer mute list
|
|
---
|
|
duration_ms: 0.60702
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.934671
|
|
|
|
→ Running tests/nip07-concurrency.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Concurrency Queue
|
|
# Subtest: runs up to 5 tasks concurrently
|
|
ok 1 - runs up to 5 tasks concurrently
|
|
---
|
|
duration_ms: 304.18965
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects priority
|
|
ok 2 - respects priority
|
|
---
|
|
duration_ms: 151.618331
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - NIP-07 Concurrency Queue
|
|
---
|
|
duration_ms: 458.009565
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 465.949975
|
|
|
|
→ Running tests/nip71-base-event-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
ok 1 - 30078 events carry nip71 metadata tags and hydrate fallback metadata
|
|
---
|
|
duration_ms: 5.918098
|
|
type: 'test'
|
|
...
|
|
# Subtest: imeta tags lower-case mime values
|
|
ok 2 - imeta tags lower-case mime values
|
|
---
|
|
duration_ms: 0.5361
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.325216
|
|
|
|
→ Running tests/nip71-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildNip71VideoEvent assembles rich metadata
|
|
ok 1 - buildNip71VideoEvent assembles rich metadata
|
|
---
|
|
duration_ms: 3.936632
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent falls back to summary and selects kind
|
|
ok 2 - buildNip71VideoEvent falls back to summary and selects kind
|
|
---
|
|
duration_ms: 0.326069
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent attaches pointer tags
|
|
ok 3 - buildNip71VideoEvent attaches pointer tags
|
|
---
|
|
duration_ms: 0.456389
|
|
type: 'test'
|
|
...
|
|
# Subtest: extractNip71MetadataFromTags parses metadata and pointers
|
|
ok 4 - extractNip71MetadataFromTags parses metadata and pointers
|
|
---
|
|
duration_ms: 1.476276
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.699707
|
|
|
|
→ Running tests/nip71-form-manager.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectSection sanitizes and deduplicates hashtags
|
|
ok 1 - collectSection sanitizes and deduplicates hashtags
|
|
---
|
|
duration_ms: 116.440638
|
|
type: 'test'
|
|
...
|
|
# Subtest: hydrateSection renders sanitized hashtags with prefix
|
|
ok 2 - hydrateSection renders sanitized hashtags with prefix
|
|
---
|
|
duration_ms: 21.919075
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 149.739796
|
|
|
|
→ Running tests/nostr-login-permissions.test.mjs
|
|
TAP version 13
|
|
# Subtest: NIP-07 Login Permissions
|
|
# Subtest: NIP-07 login requests decrypt permissions upfront
|
|
ok 1 - NIP-07 login requests decrypt permissions upfront
|
|
---
|
|
duration_ms: 5.449243
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 decrypt reuses cached extension permissions
|
|
ok 2 - NIP-07 decrypt reuses cached extension permissions
|
|
---
|
|
duration_ms: 1.907825
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login falls back when structured permissions fail
|
|
ok 3 - NIP-07 login falls back when structured permissions fail
|
|
---
|
|
duration_ms: 1.468246
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login supports extensions that only allow enable() without payload
|
|
ok 4 - NIP-07 login supports extensions that only allow enable() without payload
|
|
---
|
|
duration_ms: 1.658281
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login quickly retries when a permission payload stalls
|
|
ok 5 - NIP-07 login quickly retries when a permission payload stalls
|
|
---
|
|
duration_ms: 83.239776
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login does not wait for deferred permission grants
|
|
ok 6 - NIP-07 login does not wait for deferred permission grants
|
|
---
|
|
duration_ms: 302.050662
|
|
type: 'test'
|
|
...
|
|
# Subtest: NIP-07 login surfaces enable permission errors
|
|
ok 7 - NIP-07 login surfaces enable permission errors
|
|
---
|
|
duration_ms: 1.445326
|
|
type: 'test'
|
|
...
|
|
# Subtest: runNip07WithRetry respects timeout without retry multiplier
|
|
ok 8 - runNip07WithRetry respects timeout without retry multiplier
|
|
---
|
|
duration_ms: 61.099759
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - NIP-07 Login Permissions
|
|
---
|
|
duration_ms: 460.430503
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 469.188097
|
|
|
|
→ Running tests/nostr-nip46-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
ok 1 - Nip46RequestQueue: processes tasks in FIFO order for same priority
|
|
---
|
|
duration_ms: 2.493489
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects priority levels
|
|
ok 2 - Nip46RequestQueue: respects priority levels
|
|
---
|
|
duration_ms: 11.046333
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: respects minDelayMs
|
|
ok 3 - Nip46RequestQueue: respects minDelayMs
|
|
---
|
|
duration_ms: 102.174668
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RequestQueue: clear() rejects pending tasks
|
|
ok 4 - Nip46RequestQueue: clear() rejects pending tasks
|
|
---
|
|
duration_ms: 101.586057
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 226.306623
|
|
|
|
→ Running tests/nostr-private-key-signer.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nostr Private Key Signer
|
|
# Subtest: registerPrivateKeySigner exposes nip04 helpers
|
|
ok 1 - registerPrivateKeySigner exposes nip04 helpers
|
|
---
|
|
duration_ms: 156.571491
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Nostr Private Key Signer
|
|
---
|
|
duration_ms: 158.372572
|
|
type: 'suite'
|
|
...
|
|
|
|
→ Running tests/nostr-send-direct-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: sendDirectMessage succeeds with private key signer and no extension
|
|
ok 1 - sendDirectMessage succeeds with private key signer and no extension
|
|
---
|
|
duration_ms: 237.835951
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-service-access-control.test.mjs
|
|
TAP version 13
|
|
# Subtest: shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
ok 1 - shouldIncludeVideo returns true for whitelist author when npubEncode throws
|
|
---
|
|
duration_ms: 2.849139
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
ok 2 - shouldIncludeVideo rejects blacklisted authors provided as npub
|
|
---
|
|
duration_ms: 2.280372
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
ok 3 - shouldIncludeVideo rejects blacklisted authors provided as hex when npubEncode throws
|
|
---
|
|
duration_ms: 57.12207
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo always returns true for the viewer's own video
|
|
ok 4 - shouldIncludeVideo always returns true for the viewer's own video
|
|
---
|
|
duration_ms: 0.373945
|
|
type: 'test'
|
|
...
|
|
# Subtest: shouldIncludeVideo allows access when access control would deny the author
|
|
ok 5 - shouldIncludeVideo allows access when access control would deny the author
|
|
---
|
|
duration_ms: 0.409463
|
|
type: 'test'
|
|
...
|
|
|
|
→ Running tests/nostr-session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: isSubtleCryptoAvailable returns true in test env
|
|
ok 1 - isSubtleCryptoAvailable returns true in test env
|
|
---
|
|
duration_ms: 2.069036
|
|
type: 'test'
|
|
...
|
|
# Subtest: generateRandomBytes returns correct length
|
|
ok 2 - generateRandomBytes returns correct length
|
|
---
|
|
duration_ms: 1.506034
|
|
type: 'test'
|
|
...
|
|
# Subtest: encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
ok 3 - encryptSessionPrivateKey and decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 295.988305
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptSessionPrivateKey fails with wrong passphrase
|
|
ok 4 - decryptSessionPrivateKey fails with wrong passphrase
|
|
---
|
|
duration_ms: 293.70858
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor writes to localStorage and IndexedDB
|
|
ok 5 - persistSessionActor writes to localStorage and IndexedDB
|
|
---
|
|
duration_ms: 147.587904
|
|
type: 'test'
|
|
...
|
|
# Subtest: readStoredSessionActorEntry retrieves from localStorage
|
|
ok 6 - readStoredSessionActorEntry retrieves from localStorage
|
|
---
|
|
duration_ms: 151.931661
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes from localStorage
|
|
ok 7 - clearStoredSessionActor removes from localStorage
|
|
---
|
|
duration_ms: 1.228558
|
|
type: 'test'
|
|
...
|
|
# Subtest: helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
ok 8 - helper: arrayBufferToBase64 and base64ToUint8Array roundtrip
|
|
---
|
|
duration_ms: 2.41283
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 905.760455
|
|
|
|
→ Running tests/nostr-signer-race.test.mjs
|
|
TAP version 13
|
|
# Subtest: ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
ok 1 - ensureActiveSignerForPubkey prefers concurrent login over late extension injection
|
|
---
|
|
duration_ms: 104.88634
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 112.562665
|
|
|
|
→ Running tests/nostr/adapters.test.mjs
|
|
TAP version 13
|
|
# Subtest: createNsecAdapter wires signing and cipher capabilities
|
|
ok 1 - createNsecAdapter wires signing and cipher capabilities
|
|
---
|
|
duration_ms: 66.397285
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip07Adapter maps extension methods and permissions
|
|
ok 2 - createNip07Adapter maps extension methods and permissions
|
|
---
|
|
duration_ms: 3.16865
|
|
type: 'test'
|
|
...
|
|
# Subtest: createNip46Adapter wraps the remote signer client
|
|
ok 3 - createNip46Adapter wraps the remote signer client
|
|
---
|
|
duration_ms: 0.656014
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 82.813265
|
|
|
|
→ Running tests/nostr/cachePolicies.test.mjs
|
|
TAP version 13
|
|
# Subtest: CACHE_POLICIES structure
|
|
ok 1 - CACHE_POLICIES structure
|
|
---
|
|
duration_ms: 1.606789
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_POST policy
|
|
ok 2 - VIDEO_POST policy
|
|
---
|
|
duration_ms: 0.253312
|
|
type: 'test'
|
|
...
|
|
# Subtest: WATCH_HISTORY policy
|
|
ok 3 - WATCH_HISTORY policy
|
|
---
|
|
duration_ms: 0.16912
|
|
type: 'test'
|
|
...
|
|
# Subtest: SUBSCRIPTION_LIST policy
|
|
ok 4 - SUBSCRIPTION_LIST policy
|
|
---
|
|
duration_ms: 0.20119
|
|
type: 'test'
|
|
...
|
|
# Subtest: VIDEO_COMMENT policy
|
|
ok 5 - VIDEO_COMMENT policy
|
|
---
|
|
duration_ms: 0.260379
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.908365
|
|
|
|
→ Running tests/nostr/client.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient
|
|
# Subtest: Initialization
|
|
# Subtest: should initialize with default state
|
|
ok 1 - should initialize with default state
|
|
---
|
|
duration_ms: 3.302502
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - Initialization
|
|
---
|
|
duration_ms: 4.339052
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchListIncrementally
|
|
# Subtest: should fetch events and deduplicate results
|
|
ok 1 - should fetch events and deduplicate results
|
|
---
|
|
duration_ms: 2.893986
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle incremental updates using lastSeen
|
|
ok 2 - should handle incremental updates using lastSeen
|
|
---
|
|
duration_ms: 1.282951
|
|
type: 'test'
|
|
...
|
|
# Subtest: should override lastSeen with explicit since parameter
|
|
ok 3 - should override lastSeen with explicit since parameter
|
|
---
|
|
duration_ms: 1.024114
|
|
type: 'test'
|
|
...
|
|
# Subtest: should force full fetch if since is 0
|
|
ok 4 - should force full fetch if since is 0
|
|
---
|
|
duration_ms: 0.902515
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - fetchListIncrementally
|
|
---
|
|
duration_ms: 6.59843
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeVideos
|
|
# Subtest: should subscribe to video events and buffer them
|
|
ok 1 - should subscribe to video events and buffer them
|
|
---
|
|
duration_ms: 301.939283
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - subscribeVideos
|
|
---
|
|
duration_ms: 302.705577
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideos
|
|
# Subtest: should delegate to subscribeVideos and return result on eose
|
|
ok 1 - should delegate to subscribeVideos and return result on eose
|
|
---
|
|
duration_ms: 2.416791
|
|
type: 'test'
|
|
...
|
|
# Subtest: should respect since parameter if provided
|
|
ok 2 - should respect since parameter if provided
|
|
---
|
|
duration_ms: 2.57845
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - fetchVideos
|
|
---
|
|
duration_ms: 5.483083
|
|
type: 'suite'
|
|
...
|
|
# Subtest: publishVideo
|
|
# Subtest: should throw if not logged in
|
|
ok 1 - should throw if not logged in
|
|
---
|
|
duration_ms: 2.272658
|
|
type: 'test'
|
|
...
|
|
# Subtest: should sign and publish a valid video
|
|
ok 2 - should sign and publish a valid video
|
|
---
|
|
duration_ms: 3.476408
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - publishVideo
|
|
---
|
|
duration_ms: 5.922335
|
|
type: 'suite'
|
|
...
|
|
# Subtest: editVideo
|
|
# Subtest: should throw if not owner
|
|
ok 1 - should throw if not owner
|
|
---
|
|
duration_ms: 0.707146
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 6 - editVideo
|
|
---
|
|
duration_ms: 0.815506
|
|
type: 'suite'
|
|
...
|
|
# Subtest: revertVideo
|
|
# Subtest: should publish a deletion marker event
|
|
ok 1 - should publish a deletion marker event
|
|
---
|
|
duration_ms: 0.492616
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 7 - revertVideo
|
|
---
|
|
duration_ms: 0.583548
|
|
type: 'suite'
|
|
...
|
|
1..7
|
|
ok 1 - NostrClient
|
|
---
|
|
duration_ms: 327.835749
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 8
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 550.386695
|
|
|
|
→ Running tests/nostr/comment-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishComment prefers active signer when available
|
|
ok 1 - publishComment prefers active signer when available
|
|
---
|
|
duration_ms: 7.739237
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment rejects when active signer is unavailable
|
|
ok 2 - publishComment rejects when active signer is unavailable
|
|
---
|
|
duration_ms: 0.440536
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment accepts legacy targets with only an event id
|
|
ok 3 - publishComment accepts legacy targets with only an event id
|
|
---
|
|
duration_ms: 1.418613
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment derives root and parent metadata from parent comment tags
|
|
ok 4 - publishComment derives root and parent metadata from parent comment tags
|
|
---
|
|
duration_ms: 1.927561
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches comments even when tag casing and whitespace differ
|
|
ok 5 - listVideoComments matches comments even when tag casing and whitespace differ
|
|
---
|
|
duration_ms: 2.392869
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments matches uppercase definition addresses without lowering
|
|
ok 6 - listVideoComments matches uppercase definition addresses without lowering
|
|
---
|
|
duration_ms: 1.194715
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishComment emits only uppercase video event pointer when address and parent are absent
|
|
ok 7 - publishComment emits only uppercase video event pointer when address and parent are absent
|
|
---
|
|
duration_ms: 0.967616
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
ok 8 - listVideoComments builds filters with uppercase roots plus legacy fallbacks
|
|
---
|
|
duration_ms: 1.343513
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments emits uppercase root filters when only the identifier is known
|
|
ok 9 - listVideoComments emits uppercase root filters when only the identifier is known
|
|
---
|
|
duration_ms: 1.358226
|
|
type: 'test'
|
|
...
|
|
# Subtest: listVideoComments supports legacy targets without a definition address
|
|
ok 10 - listVideoComments supports legacy targets without a definition address
|
|
---
|
|
duration_ms: 1.062008
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
ok 11 - subscribeVideoComments forwards matching events and cleans up unsubscribe
|
|
---
|
|
duration_ms: 9.88196
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeVideoComments supports video targets without a definition address
|
|
ok 12 - subscribeVideoComments supports video targets without a definition address
|
|
---
|
|
duration_ms: 0.774275
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 39.999373
|
|
|
|
→ Running tests/nostr/countDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: countDiagnostics
|
|
# Subtest: isVerboseDiagnosticsEnabled
|
|
# Subtest: should return true by default (due to override)
|
|
ok 1 - should return true by default (due to override)
|
|
---
|
|
duration_ms: 1.191442
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
ok 2 - should return false if window.__BITVID_VERBOSE_DEV_MODE__ is false
|
|
---
|
|
duration_ms: 0.464356
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
ok 3 - should return true if window.__BITVID_VERBOSE_DEV_MODE__ is true
|
|
---
|
|
duration_ms: 0.393215
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to isVerboseDevMode if window flag is not boolean
|
|
ok 4 - should fall back to isVerboseDevMode if window flag is not boolean
|
|
---
|
|
duration_ms: 0.496704
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - isVerboseDiagnosticsEnabled
|
|
---
|
|
duration_ms: 3.52344
|
|
type: 'suite'
|
|
...
|
|
# Subtest: logRelayCountFailure
|
|
# Subtest: should log warning for new relay URL
|
|
ok 1 - should log warning for new relay URL
|
|
---
|
|
duration_ms: 1.154547
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress 'Failed to connect to relay' errors
|
|
ok 2 - should suppress 'Failed to connect to relay' errors
|
|
---
|
|
duration_ms: 0.332382
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throttle duplicate warnings for the same relay
|
|
ok 3 - should throttle duplicate warnings for the same relay
|
|
---
|
|
duration_ms: 0.389953
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle empty or non-string relay URLs
|
|
ok 4 - should handle empty or non-string relay URLs
|
|
---
|
|
duration_ms: 0.5595
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - logRelayCountFailure
|
|
---
|
|
duration_ms: 2.853403
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Other Loggers
|
|
# Subtest: should log timeout cleanup failure once
|
|
ok 1 - should log timeout cleanup failure once
|
|
---
|
|
duration_ms: 0.472716
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log rebroadcast failure once
|
|
ok 2 - should log rebroadcast failure once
|
|
---
|
|
duration_ms: 0.337619
|
|
type: 'test'
|
|
...
|
|
# Subtest: should log view count failure once
|
|
ok 3 - should log view count failure once
|
|
---
|
|
duration_ms: 0.328998
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - Other Loggers
|
|
---
|
|
duration_ms: 1.359022
|
|
type: 'suite'
|
|
...
|
|
# Subtest: Verbose Mode Disabled
|
|
# Subtest: should not log even for new keys when disabled
|
|
ok 1 - should not log even for new keys when disabled
|
|
---
|
|
duration_ms: 0.34703
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not consume throttle key when disabled
|
|
ok 2 - should not consume throttle key when disabled
|
|
---
|
|
duration_ms: 0.324851
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - Verbose Mode Disabled
|
|
---
|
|
duration_ms: 0.848176
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - countDiagnostics
|
|
---
|
|
duration_ms: 13.295956
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 5
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 37.458378
|
|
|
|
→ Running tests/nostr/decryptionSchemeCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptionSchemeCache
|
|
# Subtest: stores and retrieves a scheme
|
|
ok 1 - stores and retrieves a scheme
|
|
---
|
|
duration_ms: 1.67924
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null for unknown pubkey
|
|
ok 2 - returns null for unknown pubkey
|
|
---
|
|
duration_ms: 0.424085
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 3 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.649154
|
|
type: 'test'
|
|
...
|
|
# Subtest: expires entries after TTL (2 hours)
|
|
ok 4 - expires entries after TTL (2 hours)
|
|
---
|
|
duration_ms: 0.636253
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not expire entries before TTL
|
|
ok 5 - does not expire entries before TTL
|
|
---
|
|
duration_ms: 0.276392
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears cache
|
|
ok 6 - clears cache
|
|
---
|
|
duration_ms: 0.275796
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - decryptionSchemeCache
|
|
---
|
|
duration_ms: 5.723898
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.79659
|
|
|
|
→ Running tests/nostr/defaultClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: Default NostrClient
|
|
# Subtest: should be an instance of NostrClient
|
|
ok 1 - should be an instance of NostrClient
|
|
---
|
|
duration_ms: 1.290598
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be configured with default relays
|
|
ok 2 - should be configured with default relays
|
|
---
|
|
duration_ms: 1.405299
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default read relays
|
|
ok 3 - should be initialized with default read relays
|
|
---
|
|
duration_ms: 0.290566
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be initialized with default write relays
|
|
ok 4 - should be initialized with default write relays
|
|
---
|
|
duration_ms: 0.340415
|
|
type: 'test'
|
|
...
|
|
# Subtest: should be registered as the default client
|
|
ok 5 - should be registered as the default client
|
|
---
|
|
duration_ms: 0.365683
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Default NostrClient
|
|
---
|
|
duration_ms: 6.011581
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.092569
|
|
|
|
→ Running tests/nostr/dm-direct-message-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: DM relay duplication is deduped
|
|
ok 1 - DM relay duplication is deduped
|
|
---
|
|
duration_ms: 152.254364
|
|
type: 'test'
|
|
...
|
|
# Subtest: out-of-order DM delivery keeps newest messages first
|
|
ok 2 - out-of-order DM delivery keeps newest messages first
|
|
---
|
|
duration_ms: 87.550594
|
|
type: 'test'
|
|
...
|
|
# Subtest: DM reconnect replays do not duplicate messages or reset seen state
|
|
ok 3 - DM reconnect replays do not duplicate messages or reset seen state
|
|
---
|
|
duration_ms: 173.466926
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 421.534424
|
|
|
|
→ Running tests/nostr/dmDecryptDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptDiagnostics
|
|
# Subtest: summarizeDmEventForLog
|
|
# Subtest: should return a default object when event is null or undefined
|
|
ok 1 - should return a default object when event is null or undefined
|
|
---
|
|
duration_ms: 1.904943
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return a default object when event is not an object
|
|
ok 2 - should return a default object when event is not an object
|
|
---
|
|
duration_ms: 0.253139
|
|
type: 'test'
|
|
...
|
|
# Subtest: should summarize a valid event correctly
|
|
ok 3 - should summarize a valid event correctly
|
|
---
|
|
duration_ms: 0.305567
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite created_at
|
|
ok 4 - should handle non-finite created_at
|
|
---
|
|
duration_ms: 0.230721
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle non-finite kind
|
|
ok 5 - should handle non-finite kind
|
|
---
|
|
duration_ms: 0.174004
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid content
|
|
ok 6 - should handle missing or invalid content
|
|
---
|
|
duration_ms: 0.224684
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing or invalid tags
|
|
ok 7 - should handle missing or invalid tags
|
|
---
|
|
duration_ms: 0.31593
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - summarizeDmEventForLog
|
|
---
|
|
duration_ms: 4.645359
|
|
type: 'suite'
|
|
...
|
|
# Subtest: sanitizeDecryptError
|
|
# Subtest: should return null when error is null or undefined
|
|
ok 1 - should return null when error is null or undefined
|
|
---
|
|
duration_ms: 0.430937
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle string errors
|
|
ok 2 - should handle string errors
|
|
---
|
|
duration_ms: 0.407288
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with standard properties
|
|
ok 3 - should handle Error objects with standard properties
|
|
---
|
|
duration_ms: 0.339302
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with missing properties
|
|
ok 4 - should handle Error objects with missing properties
|
|
---
|
|
duration_ms: 0.162054
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle Error objects with non-string properties
|
|
ok 5 - should handle Error objects with non-string properties
|
|
---
|
|
duration_ms: 0.2412
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - sanitizeDecryptError
|
|
---
|
|
duration_ms: 2.022074
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - dmDecryptDiagnostics
|
|
---
|
|
duration_ms: 7.597144
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.33747
|
|
|
|
→ Running tests/nostr/dmDecryptorPreference.test.mjs
|
|
TAP version 13
|
|
# Subtest: decryptDM prefers nip44 decryptors when available
|
|
ok 1 - decryptDM prefers nip44 decryptors when available
|
|
---
|
|
duration_ms: 4.362599
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptDM falls back to nip04 when nip44 fails
|
|
ok 2 - decryptDM falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 0.749779
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.046231
|
|
|
|
→ Running tests/nostr/dmDecryptWorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmDecryptWorkerClient
|
|
# Subtest: should support worker environment
|
|
ok 1 - should support worker environment
|
|
---
|
|
duration_ms: 5.351929
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker is unavailable
|
|
ok 2 - should reject if Worker is unavailable
|
|
---
|
|
duration_ms: 2.937653
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if inputs are invalid
|
|
ok 3 - should reject if inputs are invalid
|
|
---
|
|
duration_ms: 2.693944
|
|
type: 'test'
|
|
...
|
|
# Subtest: should successfully decrypt message
|
|
ok 4 - should successfully decrypt message
|
|
---
|
|
duration_ms: 8.590352
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error response
|
|
ok 5 - should handle worker error response
|
|
---
|
|
duration_ms: 3.380296
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error event
|
|
ok 6 - should handle worker error event
|
|
---
|
|
duration_ms: 4.418486
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 7 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 101.684253
|
|
type: 'test'
|
|
...
|
|
# Subtest: should initialize worker lazily and reuse instance
|
|
ok 8 - should initialize worker lazily and reuse instance
|
|
---
|
|
duration_ms: 3.035947
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recreate worker if creation fails
|
|
ok 9 - should recreate worker if creation fails
|
|
---
|
|
duration_ms: 1.664401
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
ok 1 - dmDecryptWorkerClient
|
|
---
|
|
duration_ms: 136.631355
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 1
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 145.967127
|
|
|
|
→ Running tests/nostr/dmSignalEvents.test.mjs
|
|
TAP version 13
|
|
# Subtest: dmSignalEvents
|
|
# Subtest: publishDmReadReceipt should succeed
|
|
ok 1 - publishDmReadReceipt should succeed
|
|
---
|
|
duration_ms: 7.271861
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmReadReceipt should fail if session actor
|
|
ok 2 - publishDmReadReceipt should fail if session actor
|
|
---
|
|
duration_ms: 0.978727
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishDmTypingIndicator should succeed
|
|
ok 3 - publishDmTypingIndicator should succeed
|
|
---
|
|
duration_ms: 7.394267
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail if no signer
|
|
ok 4 - should fail if no signer
|
|
---
|
|
duration_ms: 1.240713
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - dmSignalEvents
|
|
---
|
|
duration_ms: 131.050189
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 148.758229
|
|
|
|
→ Running tests/nostr/edit-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: editVideo preserves existing d tag
|
|
ok 1 - editVideo preserves existing d tag
|
|
---
|
|
duration_ms: 11.771854
|
|
type: 'test'
|
|
...
|
|
# Subtest: editVideo falls back to base event id when d tag missing
|
|
ok 2 - editVideo falls back to base event id when d tag missing
|
|
---
|
|
duration_ms: 2.330509
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.285968
|
|
|
|
→ Running tests/nostr/eventsCacheStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsCacheStore
|
|
# Subtest: persistSnapshot should store events and tombstones
|
|
ok 1 - persistSnapshot should store events and tombstones
|
|
---
|
|
duration_ms: 15.901518
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should only update changed items
|
|
ok 2 - persistSnapshot should only update changed items
|
|
---
|
|
duration_ms: 3.702583
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should delete removed items
|
|
ok 3 - persistSnapshot should delete removed items
|
|
---
|
|
duration_ms: 3.072263
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSnapshot should respect dirty keys optimization
|
|
ok 4 - persistSnapshot should respect dirty keys optimization
|
|
---
|
|
duration_ms: 2.526685
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - EventsCacheStore
|
|
---
|
|
duration_ms: 26.995104
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.824738
|
|
|
|
→ Running tests/nostr/eventsMap.test.mjs
|
|
TAP version 13
|
|
# Subtest: EventsMap functionality
|
|
# Subtest: indexes events by author on set
|
|
ok 1 - indexes events by author on set
|
|
---
|
|
duration_ms: 1.139381
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on delete
|
|
ok 2 - updates index on delete
|
|
---
|
|
duration_ms: 0.347519
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates index on overwrite with different object
|
|
ok 3 - updates index on overwrite with different object
|
|
---
|
|
duration_ms: 0.239236
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears index on clear
|
|
ok 4 - clears index on clear
|
|
---
|
|
duration_ms: 0.295684
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes pubkeys
|
|
ok 5 - normalizes pubkeys
|
|
---
|
|
duration_ms: 0.28546
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-event objects gracefully
|
|
ok 6 - handles non-event objects gracefully
|
|
---
|
|
duration_ms: 0.266836
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - EventsMap functionality
|
|
---
|
|
duration_ms: 5.959144
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.098801
|
|
|
|
→ Running tests/nostr/integration-remote-flow.test.mjs
|
|
TAP version 13
|
|
# Subtest: nostr login + remote signing + publish + watch history integration
|
|
ok 1 - nostr login + remote signing + publish + watch history integration
|
|
---
|
|
duration_ms: 151.004695
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 608.551431
|
|
|
|
→ Running tests/nostr/maxListenerDiagnostics.test.mjs
|
|
TAP version 13
|
|
# Subtest: maxListenerDiagnostics
|
|
# Subtest: collectCandidateStrings
|
|
# Subtest: should return empty array for null/undefined/falsy
|
|
ok 1 - should return empty array for null/undefined/falsy
|
|
---
|
|
duration_ms: 1.828508
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return array with string for string input
|
|
ok 2 - should return array with string for string input
|
|
---
|
|
duration_ms: 0.577507
|
|
type: 'test'
|
|
...
|
|
# Subtest: should extract relevant fields from object
|
|
ok 3 - should extract relevant fields from object
|
|
---
|
|
duration_ms: 0.513225
|
|
type: 'test'
|
|
...
|
|
# Subtest: should ignore non-string fields in object
|
|
ok 4 - should ignore non-string fields in object
|
|
---
|
|
duration_ms: 0.585214
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - collectCandidateStrings
|
|
---
|
|
duration_ms: 4.37033
|
|
type: 'suite'
|
|
...
|
|
# Subtest: shouldSuppressWarning
|
|
# Subtest: should NOT suppress anything if verbose mode is enabled
|
|
ok 1 - should NOT suppress anything if verbose mode is enabled
|
|
---
|
|
duration_ms: 0.798934
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by code string
|
|
ok 2 - should suppress warning by code string
|
|
---
|
|
duration_ms: 0.293546
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object code property
|
|
ok 3 - should suppress warning by object code property
|
|
---
|
|
duration_ms: 0.232181
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by message snippet
|
|
ok 4 - should suppress warning by message snippet
|
|
---
|
|
duration_ms: 0.351418
|
|
type: 'test'
|
|
...
|
|
# Subtest: should suppress warning by object message property snippet
|
|
ok 5 - should suppress warning by object message property snippet
|
|
---
|
|
duration_ms: 0.412323
|
|
type: 'test'
|
|
...
|
|
# Subtest: should NOT suppress unrelated warnings
|
|
ok 6 - should NOT suppress unrelated warnings
|
|
---
|
|
duration_ms: 0.341792
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle multiple arguments
|
|
ok 7 - should handle multiple arguments
|
|
---
|
|
duration_ms: 0.453239
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - shouldSuppressWarning
|
|
---
|
|
duration_ms: 3.597346
|
|
type: 'suite'
|
|
...
|
|
# Subtest: process.emitWarning patch
|
|
# Subtest: should have patched process.emitWarning
|
|
ok 1 - should have patched process.emitWarning
|
|
---
|
|
duration_ms: 0.233893
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - process.emitWarning patch
|
|
---
|
|
duration_ms: 0.361179
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - maxListenerDiagnostics
|
|
---
|
|
duration_ms: 9.968675
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 4
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.831401
|
|
|
|
→ Running tests/nostr/nip04WorkerClient.test.mjs
|
|
TAP version 13
|
|
# Subtest: nip04WorkerClient
|
|
# Subtest: should encrypt message successfully via worker
|
|
ok 1 - should encrypt message successfully via worker
|
|
---
|
|
duration_ms: 8.838152
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker returns error
|
|
ok 2 - should reject when worker returns error
|
|
---
|
|
duration_ms: 4.507451
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject when worker emits error event
|
|
ok 3 - should reject when worker emits error event
|
|
---
|
|
duration_ms: 2.999089
|
|
type: 'test'
|
|
...
|
|
# Subtest: should timeout if worker does not respond
|
|
ok 4 - should timeout if worker does not respond
|
|
---
|
|
duration_ms: 102.624673
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject immediately if inputs are missing
|
|
ok 5 - should reject immediately if inputs are missing
|
|
---
|
|
duration_ms: 2.772406
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reject if Worker API is unavailable
|
|
ok 6 - should reject if Worker API is unavailable
|
|
---
|
|
duration_ms: 2.401121
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker creation failure
|
|
ok 7 - should handle worker creation failure
|
|
---
|
|
duration_ms: 1.844685
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - nip04WorkerClient
|
|
---
|
|
duration_ms: 129.865723
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 141.654654
|
|
|
|
→ Running tests/nostr/nip07Adapter-race-condition.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip07Adapter Race Condition
|
|
# Subtest: should detect capabilities dynamically even if injected late
|
|
ok 1 - should detect capabilities dynamically even if injected late
|
|
---
|
|
duration_ms: 2.406497
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call the injected method even if added late
|
|
ok 2 - should call the injected method even if added late
|
|
---
|
|
duration_ms: 1.994747
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - Nip07Adapter Race Condition
|
|
---
|
|
duration_ms: 5.873319
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.902027
|
|
|
|
→ Running tests/nostr/nip07Permissions.test.js
|
|
TAP version 13
|
|
# Subtest: writeStoredNip07Permissions normalizes and persists granted methods
|
|
ok 1 - writeStoredNip07Permissions normalizes and persists granted methods
|
|
---
|
|
duration_ms: 2.319442
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredNip07Permissions removes persisted grants
|
|
ok 2 - clearStoredNip07Permissions removes persisted grants
|
|
---
|
|
duration_ms: 0.316584
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions retries explicit and fallback variants
|
|
ok 3 - requestEnablePermissions retries explicit and fallback variants
|
|
---
|
|
duration_ms: 1.681458
|
|
type: 'test'
|
|
...
|
|
# Subtest: requestEnablePermissions reports unavailable extension
|
|
ok 4 - requestEnablePermissions reports unavailable extension
|
|
---
|
|
duration_ms: 0.274716
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension is present
|
|
ok 5 - waitForNip07Extension resolves when extension is present
|
|
---
|
|
duration_ms: 0.460396
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension resolves when extension appears later
|
|
ok 6 - waitForNip07Extension resolves when extension appears later
|
|
---
|
|
duration_ms: 50.637764
|
|
type: 'test'
|
|
...
|
|
# Subtest: waitForNip07Extension rejects when extension never appears
|
|
ok 7 - waitForNip07Extension rejects when extension never appears
|
|
---
|
|
duration_ms: 151.270236
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 214.319398
|
|
|
|
→ Running tests/nostr/nip46Client.test.js
|
|
TAP version 13
|
|
# Subtest: Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
ok 1 - Nip46RpcClient encrypts payloads with nip44 conversation keys
|
|
---
|
|
duration_ms: 155.049883
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
ok 2 - decryptNip46PayloadWithKeys handles nip44.v2 ciphertext
|
|
---
|
|
duration_ms: 22.869918
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
ok 3 - decryptNip46PayloadWithKeys coerces structured handshake payloads
|
|
---
|
|
duration_ms: 22.353529
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
ok 4 - decryptNip46PayloadWithKeys decodes buffer-based handshake payloads
|
|
---
|
|
duration_ms: 21.862901
|
|
type: 'test'
|
|
...
|
|
# Subtest: decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
ok 5 - decryptNip46PayloadWithKeys supports nip04-style ciphertext wrappers
|
|
---
|
|
duration_ms: 29.53593
|
|
type: 'test'
|
|
...
|
|
# Subtest: parseNip46ConnectionString handles remote signer key hints
|
|
ok 6 - parseNip46ConnectionString handles remote signer key hints
|
|
---
|
|
duration_ms: 5.175287
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
ok 7 - attemptDecryptNip46HandshakePayload falls back to expected remote signer key
|
|
---
|
|
duration_ms: 41.389963
|
|
type: 'test'
|
|
...
|
|
# Subtest: attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
ok 8 - attemptDecryptNip46HandshakePayload handles array-encoded nip04 payloads
|
|
---
|
|
duration_ms: 27.259846
|
|
type: 'test'
|
|
...
|
|
# Subtest: Nip46RpcClient sendRpc publishes events and resolves responses
|
|
ok 9 - Nip46RpcClient sendRpc publishes events and resolves responses
|
|
---
|
|
duration_ms: 12.108859
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 345.761881
|
|
|
|
→ Running tests/nostr/nip46Connector.test.mjs
|
|
TAP version 13
|
|
# Subtest: Nip46Connector
|
|
# Subtest: createKeyPair
|
|
# Subtest: should generate a new key pair if none provided
|
|
ok 1 - should generate a new key pair if none provided
|
|
---
|
|
duration_ms: 2.719292
|
|
type: 'test'
|
|
...
|
|
# Subtest: should use existing keys if provided
|
|
ok 2 - should use existing keys if provided
|
|
---
|
|
duration_ms: 0.424255
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - createKeyPair
|
|
---
|
|
duration_ms: 4.194566
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareHandshake
|
|
# Subtest: should parse connection string and return details
|
|
ok 1 - should parse connection string and return details
|
|
---
|
|
duration_ms: 1.128838
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - prepareHandshake
|
|
---
|
|
duration_ms: 1.471844
|
|
type: 'suite'
|
|
...
|
|
# Subtest: connect
|
|
# Subtest: should connect directly if remote pubkey is known
|
|
ok 1 - should connect directly if remote pubkey is known
|
|
---
|
|
duration_ms: 1.913564
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 3 - connect
|
|
---
|
|
duration_ms: 2.110735
|
|
type: 'suite'
|
|
...
|
|
# Subtest: reconnectStored
|
|
# Subtest: should throw if no stored session
|
|
ok 1 - should throw if no stored session
|
|
---
|
|
duration_ms: 1.408912
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reconnect using stored session
|
|
ok 2 - should reconnect using stored session
|
|
---
|
|
duration_ms: 0.713286
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - reconnectStored
|
|
---
|
|
duration_ms: 2.425075
|
|
type: 'suite'
|
|
...
|
|
# Subtest: disconnect
|
|
# Subtest: should clear stored session and emit change
|
|
ok 1 - should clear stored session and emit change
|
|
---
|
|
duration_ms: 0.488502
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - disconnect
|
|
---
|
|
duration_ms: 0.629049
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - Nip46Connector
|
|
---
|
|
duration_ms: 11.942498
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 6
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.755918
|
|
|
|
→ Running tests/nostr/nip71.test.js
|
|
TAP version 13
|
|
# Subtest: buildNip71MetadataTags normalizes structured fields
|
|
ok 1 - buildNip71MetadataTags normalizes structured fields
|
|
---
|
|
duration_ms: 3.155554
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectNip71PointerRequests aggregates events and tags
|
|
ok 2 - collectNip71PointerRequests aggregates events and tags
|
|
---
|
|
duration_ms: 0.539677
|
|
type: 'test'
|
|
...
|
|
# Subtest: processNip71Events reconciles pointers and filters video hashtags
|
|
ok 3 - processNip71Events reconciles pointers and filters video hashtags
|
|
---
|
|
duration_ms: 1.356486
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateNip71MetadataForVideos fetches missing records once
|
|
ok 4 - populateNip71MetadataForVideos fetches missing records once
|
|
---
|
|
duration_ms: 0.879176
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildNip71VideoEvent composes pointer tags
|
|
ok 5 - buildNip71VideoEvent composes pointer tags
|
|
---
|
|
duration_ms: 0.707379
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.215194
|
|
|
|
→ Running tests/nostr/nostrClientFacade.test.js
|
|
TAP version 13
|
|
# Subtest: nostrClientFacade forwards the default client instance
|
|
ok 1 - nostrClientFacade forwards the default client instance
|
|
---
|
|
duration_ms: 1.157654
|
|
type: 'test'
|
|
...
|
|
# Subtest: nostrClientFacade forwards the default permission helper
|
|
ok 2 - nostrClientFacade forwards the default permission helper
|
|
---
|
|
duration_ms: 0.252942
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.496958
|
|
|
|
→ Running tests/nostr/nostrClientRegistry.test.mjs
|
|
TAP version 13
|
|
# Subtest: registerSigner stores and resolves signer entries
|
|
ok 1 - registerSigner stores and resolves signer entries
|
|
---
|
|
duration_ms: 1.376794
|
|
type: 'test'
|
|
...
|
|
# Subtest: setActiveSigner notifies listeners and resolves by pubkey
|
|
ok 2 - setActiveSigner notifies listeners and resolves by pubkey
|
|
---
|
|
duration_ms: 1.40901
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.662666
|
|
|
|
→ Running tests/nostr/publishHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: mirrorVideoEvent lowercases provided MIME types
|
|
ok 1 - mirrorVideoEvent lowercases provided MIME types
|
|
---
|
|
duration_ms: 4.297219
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent lowercases inferred MIME types
|
|
ok 2 - mirrorVideoEvent lowercases inferred MIME types
|
|
---
|
|
duration_ms: 0.717794
|
|
type: 'test'
|
|
...
|
|
# Subtest: mirrorVideoEvent includes hash tags when provided
|
|
ok 3 - mirrorVideoEvent includes hash tags when provided
|
|
---
|
|
duration_ms: 1.531221
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.068206
|
|
|
|
→ Running tests/nostr/reaction-events.test.mjs
|
|
TAP version 13
|
|
# Subtest: publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
ok 1 - publishVideoReaction includes both address and event tags when reacting to addressable content
|
|
---
|
|
duration_ms: 5.438771
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
ok 2 - publishVideoReaction aborts when address pointer is missing a resolvable event id
|
|
---
|
|
duration_ms: 0.467979
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.674148
|
|
|
|
→ Running tests/nostr/revert-video-dtag.test.mjs
|
|
TAP version 13
|
|
# Subtest: revertVideo preserves existing d tag
|
|
ok 1 - revertVideo preserves existing d tag
|
|
---
|
|
duration_ms: 7.057223
|
|
type: 'test'
|
|
...
|
|
# Subtest: revertVideo falls back to original event id when d tag missing
|
|
ok 2 - revertVideo falls back to original event id when d tag missing
|
|
---
|
|
duration_ms: 1.244419
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.406472
|
|
|
|
→ Running tests/nostr/session-actor.test.mjs
|
|
TAP version 13
|
|
# Subtest: SessionActor
|
|
# Subtest: encrypts and decrypts private key
|
|
ok 1 - encrypts and decrypts private key
|
|
---
|
|
duration_ms: 300.256923
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails to decrypt with wrong passphrase
|
|
ok 2 - fails to decrypt with wrong passphrase
|
|
---
|
|
duration_ms: 296.618876
|
|
type: 'test'
|
|
...
|
|
# Subtest: persists and reads session actor
|
|
ok 3 - persists and reads session actor
|
|
---
|
|
duration_ms: 1.490752
|
|
type: 'test'
|
|
...
|
|
# Subtest: clears stored session actor
|
|
ok 4 - clears stored session actor
|
|
---
|
|
duration_ms: 0.275362
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - SessionActor
|
|
---
|
|
duration_ms: 600.807707
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 613.964666
|
|
|
|
→ Running tests/nostr/sessionActor.test.js
|
|
TAP version 13
|
|
# Subtest: encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
ok 1 - encryptSessionPrivateKey + decryptSessionPrivateKey roundtrip
|
|
---
|
|
duration_ms: 313.010523
|
|
type: 'test'
|
|
...
|
|
# Subtest: persistSessionActor stores encrypted payload metadata
|
|
ok 2 - persistSessionActor stores encrypted payload metadata
|
|
---
|
|
duration_ms: 150.277074
|
|
type: 'test'
|
|
...
|
|
# Subtest: clearStoredSessionActor removes persisted payload
|
|
ok 3 - clearStoredSessionActor removes persisted payload
|
|
---
|
|
duration_ms: 148.811299
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 620.610644
|
|
|
|
→ Running tests/nostr/sessionActor.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/nostr/sessionActor.js
|
|
# Subtest: Encryption and Decryption Roundtrip
|
|
ok 1 - Encryption and Decryption Roundtrip
|
|
---
|
|
duration_ms: 300.656065
|
|
type: 'test'
|
|
...
|
|
# Subtest: Decryption fails with wrong passphrase
|
|
ok 2 - Decryption fails with wrong passphrase
|
|
---
|
|
duration_ms: 297.511571
|
|
type: 'test'
|
|
...
|
|
# Subtest: Persistence and Retrieval
|
|
ok 3 - Persistence and Retrieval
|
|
---
|
|
duration_ms: 293.504413
|
|
type: 'test'
|
|
...
|
|
# Subtest: Clear Stored Session Actor
|
|
ok 4 - Clear Stored Session Actor
|
|
---
|
|
duration_ms: 1.042222
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - js/nostr/sessionActor.js
|
|
---
|
|
duration_ms: 896.045018
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 903.156006
|
|
|
|
→ Running tests/nostr/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent: processes requests sequentially
|
|
ok 1 - queueSignEvent: processes requests sequentially
|
|
---
|
|
duration_ms: 103.034196
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles timeouts
|
|
ok 2 - queueSignEvent: handles timeouts
|
|
---
|
|
duration_ms: 22.303469
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles permission denied errors
|
|
ok 3 - queueSignEvent: handles permission denied errors
|
|
---
|
|
duration_ms: 0.608334
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: handles signer disconnected
|
|
ok 4 - queueSignEvent: handles signer disconnected
|
|
---
|
|
duration_ms: 0.448977
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: fails if signer is missing or invalid
|
|
ok 5 - queueSignEvent: fails if signer is missing or invalid
|
|
---
|
|
duration_ms: 0.494336
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent: continues queue processing after failure
|
|
ok 6 - queueSignEvent: continues queue processing after failure
|
|
---
|
|
duration_ms: 0.796069
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 210.792823
|
|
|
|
→ Running tests/nostr/signers.test.mjs
|
|
TAP version 13
|
|
# Subtest: setActiveSigner hydrates extension capabilities from window.nostr
|
|
ok 1 - setActiveSigner hydrates extension capabilities from window.nostr
|
|
---
|
|
duration_ms: 1.775991
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.56507
|
|
|
|
→ Running tests/nostr/syncMetadataStore.test.mjs
|
|
TAP version 13
|
|
# Subtest: SyncMetadataStore
|
|
# Subtest: should load from localStorage on initialization
|
|
ok 1 - should load from localStorage on initialization
|
|
---
|
|
duration_ms: 1.813806
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update last seen and save to localStorage
|
|
ok 2 - should update last seen and save to localStorage
|
|
---
|
|
duration_ms: 0.711012
|
|
type: 'test'
|
|
...
|
|
# Subtest: should only update if timestamp is newer
|
|
ok 3 - should only update if timestamp is newer
|
|
---
|
|
duration_ms: 0.828453
|
|
type: 'test'
|
|
...
|
|
# Subtest: should get per-relay last seen
|
|
ok 4 - should get per-relay last seen
|
|
---
|
|
duration_ms: 1.647726
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing localStorage gracefully
|
|
ok 5 - should handle missing localStorage gracefully
|
|
---
|
|
duration_ms: 0.472786
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - SyncMetadataStore
|
|
---
|
|
duration_ms: 7.551675
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.87038
|
|
|
|
→ Running tests/nostr/toolkit.test.mjs
|
|
TAP version 13
|
|
# Subtest: toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
ok 1 - toolkit: DEFAULT_RELAY_URLS is frozen and contains valid URLs
|
|
---
|
|
duration_ms: 1.394582
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
ok 2 - toolkit: resolveSimplePoolConstructor finds SimplePool
|
|
---
|
|
duration_ms: 0.440593
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
ok 3 - toolkit: shimLegacySimplePoolMethods adds sub/list/map if missing
|
|
---
|
|
duration_ms: 0.6574
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
ok 4 - toolkit: readToolkitFromScope finds NostrTools in global scope
|
|
---
|
|
duration_ms: 0.39357
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: normalizeToolkitCandidate validation
|
|
ok 5 - toolkit: normalizeToolkitCandidate validation
|
|
---
|
|
duration_ms: 0.712837
|
|
type: 'test'
|
|
...
|
|
# Subtest: toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
ok 6 - toolkit: shimLegacySimplePoolMethods handles simple list operation
|
|
---
|
|
duration_ms: 12.056119
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.559754
|
|
|
|
→ Running tests/nostr/videoEventBuffer.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoEventBuffer
|
|
# Subtest: Push and Flush
|
|
ok 1 - Push and Flush
|
|
---
|
|
duration_ms: 3.477484
|
|
type: 'test'
|
|
...
|
|
# Subtest: Latest Wins
|
|
ok 2 - Latest Wins
|
|
---
|
|
duration_ms: 0.738959
|
|
type: 'test'
|
|
...
|
|
# Subtest: Tombstone Handling
|
|
ok 3 - Tombstone Handling
|
|
---
|
|
duration_ms: 0.807207
|
|
type: 'test'
|
|
...
|
|
# Subtest: Cleanup
|
|
ok 4 - Cleanup
|
|
---
|
|
duration_ms: 0.621712
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - VideoEventBuffer
|
|
---
|
|
duration_ms: 7.236249
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 19.232168
|
|
|
|
→ Running tests/nostr/videoPayloadBuilder.test.mjs
|
|
TAP version 13
|
|
# Subtest: videoPayloadBuilder
|
|
# Subtest: extractVideoPublishPayload
|
|
# Subtest: extracts videoData and nip71Metadata
|
|
ok 1 - extracts videoData and nip71Metadata
|
|
---
|
|
duration_ms: 1.915749
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles legacyFormData structure
|
|
ok 2 - handles legacyFormData structure
|
|
---
|
|
duration_ms: 0.226301
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags
|
|
ok 3 - normalizes boolean flags
|
|
---
|
|
duration_ms: 0.190879
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes boolean flags (kids only)
|
|
ok 4 - normalizes boolean flags (kids only)
|
|
---
|
|
duration_ms: 0.241742
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - extractVideoPublishPayload
|
|
---
|
|
duration_ms: 3.661833
|
|
type: 'suite'
|
|
...
|
|
# Subtest: prepareVideoPublishPayload
|
|
# Subtest: throws if pubkey is missing
|
|
ok 1 - throws if pubkey is missing
|
|
---
|
|
duration_ms: 1.256331
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates a valid event structure
|
|
ok 2 - generates a valid event structure
|
|
---
|
|
duration_ms: 2.59332
|
|
type: 'test'
|
|
...
|
|
# Subtest: generates unique d tag and videoRootId if not provided
|
|
ok 3 - generates unique d tag and videoRootId if not provided
|
|
---
|
|
duration_ms: 0.437204
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses provided seriesIdentifier as d tag
|
|
ok 4 - uses provided seriesIdentifier as d tag
|
|
---
|
|
duration_ms: 0.60333
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolves infoHash from magnet
|
|
ok 5 - resolves infoHash from magnet
|
|
---
|
|
duration_ms: 0.592098
|
|
type: 'test'
|
|
...
|
|
# Subtest: includes NIP-71 tags
|
|
ok 6 - includes NIP-71 tags
|
|
---
|
|
duration_ms: 0.882991
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - prepareVideoPublishPayload
|
|
---
|
|
duration_ms: 7.218215
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - videoPayloadBuilder
|
|
---
|
|
duration_ms: 11.609524
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 3
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.842196
|
|
|
|
→ Running tests/nostr/watchHistory.test.js
|
|
[bitvid] [ProfileCache] Expired watchHistory for 2222222222222222222222222222222222222222222222222222222222222222
|
|
TAP version 13
|
|
# Subtest: buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
ok 1 - buildWatchHistoryPayload enforces byte limits and records skipped entries
|
|
---
|
|
duration_ms: 3.045915
|
|
type: 'test'
|
|
...
|
|
# Subtest: getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
ok 2 - getWatchHistoryStorage prunes entries that exceed the configured TTL
|
|
---
|
|
duration_ms: 2.446791
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
ok 3 - fetchWatchHistory prefers decrypted chunk payloads when nip04 decrypt succeeds
|
|
---
|
|
duration_ms: 9.228298
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
ok 4 - fetchWatchHistory falls back to pointer payload when nip04 decrypt fails
|
|
---
|
|
duration_ms: 2.178497
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
ok 5 - publishWatchHistorySnapshot uses injected nostr-tools helpers when signer cannot encrypt
|
|
---
|
|
duration_ms: 4.375133
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishWatchHistorySnapshot caches successful snapshot results
|
|
ok 6 - publishWatchHistorySnapshot caches successful snapshot results
|
|
---
|
|
duration_ms: 2.698962
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.699862
|
|
|
|
→ Running tests/nostr/watchHistoryBindings.test.js
|
|
TAP version 13
|
|
# Subtest: updateWatchHistoryList delegates to the client's manager
|
|
ok 1 - updateWatchHistoryList delegates to the client's manager
|
|
---
|
|
duration_ms: 2.326633
|
|
type: 'test'
|
|
...
|
|
# Subtest: removeWatchHistoryItem delegates to the client's manager
|
|
ok 2 - removeWatchHistoryItem delegates to the client's manager
|
|
---
|
|
duration_ms: 0.507352
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when the manager is unavailable
|
|
ok 3 - watch history bindings throw when the manager is unavailable
|
|
---
|
|
duration_ms: 0.708053
|
|
type: 'test'
|
|
...
|
|
# Subtest: watch history bindings throw when a required method is missing
|
|
ok 4 - watch history bindings throw when a required method is missing
|
|
---
|
|
duration_ms: 0.334758
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.105038
|
|
|
|
→ Running tests/nwc-settings-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: nwc settings service preserves settings across profile switches
|
|
ok 1 - nwc settings service preserves settings across profile switches
|
|
---
|
|
duration_ms: 2.007245
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateActiveNwcSettings returns cloned values
|
|
ok 2 - updateActiveNwcSettings returns cloned values
|
|
---
|
|
duration_ms: 0.57542
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.249274
|
|
|
|
→ Running tests/performance/resolvePostedAt.test.mjs
|
|
pool.list calls: 2
|
|
pool.get calls: 0
|
|
TAP version 13
|
|
# Subtest: hydrateVideoHistoryBatch optimizes network calls
|
|
ok 1 - hydrateVideoHistoryBatch optimizes network calls
|
|
---
|
|
duration_ms: 4.75634
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPostedAtBatch uses batch hydration
|
|
ok 2 - resolveVideoPostedAtBatch uses batch hydration
|
|
---
|
|
duration_ms: 0.718895
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.76709
|
|
|
|
→ Running tests/position-floating-panel.test.mjs
|
|
TAP version 13
|
|
# Subtest: flips placement when bottom placement would collide with viewport
|
|
ok 1 - flips placement when bottom placement would collide with viewport
|
|
---
|
|
duration_ms: 465.073181
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes previously open popovers without restoring focus
|
|
ok 2 - closes previously open popovers without restoring focus
|
|
---
|
|
duration_ms: 69.623062
|
|
type: 'test'
|
|
...
|
|
# Subtest: restores focus to the trigger when closed
|
|
ok 3 - restores focus to the trigger when closed
|
|
---
|
|
duration_ms: 37.335573
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 581.545986
|
|
|
|
→ Running tests/profile-cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: ProfileCache: setActiveProfile and getActiveProfile
|
|
ok 1 - ProfileCache: setActiveProfile and getActiveProfile
|
|
---
|
|
duration_ms: 2.091815
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolveAddressKey
|
|
ok 2 - ProfileCache: resolveAddressKey
|
|
---
|
|
duration_ms: 0.53577
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: set and get (memory and persistence)
|
|
ok 3 - ProfileCache: set and get (memory and persistence)
|
|
---
|
|
duration_ms: 22.460264
|
|
type: 'test'
|
|
...
|
|
[bitvid] [ProfileCache] Expired watchHistory for eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
|
|
# Subtest: ProfileCache: setProfile normalization and storage
|
|
ok 4 - ProfileCache: setProfile normalization and storage
|
|
---
|
|
duration_ms: 21.475167
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: TTL expiration
|
|
ok 5 - ProfileCache: TTL expiration
|
|
---
|
|
duration_ms: 1.560726
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
ok 6 - ProfileCache: clearMemoryCache and clearSignerRuntime
|
|
---
|
|
duration_ms: 0.575441
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: listeners
|
|
ok 7 - ProfileCache: listeners
|
|
---
|
|
duration_ms: 0.440627
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 58.419293
|
|
|
|
→ Running tests/profile-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: Profile modal Escape closes and restores trigger focus
|
|
ok 1 - Profile modal Escape closes and restores trigger focus
|
|
---
|
|
duration_ms: 1417.452432
|
|
type: 'test'
|
|
...
|
|
# Subtest: Add profile request suspends focus trap and elevates login modal
|
|
ok 2 - Add profile request suspends focus trap and elevates login modal
|
|
---
|
|
duration_ms: 1286.423057
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal navigation buttons toggle active state
|
|
ok 3 - Profile modal navigation buttons toggle active state
|
|
---
|
|
duration_ms: 1435.76806
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal toggles mobile menu and pane views
|
|
ok 4 - Profile modal toggles mobile menu and pane views
|
|
---
|
|
duration_ms: 1442.999002
|
|
type: 'test'
|
|
...
|
|
# Subtest: wallet URI input masks persisted values and restores on focus
|
|
ok 5 - wallet URI input masks persisted values and restores on focus
|
|
---
|
|
duration_ms: 1036.885907
|
|
type: 'test'
|
|
...
|
|
# Subtest: Profile modal uses abbreviated npub display
|
|
ok 6 - Profile modal uses abbreviated npub display
|
|
---
|
|
duration_ms: 772.969886
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSavedProfiles applies provider metadata
|
|
ok 7 - renderSavedProfiles applies provider metadata
|
|
---
|
|
duration_ms: 766.435052
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane shows empty states by default
|
|
ok 8 - Hashtag pane shows empty states by default
|
|
---
|
|
duration_ms: 955.822909
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane adds, moves, and removes tags
|
|
ok 9 - Hashtag pane adds, moves, and removes tags
|
|
---
|
|
duration_ms: 976.073069
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddHashtagPreference publishes updates
|
|
ok 10 - handleAddHashtagPreference publishes updates
|
|
---
|
|
duration_ms: 1003.291575
|
|
type: 'test'
|
|
...
|
|
# Subtest: Hashtag pane resets after logout when service clears tags
|
|
ok 11 - Hashtag pane resets after logout when service clears tags
|
|
---
|
|
duration_ms: 1202.295856
|
|
type: 'test'
|
|
...
|
|
# Subtest: load() injects markup and caches expected elements
|
|
ok 12 - load() injects markup and caches expected elements
|
|
---
|
|
duration_ms: 519.874394
|
|
type: 'test'
|
|
...
|
|
# Subtest: show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
ok 13 - show()/hide() toggle panes, trap focus, and refresh the wallet pane
|
|
---
|
|
duration_ms: 965.448096
|
|
type: 'test'
|
|
...
|
|
# Subtest: populateProfileRelays renders entries and wires action buttons
|
|
ok 14 - populateProfileRelays renders entries and wires action buttons
|
|
---
|
|
duration_ms: 515.00216
|
|
type: 'test'
|
|
...
|
|
# Subtest: admin mutations invoke accessControl stubs and update admin DOM
|
|
ok 15 - admin mutations invoke accessControl stubs and update admin DOM
|
|
---
|
|
duration_ms: 507.546105
|
|
type: 'test'
|
|
...
|
|
# Subtest: history pane lazily initializes the watch history renderer
|
|
ok 16 - history pane lazily initializes the watch history renderer
|
|
---
|
|
duration_ms: 1402.549
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning throttles status updates
|
|
ok 17 - handleDirectMessagesRelayWarning throttles status updates
|
|
---
|
|
duration_ms: 519.105135
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
ok 18 - handleDirectMessagesRelayWarning suppresses status updates when disabled
|
|
---
|
|
duration_ms: 515.989308
|
|
type: 'test'
|
|
...
|
|
1..18
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17252.086907
|
|
|
|
→ Running tests/reaction-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildReactionEvent includes pointer and author tags when pubkey provided
|
|
ok 1 - buildReactionEvent includes pointer and author tags when pubkey provided
|
|
---
|
|
duration_ms: 2.968111
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildReactionEvent merges address and event pointers for addressable targets
|
|
ok 2 - buildReactionEvent merges address and event pointers for addressable targets
|
|
---
|
|
duration_ms: 0.630639
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.405771
|
|
|
|
→ Running tests/revert-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: RevertModalController
|
|
# Subtest: open() fetches history and opens modal
|
|
ok 1 - open() fetches history and opens modal
|
|
---
|
|
duration_ms: 1.479795
|
|
type: 'test'
|
|
...
|
|
# Subtest: open() shows error if not logged in
|
|
ok 2 - open() shows error if not logged in
|
|
---
|
|
duration_ms: 0.42452
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleConfirm() calls revertVideo and refreshes
|
|
ok 3 - handleConfirm() calls revertVideo and refreshes
|
|
---
|
|
duration_ms: 0.47224
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - RevertModalController
|
|
---
|
|
duration_ms: 4.084362
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.674518
|
|
|
|
→ Running tests/safe-decode.test.mjs
|
|
TAP version 13
|
|
# Subtest: safeDecodeURIComponent returns original value on malformed sequences
|
|
ok 1 - safeDecodeURIComponent returns original value on malformed sequences
|
|
---
|
|
duration_ms: 1.17133
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecode helpers handle double-encoded values when applied repeatedly
|
|
ok 2 - safeDecode helpers handle double-encoded values when applied repeatedly
|
|
---
|
|
duration_ms: 0.288807
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose trims inputs by default
|
|
ok 3 - safeDecodeURIComponentLoose trims inputs by default
|
|
---
|
|
duration_ms: 0.194433
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
ok 4 - safeDecodeURIComponentLoose preserves whitespace when trim is false
|
|
---
|
|
duration_ms: 0.162599
|
|
type: 'test'
|
|
...
|
|
# Subtest: safeDecodeURIComponent handles empty strings consistently
|
|
ok 5 - safeDecodeURIComponent handles empty strings consistently
|
|
---
|
|
duration_ms: 0.294625
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 14.976329
|
|
|
|
→ Running tests/services/attachmentService.test.mjs
|
|
TAP version 13
|
|
# Subtest: attachmentService
|
|
# Subtest: prepareAttachmentUpload
|
|
# Subtest: should prepare upload without encryption
|
|
ok 1 - should prepare upload without encryption
|
|
---
|
|
duration_ms: 2.93961
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prepare upload with encryption
|
|
ok 2 - should prepare upload with encryption
|
|
---
|
|
duration_ms: 9.233227
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - prepareAttachmentUpload
|
|
---
|
|
duration_ms: 12.914615
|
|
type: 'suite'
|
|
...
|
|
# Subtest: downloadAttachment
|
|
# Subtest: should download attachment
|
|
ok 1 - should download attachment
|
|
---
|
|
duration_ms: 1.683635
|
|
type: 'test'
|
|
...
|
|
# Subtest: should verify hash
|
|
ok 2 - should verify hash
|
|
---
|
|
duration_ms: 1.071399
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on hash mismatch
|
|
ok 3 - should throw on hash mismatch
|
|
---
|
|
duration_ms: 1.318307
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - downloadAttachment
|
|
---
|
|
duration_ms: 4.51503
|
|
type: 'suite'
|
|
...
|
|
# Subtest: caching
|
|
# Subtest: should cache downloaded attachments
|
|
ok 1 - should cache downloaded attachments
|
|
---
|
|
duration_ms: 0.989909
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 2 - should clear cache
|
|
---
|
|
duration_ms: 1.302012
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - caching
|
|
---
|
|
duration_ms: 2.733987
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - attachmentService
|
|
---
|
|
duration_ms: 21.814027
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 4
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.007219
|
|
|
|
→ Running tests/services/authUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: authUtils
|
|
# Subtest: normalizeProviderId
|
|
# Subtest: returns trimmed string if valid
|
|
ok 1 - returns trimmed string if valid
|
|
---
|
|
duration_ms: 0.919741
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if empty
|
|
ok 2 - returns 'nip07' fallback if empty
|
|
---
|
|
duration_ms: 0.250631
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if null
|
|
ok 3 - returns 'nip07' fallback if null
|
|
---
|
|
duration_ms: 0.270945
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if undefined
|
|
ok 4 - returns 'nip07' fallback if undefined
|
|
---
|
|
duration_ms: 0.233202
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' fallback if not a string
|
|
ok 5 - returns 'nip07' fallback if not a string
|
|
---
|
|
duration_ms: 0.207919
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - normalizeProviderId
|
|
---
|
|
duration_ms: 4.550688
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizeAuthType
|
|
# Subtest: prioritizes authTypeCandidate
|
|
ok 1 - prioritizes authTypeCandidate
|
|
---
|
|
duration_ms: 0.440504
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.authType
|
|
ok 2 - falls back to providerResult.authType
|
|
---
|
|
duration_ms: 0.208054
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerResult.providerId
|
|
ok 3 - falls back to providerResult.providerId
|
|
---
|
|
duration_ms: 0.39961
|
|
type: 'test'
|
|
...
|
|
# Subtest: falls back to providerId
|
|
ok 4 - falls back to providerId
|
|
---
|
|
duration_ms: 0.220209
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns 'nip07' if all else fails
|
|
ok 5 - returns 'nip07' if all else fails
|
|
---
|
|
duration_ms: 0.144567
|
|
type: 'test'
|
|
...
|
|
# Subtest: trims whitespace from results
|
|
ok 6 - trims whitespace from results
|
|
---
|
|
duration_ms: 0.141982
|
|
type: 'test'
|
|
...
|
|
# Subtest: ignores empty strings in candidates
|
|
ok 7 - ignores empty strings in candidates
|
|
---
|
|
duration_ms: 0.109214
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 2 - normalizeAuthType
|
|
---
|
|
duration_ms: 3.022383
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - authUtils
|
|
---
|
|
duration_ms: 8.581037
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 25.420826
|
|
|
|
→ Running tests/services/discussionCountService.test.mjs
|
|
TAP version 13
|
|
# Subtest: DiscussionCountService
|
|
# Subtest: initialization sets defaults
|
|
ok 1 - initialization sets defaults
|
|
---
|
|
duration_ms: 1.117739
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if videos array is empty or invalid
|
|
ok 2 - refreshCounts returns early if videos array is empty or invalid
|
|
---
|
|
duration_ms: 0.540704
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts returns early if dependencies are missing
|
|
ok 3 - refreshCounts returns early if dependencies are missing
|
|
---
|
|
duration_ms: 1.058397
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles happy path (fetches and updates DOM)
|
|
ok 4 - refreshCounts handles happy path (fetches and updates DOM)
|
|
---
|
|
duration_ms: 38.898046
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts uses cached count if available
|
|
ok 5 - refreshCounts uses cached count if available
|
|
---
|
|
duration_ms: 2.148254
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles API errors gracefully
|
|
ok 6 - refreshCounts handles API errors gracefully
|
|
---
|
|
duration_ms: 4.142349
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles partial results
|
|
ok 7 - refreshCounts handles partial results
|
|
---
|
|
duration_ms: 3.357856
|
|
type: 'test'
|
|
...
|
|
# Subtest: refreshCounts handles unsupported relays (empty perRelay)
|
|
ok 8 - refreshCounts handles unsupported relays (empty perRelay)
|
|
---
|
|
duration_ms: 2.308122
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - DiscussionCountService
|
|
---
|
|
duration_ms: 137.006038
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 1
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 150.051094
|
|
|
|
→ Running tests/services/exploreDataService.optimization.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService optimization
|
|
# Subtest: toLightweightVideo extracts necessary fields
|
|
ok 1 - toLightweightVideo extracts necessary fields
|
|
---
|
|
duration_ms: 1.785839
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags works with lightweight object
|
|
ok 2 - collectVideoTags works with lightweight object
|
|
---
|
|
duration_ms: 13.870156
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildVideoAddressPointer works with lightweight object
|
|
ok 3 - buildVideoAddressPointer works with lightweight object
|
|
---
|
|
duration_ms: 0.418633
|
|
type: 'test'
|
|
...
|
|
# Subtest: toLightweightVideo handles invalid input
|
|
ok 4 - toLightweightVideo handles invalid input
|
|
---
|
|
duration_ms: 0.251195
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - exploreDataService optimization
|
|
---
|
|
duration_ms: 17.976215
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.129821
|
|
|
|
→ Running tests/services/exploreDataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: exploreDataService - buildWatchHistoryTagCounts
|
|
# Subtest: should return empty Map if watchHistoryService is missing
|
|
ok 1 - should return empty Map if watchHistoryService is missing
|
|
---
|
|
duration_ms: 1.163361
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle missing loadLatest method gracefully
|
|
ok 2 - should handle missing loadLatest method gracefully
|
|
---
|
|
duration_ms: 0.398825
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle loadLatest failure gracefully
|
|
ok 3 - should handle loadLatest failure gracefully
|
|
---
|
|
duration_ms: 7.652769
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return counts from worker on success
|
|
ok 4 - should return counts from worker on success
|
|
---
|
|
duration_ms: 2.214022
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle worker error gracefully
|
|
ok 5 - should handle worker error gracefully
|
|
---
|
|
duration_ms: 1.460773
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - exploreDataService - buildWatchHistoryTagCounts
|
|
---
|
|
duration_ms: 21.985353
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.018355
|
|
|
|
→ Running tests/services/link-preview-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: LinkPreviewService
|
|
# Subtest: initializes IndexedDB
|
|
ok 1 - initializes IndexedDB
|
|
---
|
|
duration_ms: 14.157741
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetches and caches preview
|
|
ok 2 - fetches and caches preview
|
|
---
|
|
duration_ms: 29.795555
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns null on fetch failure
|
|
ok 3 - returns null on fetch failure
|
|
---
|
|
duration_ms: 2.808352
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects TTL
|
|
ok 4 - respects TTL
|
|
---
|
|
duration_ms: 13.781667
|
|
type: 'test'
|
|
...
|
|
# Subtest: deletePreview removes from cache
|
|
ok 5 - deletePreview removes from cache
|
|
---
|
|
duration_ms: 2.296174
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - LinkPreviewService
|
|
---
|
|
duration_ms: 66.715268
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 75.554991
|
|
|
|
→ Running tests/services/moderation-action-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationActionController: handles moderation override
|
|
ok 1 - ModerationActionController: handles moderation override
|
|
---
|
|
duration_ms: 1.866982
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: blocks user and updates state
|
|
ok 2 - ModerationActionController: blocks user and updates state
|
|
---
|
|
duration_ms: 0.92896
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: prevents blocking self
|
|
ok 3 - ModerationActionController: prevents blocking self
|
|
---
|
|
duration_ms: 0.32814
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: requires login to block
|
|
ok 4 - ModerationActionController: requires login to block
|
|
---
|
|
duration_ms: 0.395656
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationActionController: handles hide action
|
|
ok 5 - ModerationActionController: handles hide action
|
|
---
|
|
duration_ms: 0.376473
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.497777
|
|
|
|
→ Running tests/services/nostr-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrService
|
|
# Subtest: loadVideos
|
|
# Subtest: should load cached videos and start subscription
|
|
ok 1 - should load cached videos and start subscription
|
|
---
|
|
duration_ms: 3.360539
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - loadVideos
|
|
---
|
|
duration_ms: 4.324115
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchVideosByAuthors
|
|
# Subtest: should fetch videos from relays for specific authors
|
|
ok 1 - should fetch videos from relays for specific authors
|
|
---
|
|
duration_ms: 2.324931
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 2 - fetchVideosByAuthors
|
|
---
|
|
duration_ms: 2.5613
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - NostrService
|
|
---
|
|
duration_ms: 7.771103
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 3
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.892749
|
|
|
|
→ Running tests/services/playbackService_forcedSource.test.mjs
|
|
(node:7712) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Forced Source Logic
|
|
# Subtest: Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
ok 1 - Normal flow: Timeout triggers fallback to Torrent if URL stalls
|
|
---
|
|
duration_ms: 11.804648
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
ok 2 - Forced Source 'url': Ignores playbackStartTimeout and does NOT fallback to Torrent
|
|
---
|
|
duration_ms: 3.949948
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
ok 3 - Forced Source 'url': Does NOT fallback to Torrent even if URL fails (probe bad)
|
|
---
|
|
duration_ms: 1.981814
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
ok 4 - Forced Source 'torrent': Ignores playbackStartTimeout and does NOT fallback to URL
|
|
---
|
|
duration_ms: 1.601037
|
|
type: 'test'
|
|
...
|
|
# Subtest: Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
ok 5 - Forced Source 'torrent': Does NOT fallback to URL even if Torrent fails
|
|
---
|
|
duration_ms: 1.882335
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - PlaybackService Forced Source Logic
|
|
---
|
|
duration_ms: 101.611483
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 114.102092
|
|
|
|
→ Running tests/services/playbackService_order.test.mjs
|
|
(node:7719) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService Ordering
|
|
# Subtest: Playback Execution Order
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, succeeds
|
|
ok 1 - urlFirstEnabled=true: Tries URL first, succeeds
|
|
---
|
|
duration_ms: 8.395723
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
ok 2 - urlFirstEnabled=true: Tries URL first, fails, falls back to Torrent
|
|
---
|
|
duration_ms: 1.648452
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
ok 3 - urlFirstEnabled=false: Tries Torrent first, succeeds
|
|
---
|
|
duration_ms: 1.266723
|
|
type: 'test'
|
|
...
|
|
# Subtest: urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
ok 4 - urlFirstEnabled=false: Tries Torrent first, fails (throws), falls back to URL
|
|
---
|
|
duration_ms: 1.859376
|
|
type: 'test'
|
|
...
|
|
# Subtest: forcedSource=torrent overrides urlFirstEnabled=true
|
|
ok 5 - forcedSource=torrent overrides urlFirstEnabled=true
|
|
---
|
|
duration_ms: 0.830604
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - Playback Execution Order
|
|
---
|
|
duration_ms: 14.986705
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - PlaybackService Ordering
|
|
---
|
|
duration_ms: 16.439443
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 2
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 30.864169
|
|
|
|
→ Running tests/services/playbackService.test.mjs
|
|
(node:7726) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
|
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
TAP version 13
|
|
# Subtest: PlaybackService
|
|
# Subtest: Initialization sets defaults and dependencies
|
|
ok 1 - Initialization sets defaults and dependencies
|
|
---
|
|
duration_ms: 1.543374
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareVideoElement respects localStorage and binds listener
|
|
ok 2 - prepareVideoElement respects localStorage and binds listener
|
|
---
|
|
duration_ms: 4.387801
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
ok 3 - registerUrlPlaybackWatchdogs triggers onFallback on error
|
|
---
|
|
duration_ms: 1.623385
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
ok 4 - registerUrlPlaybackWatchdogs triggers onSuccess on playing
|
|
---
|
|
duration_ms: 0.708519
|
|
type: 'test'
|
|
...
|
|
# Subtest: createSession returns a PlaybackSession
|
|
ok 5 - createSession returns a PlaybackSession
|
|
---
|
|
duration_ms: 0.439161
|
|
type: 'test'
|
|
...
|
|
# Subtest: PlaybackSession Flow
|
|
# Subtest: URL Probe Success starts playback
|
|
ok 1 - URL Probe Success starts playback
|
|
---
|
|
duration_ms: 9.077366
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Probe Failure triggers fallback
|
|
ok 2 - URL Probe Failure triggers fallback
|
|
---
|
|
duration_ms: 2.53861
|
|
type: 'test'
|
|
...
|
|
# Subtest: Watchdog Stall triggers fallback
|
|
ok 3 - Watchdog Stall triggers fallback
|
|
---
|
|
duration_ms: 2.945338
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 6 - PlaybackSession Flow
|
|
---
|
|
duration_ms: 15.038395
|
|
type: 'suite'
|
|
...
|
|
1..6
|
|
ok 1 - PlaybackService
|
|
---
|
|
duration_ms: 109.172729
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 123.705338
|
|
|
|
→ Running tests/services/profileMetadataService.test.mjs
|
|
TAP version 13
|
|
# Subtest: profileMetadataService
|
|
# Subtest: fetchProfileMetadataBatch
|
|
# Subtest: should return empty map if no pubkeys provided
|
|
ok 1 - should return empty map if no pubkeys provided
|
|
---
|
|
duration_ms: 2.308563
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fetch profiles for provided pubkeys
|
|
ok 2 - should fetch profiles for provided pubkeys
|
|
---
|
|
duration_ms: 3.077202
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle relay failures gracefully
|
|
ok 3 - should handle relay failures gracefully
|
|
---
|
|
duration_ms: 0.753606
|
|
type: 'test'
|
|
...
|
|
# Subtest: should parse profile content correctly
|
|
ok 4 - should parse profile content correctly
|
|
---
|
|
duration_ms: 0.918809
|
|
type: 'test'
|
|
...
|
|
# Subtest: should deduplicate concurrent requests (inflight)
|
|
ok 5 - should deduplicate concurrent requests (inflight)
|
|
---
|
|
duration_ms: 8.761984
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - fetchProfileMetadataBatch
|
|
---
|
|
duration_ms: 17.105608
|
|
type: 'suite'
|
|
...
|
|
# Subtest: fetchProfileMetadata
|
|
# Subtest: should return null for invalid pubkey
|
|
ok 1 - should return null for invalid pubkey
|
|
---
|
|
duration_ms: 0.56363
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return single profile result
|
|
ok 2 - should return single profile result
|
|
---
|
|
duration_ms: 0.62718
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - fetchProfileMetadata
|
|
---
|
|
duration_ms: 1.801006
|
|
type: 'suite'
|
|
...
|
|
# Subtest: ensureProfileMetadataSubscription
|
|
# Subtest: should return null if nostr pool is missing
|
|
ok 1 - should return null if nostr pool is missing
|
|
---
|
|
duration_ms: 0.521824
|
|
type: 'test'
|
|
...
|
|
# Subtest: should create a subscription via relaySubscriptionService
|
|
ok 2 - should create a subscription via relaySubscriptionService
|
|
---
|
|
duration_ms: 14.345861
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle onProfile callback
|
|
ok 3 - should handle onProfile callback
|
|
---
|
|
duration_ms: 1.213511
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - ensureProfileMetadataSubscription
|
|
---
|
|
duration_ms: 16.46799
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - profileMetadataService
|
|
---
|
|
duration_ms: 36.273633
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 10
|
|
# suites 4
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 51.823617
|
|
|
|
→ Running tests/services/r2Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/services/r2Service.js
|
|
# Subtest: Default Settings
|
|
ok 1 - Default Settings
|
|
---
|
|
duration_ms: 2.616725
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Valid Input
|
|
ok 2 - handleCloudflareSettingsSubmit - Valid Input
|
|
---
|
|
duration_ms: 0.599647
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
ok 3 - handleCloudflareSettingsSubmit - Invalid S3 URL
|
|
---
|
|
duration_ms: 0.999012
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleCloudflareSettingsSubmit - Missing Fields
|
|
ok 4 - handleCloudflareSettingsSubmit - Missing Fields
|
|
---
|
|
duration_ms: 0.668261
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
ok 5 - ensureBucketConfigForNpub - Uses Explicit Credentials
|
|
---
|
|
duration_ms: 0.780609
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
ok 6 - ensureBucketConfigForNpub - Uses Meta Bucket when Missing
|
|
---
|
|
duration_ms: 2.009395
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Maps meta bucket into settings
|
|
ok 7 - resolveConnection - Maps meta bucket into settings
|
|
---
|
|
duration_ms: 0.858214
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveConnection - Returns null without StorageService entries
|
|
ok 8 - resolveConnection - Returns null without StorageService entries
|
|
---
|
|
duration_ms: 0.328128
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - js/services/r2Service.js
|
|
---
|
|
duration_ms: 12.438099
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 27.02647
|
|
|
|
→ Running tests/services/relay-health-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: RelayHealthService: initializes with default values
|
|
ok 1 - RelayHealthService: initializes with default values
|
|
---
|
|
duration_ms: 1.546573
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: manages telemetry opt-in
|
|
ok 2 - RelayHealthService: manages telemetry opt-in
|
|
---
|
|
duration_ms: 0.352038
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: getRelayUrls fetches from relayManager
|
|
ok 3 - RelayHealthService: getRelayUrls fetches from relayManager
|
|
---
|
|
duration_ms: 1.024023
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: ensureRelayState creates default state
|
|
ok 4 - RelayHealthService: ensureRelayState creates default state
|
|
---
|
|
duration_ms: 0.312885
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay success flow
|
|
ok 5 - RelayHealthService: checkRelay success flow
|
|
---
|
|
duration_ms: 0.915582
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay failure flow
|
|
ok 6 - RelayHealthService: checkRelay failure flow
|
|
---
|
|
duration_ms: 0.47341
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay handles missing nostrClient
|
|
ok 7 - RelayHealthService: checkRelay handles missing nostrClient
|
|
---
|
|
duration_ms: 0.465363
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: refresh checks all relays
|
|
ok 8 - RelayHealthService: refresh checks all relays
|
|
---
|
|
duration_ms: 0.679073
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: emits telemetry if opted in
|
|
ok 9 - RelayHealthService: emits telemetry if opted in
|
|
---
|
|
duration_ms: 0.925027
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
ok 10 - RelayHealthService: checkRelay times out after DEFAULT_TIMEOUT_MS
|
|
---
|
|
duration_ms: 9.840611
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: failure threshold triggers user warning
|
|
ok 11 - RelayHealthService: failure threshold triggers user warning
|
|
---
|
|
duration_ms: 0.878985
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: user warning respects cooldown
|
|
ok 12 - RelayHealthService: user warning respects cooldown
|
|
---
|
|
duration_ms: 0.486604
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: relay disconnect/error events trigger failure
|
|
ok 13 - RelayHealthService: relay disconnect/error events trigger failure
|
|
---
|
|
duration_ms: 0.25749
|
|
type: 'test'
|
|
...
|
|
# Subtest: RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
ok 14 - RelayHealthService: integrates with nostrClient.markRelayUnreachable
|
|
---
|
|
duration_ms: 0.257164
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 5016.370654
|
|
|
|
→ Running tests/services/s3Service.test.mjs
|
|
TAP version 13
|
|
# Subtest: s3Service
|
|
# Subtest: validateS3Connection
|
|
# Subtest: should validate correct configuration
|
|
ok 1 - should validate correct configuration
|
|
---
|
|
duration_ms: 1.547436
|
|
type: 'test'
|
|
...
|
|
# Subtest: should throw on missing required fields
|
|
ok 2 - should throw on missing required fields
|
|
---
|
|
duration_ms: 0.64003
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - validateS3Connection
|
|
---
|
|
duration_ms: 3.319397
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getCorsOrigins
|
|
# Subtest: should return current origin
|
|
ok 1 - should return current origin
|
|
---
|
|
duration_ms: 83.412004
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle localhost
|
|
ok 2 - should handle localhost
|
|
---
|
|
duration_ms: 13.928004
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - getCorsOrigins
|
|
---
|
|
duration_ms: 97.721392
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - s3Service
|
|
---
|
|
duration_ms: 101.868615
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 3
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 116.952394
|
|
|
|
→ Running tests/services/s3UploadService.test.mjs
|
|
TAP version 13
|
|
# Subtest: S3UploadService
|
|
# Subtest: constructor initializes listeners
|
|
ok 1 - constructor initializes listeners
|
|
---
|
|
duration_ms: 1.358879
|
|
type: 'test'
|
|
...
|
|
# Subtest: Event Emitter Logic
|
|
ok 2 - Event Emitter Logic
|
|
---
|
|
duration_ms: 1.402423
|
|
type: 'test'
|
|
...
|
|
# Subtest: emit handles listener errors safely
|
|
ok 3 - emit handles listener errors safely
|
|
---
|
|
duration_ms: 0.523691
|
|
type: 'test'
|
|
...
|
|
# Subtest: verifyConnection
|
|
ok 4 - verifyConnection
|
|
---
|
|
duration_ms: 0.502268
|
|
type: 'test'
|
|
...
|
|
# Subtest: prepareUpload
|
|
ok 5 - prepareUpload
|
|
---
|
|
duration_ms: 0.467505
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadFile
|
|
# Subtest: validates parameters
|
|
ok 1 - validates parameters
|
|
---
|
|
duration_ms: 0.902376
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads successfully
|
|
ok 2 - uploads successfully
|
|
---
|
|
duration_ms: 0.950071
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - uploadFile
|
|
---
|
|
duration_ms: 2.603616
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploadVideo
|
|
# Subtest: fails if npub missing
|
|
ok 1 - fails if npub missing
|
|
---
|
|
duration_ms: 0.987178
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if title missing
|
|
ok 2 - fails if title missing
|
|
---
|
|
duration_ms: 0.476583
|
|
type: 'test'
|
|
...
|
|
# Subtest: fails if file missing
|
|
ok 3 - fails if file missing
|
|
---
|
|
duration_ms: 0.244158
|
|
type: 'test'
|
|
...
|
|
# Subtest: successful upload flow
|
|
ok 4 - successful upload flow
|
|
---
|
|
duration_ms: 2.448195
|
|
type: 'test'
|
|
...
|
|
# Subtest: uploads thumbnail if provided
|
|
ok 5 - uploads thumbnail if provided
|
|
---
|
|
duration_ms: 0.669807
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles validation errors from normalizeVideoNotePayload
|
|
ok 6 - handles validation errors from normalizeVideoNotePayload
|
|
---
|
|
duration_ms: 0.355645
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles upload exception
|
|
ok 7 - handles upload exception
|
|
---
|
|
duration_ms: 0.479025
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 7 - uploadVideo
|
|
---
|
|
duration_ms: 7.014804
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - S3UploadService
|
|
---
|
|
duration_ms: 16.362307
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 0
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 36.783345
|
|
|
|
→ Running tests/services/trustBootstrap.test.mjs
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:150:11)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl ready check timed out
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:147:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at runAsyncRetry (file:///app/js/services/trustBootstrap.js:160:13)
|
|
[bitvid] [bootstrap] Failed to hydrate admin lists for trusted seeds Error: accessControl failed
|
|
at AccessControl.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:164:13)
|
|
at Object.apply (node:internal/test_runner/mock/mock:765:20)
|
|
at waitForAccessControl (file:///app/js/services/trustBootstrap.js:80:39)
|
|
at hydrate (file:///app/js/services/trustBootstrap.js:138:28)
|
|
at bootstrapTrustedSeeds (file:///app/js/services/trustBootstrap.js:151:31)
|
|
at TestContext.<anonymous> (file:///app/tests/services/trustBootstrap.test.mjs:171:30)
|
|
at Test.runInAsyncScope (node:async_hooks:214:14)
|
|
at Test.run (node:internal/test_runner/test:1047:25)
|
|
at async Suite.processPendingSubtests (node:internal/test_runner/test:744:7)
|
|
TAP version 13
|
|
# Subtest: trustBootstrap
|
|
# Subtest: should return early if feature is disabled
|
|
ok 1 - should return early if feature is disabled
|
|
---
|
|
duration_ms: 2.976211
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply seeds when accessControl is ready
|
|
ok 2 - should apply seeds when accessControl is ready
|
|
---
|
|
duration_ms: 1.441056
|
|
type: 'test'
|
|
...
|
|
# Subtest: should subscribe to accessControl changes
|
|
ok 3 - should subscribe to accessControl changes
|
|
---
|
|
duration_ms: 1.149411
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle accessControl timeout and apply seeds anyway
|
|
ok 4 - should handle accessControl timeout and apply seeds anyway
|
|
---
|
|
duration_ms: 2.65068
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recompute summaries after applying seeds
|
|
ok 5 - should recompute summaries after applying seeds
|
|
---
|
|
duration_ms: 0.609275
|
|
type: 'test'
|
|
...
|
|
# Subtest: should wait for relays if hydration fails initially
|
|
ok 6 - should wait for relays if hydration fails initially
|
|
---
|
|
duration_ms: 301.74623
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - trustBootstrap
|
|
---
|
|
duration_ms: 312.921455
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3770.832485
|
|
|
|
→ Running tests/share-event-builder.test.mjs
|
|
TAP version 13
|
|
# Subtest: buildShareEvent preserves share content
|
|
ok 1 - buildShareEvent preserves share content
|
|
---
|
|
duration_ms: 2.208393
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent normalizes hex identifiers for e and p tags
|
|
ok 2 - buildShareEvent normalizes hex identifiers for e and p tags
|
|
---
|
|
duration_ms: 1.794132
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent includes sanitized relay hints
|
|
ok 3 - buildShareEvent includes sanitized relay hints
|
|
---
|
|
duration_ms: 0.558102
|
|
type: 'test'
|
|
...
|
|
# Subtest: buildShareEvent tolerates missing optional fields
|
|
ok 4 - buildShareEvent tolerates missing optional fields
|
|
---
|
|
duration_ms: 0.284413
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.570437
|
|
|
|
→ Running tests/shareNostrController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ShareNostrController
|
|
# Subtest: handleShare shares video successfully
|
|
ok 1 - handleShare shares video successfully
|
|
---
|
|
duration_ms: 2.336591
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleShare throws error if missing video details
|
|
ok 2 - handleShare throws error if missing video details
|
|
---
|
|
duration_ms: 0.992274
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal shows error if no video
|
|
ok 3 - openModal shows error if no video
|
|
---
|
|
duration_ms: 0.757889
|
|
type: 'test'
|
|
...
|
|
# Subtest: openModal opens modal with correct payload
|
|
ok 4 - openModal opens modal with correct payload
|
|
---
|
|
duration_ms: 0.43692
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - ShareNostrController
|
|
---
|
|
duration_ms: 7.006234
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 20.948613
|
|
|
|
→ Running tests/sign-request-queue.test.mjs
|
|
TAP version 13
|
|
# Subtest: queueSignEvent executes successfully
|
|
ok 1 - queueSignEvent executes successfully
|
|
---
|
|
duration_ms: 1.774941
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes sequentially for same signer
|
|
ok 2 - queueSignEvent executes sequentially for same signer
|
|
---
|
|
duration_ms: 102.397322
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent executes concurrently for different signers
|
|
ok 3 - queueSignEvent executes concurrently for different signers
|
|
---
|
|
duration_ms: 52.065809
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent times out
|
|
ok 4 - queueSignEvent times out
|
|
---
|
|
duration_ms: 51.813513
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent normalizes errors
|
|
ok 5 - queueSignEvent normalizes errors
|
|
---
|
|
duration_ms: 0.736394
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles signer disconnect
|
|
ok 6 - queueSignEvent handles signer disconnect
|
|
---
|
|
duration_ms: 0.634956
|
|
type: 'test'
|
|
...
|
|
# Subtest: queueSignEvent handles missing signer
|
|
ok 7 - queueSignEvent handles missing signer
|
|
---
|
|
duration_ms: 0.431471
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
# tests 7
|
|
# suites 0
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 365.320458
|
|
|
|
→ Running tests/state/appState.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppState
|
|
# Subtest: getters and setters work for simple values
|
|
ok 1 - getters and setters work for simple values
|
|
---
|
|
duration_ms: 1.480488
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppStateKey fires on change
|
|
ok 2 - subscribeToAppStateKey fires on change
|
|
---
|
|
duration_ms: 0.627164
|
|
type: 'test'
|
|
...
|
|
# Subtest: subscribeToAppState fires on any change
|
|
ok 3 - subscribeToAppState fires on any change
|
|
---
|
|
duration_ms: 0.436263
|
|
type: 'test'
|
|
...
|
|
# Subtest: setModalState updates state and notifies
|
|
ok 4 - setModalState updates state and notifies
|
|
---
|
|
duration_ms: 0.698621
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetAppState clears everything
|
|
ok 5 - resetAppState clears everything
|
|
---
|
|
duration_ms: 0.644293
|
|
type: 'test'
|
|
...
|
|
# Subtest: setVideosMap only accepts Maps or null
|
|
ok 6 - setVideosMap only accepts Maps or null
|
|
---
|
|
duration_ms: 0.323043
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - AppState
|
|
---
|
|
duration_ms: 6.041854
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 1
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.442166
|
|
|
|
→ Running tests/state/cache-saved-profiles.test.mjs
|
|
TAP version 13
|
|
# Subtest: persistSavedProfiles preserves custom authType strings
|
|
ok 1 - persistSavedProfiles preserves custom authType strings
|
|
---
|
|
duration_ms: 2.016339
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage retains custom provider authType
|
|
ok 2 - loadSavedProfilesFromStorage retains custom provider authType
|
|
---
|
|
duration_ms: 0.526612
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
ok 3 - loadSavedProfilesFromStorage migrates missing authType to nip07
|
|
---
|
|
duration_ms: 0.364428
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage trims stored authType values
|
|
ok 4 - loadSavedProfilesFromStorage trims stored authType values
|
|
---
|
|
duration_ms: 0.309419
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
ok 5 - loadSavedProfilesFromStorage ignores legacy userPubKey
|
|
---
|
|
duration_ms: 0.228257
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.453596
|
|
|
|
→ Running tests/state/cache.test.mjs
|
|
TAP version 13
|
|
# Subtest: js/state/cache.js
|
|
# Subtest: Saved Profiles Persistence
|
|
ok 1 - Saved Profiles Persistence
|
|
---
|
|
duration_ms: 2.221388
|
|
type: 'test'
|
|
...
|
|
# Subtest: Active Profile Pubkey
|
|
ok 2 - Active Profile Pubkey
|
|
---
|
|
duration_ms: 0.669559
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Caching
|
|
ok 3 - URL Health Caching
|
|
---
|
|
duration_ms: 0.664087
|
|
type: 'test'
|
|
...
|
|
# Subtest: URL Health Expiration
|
|
ok 4 - URL Health Expiration
|
|
---
|
|
duration_ms: 11.044249
|
|
type: 'test'
|
|
...
|
|
# Subtest: Moderation Settings
|
|
ok 5 - Moderation Settings
|
|
---
|
|
duration_ms: 1.265265
|
|
type: 'test'
|
|
...
|
|
# Subtest: Legacy Moderation Overrides Support
|
|
# Subtest: ignores legacy v1 overrides
|
|
ok 1 - ignores legacy v1 overrides
|
|
---
|
|
duration_ms: 0.430648
|
|
type: 'test'
|
|
...
|
|
# Subtest: loads v2 overrides
|
|
ok 2 - loads v2 overrides
|
|
---
|
|
duration_ms: 0.619432
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 6 - Legacy Moderation Overrides Support
|
|
---
|
|
duration_ms: 1.898537
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - js/state/cache.js
|
|
---
|
|
duration_ms: 20.843653
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 28.788944
|
|
|
|
→ Running tests/state/profile-cache.test.mjs
|
|
[bitvid] [ProfileCache] Expired watchHistory for 1111111111111111111111111111111111111111111111111111111111111111
|
|
TAP version 13
|
|
# Subtest: ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
ok 1 - ProfileCache: normalizeHexPubkey validates and cleans inputs
|
|
---
|
|
duration_ms: 1.879075
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: resolves storage keys correctly
|
|
ok 2 - ProfileCache: resolves storage keys correctly
|
|
---
|
|
duration_ms: 0.730253
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: persists data to localStorage and memory
|
|
ok 3 - ProfileCache: persists data to localStorage and memory
|
|
---
|
|
duration_ms: 1.654765
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: loads from localStorage if memory miss
|
|
ok 4 - ProfileCache: loads from localStorage if memory miss
|
|
---
|
|
duration_ms: 0.33631
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: handles active profile switching
|
|
ok 5 - ProfileCache: handles active profile switching
|
|
---
|
|
duration_ms: 0.970596
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile normalizes and saves
|
|
ok 6 - ProfileCache: setProfile normalizes and saves
|
|
---
|
|
duration_ms: 1.057353
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: emits events on active profile change
|
|
ok 7 - ProfileCache: emits events on active profile change
|
|
---
|
|
duration_ms: 0.446602
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: respects TTL expiration
|
|
ok 8 - ProfileCache: respects TTL expiration
|
|
---
|
|
duration_ms: 1.234765
|
|
type: 'test'
|
|
...
|
|
# Subtest: ProfileCache: setProfile sanitizes XSS in media URLs
|
|
ok 9 - ProfileCache: setProfile sanitizes XSS in media URLs
|
|
---
|
|
duration_ms: 1.26814
|
|
type: 'test'
|
|
...
|
|
1..9
|
|
# tests 9
|
|
# suites 0
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.967149
|
|
|
|
→ Running tests/state/profile-settings-store.test.mjs
|
|
TAP version 13
|
|
# Subtest: profile settings store clones values and tracks entries
|
|
ok 1 - profile settings store clones values and tracks entries
|
|
---
|
|
duration_ms: 2.658048
|
|
type: 'test'
|
|
...
|
|
# Subtest: profile settings store ignores falsy keys and survives clone failures
|
|
ok 2 - profile settings store ignores falsy keys and survives clone failures
|
|
---
|
|
duration_ms: 0.345746
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.161916
|
|
|
|
→ Running tests/storage-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: StorageService
|
|
# Subtest: init() creates database and object store
|
|
ok 1 - init() creates database and object store
|
|
---
|
|
duration_ms: 10.678051
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() generates and stores master key with NIP-44
|
|
ok 2 - unlock() generates and stores master key with NIP-44
|
|
---
|
|
duration_ms: 9.987407
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() restores existing master key
|
|
ok 3 - unlock() restores existing master key
|
|
---
|
|
duration_ms: 4.735307
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
ok 4 - unlock() falls back to NIP-04 if NIP-44 unavailable
|
|
---
|
|
duration_ms: 3.40625
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes permission denied decrypt errors
|
|
ok 5 - unlock() normalizes permission denied decrypt errors
|
|
---
|
|
duration_ms: 3.956488
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes missing decryptor errors
|
|
ok 6 - unlock() normalizes missing decryptor errors
|
|
---
|
|
duration_ms: 5.211238
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Locked storage for 00000000...
|
|
# Subtest: unlock() normalizes unknown decrypt errors
|
|
ok 7 - unlock() normalizes unknown decrypt errors
|
|
---
|
|
duration_ms: 2.638685
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: saveConnection() encrypts and stores connection
|
|
ok 8 - saveConnection() encrypts and stores connection
|
|
---
|
|
duration_ms: 4.348004
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
# Subtest: getConnection() decrypts and returns connection
|
|
ok 9 - getConnection() decrypts and returns connection
|
|
---
|
|
duration_ms: 4.17891
|
|
type: 'test'
|
|
...
|
|
# Subtest: getConnection() throws if locked
|
|
ok 10 - getConnection() throws if locked
|
|
---
|
|
duration_ms: 1.342453
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Deleted connection conn_1
|
|
# Subtest: deleteConnection() removes connection
|
|
ok 11 - deleteConnection() removes connection
|
|
---
|
|
duration_ms: 3.086835
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: setDefaultConnection() updates metadata
|
|
ok 12 - setDefaultConnection() updates metadata
|
|
---
|
|
duration_ms: 3.601597
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection conn_1
|
|
[bitvid] [StorageService] Saved connection conn_2
|
|
# Subtest: saveConnection() with defaultForUploads=true clears other defaults
|
|
ok 13 - saveConnection() with defaultForUploads=true clears other defaults
|
|
---
|
|
duration_ms: 3.315092
|
|
type: 'test'
|
|
...
|
|
1..13
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 63.029769
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 13
|
|
# suites 1
|
|
# pass 13
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 71.293976
|
|
|
|
→ Running tests/subscriptions-manager.test.mjs
|
|
[bitvid] [nostr] Relay backoff applied. {
|
|
relay: 'wss://relay-b.example',
|
|
backoffMs: 1000,
|
|
failureCount: 1,
|
|
retryAt: 1770906703709,
|
|
reason: null
|
|
}
|
|
TAP version 13
|
|
# Subtest: loadSubscriptions aggregates relay results when one rejects
|
|
ok 1 - loadSubscriptions aggregates relay results when one rejects
|
|
---
|
|
duration_ms: 10.944929
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions queries the correct subscription list kind
|
|
ok 2 - loadSubscriptions queries the correct subscription list kind
|
|
---
|
|
duration_ms: 0.997408
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions falls back to nip44 when hinted
|
|
ok 3 - loadSubscriptions falls back to nip44 when hinted
|
|
---
|
|
duration_ms: 1.813329
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions handles nip44.v2 decryptors
|
|
ok 4 - loadSubscriptions handles nip44.v2 decryptors
|
|
---
|
|
duration_ms: 1.289708
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions prefers nip44 decryptors when both are available
|
|
ok 5 - loadSubscriptions prefers nip44 decryptors when both are available
|
|
---
|
|
duration_ms: 1.393684
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
ok 6 - loadSubscriptions uses active signer decryptors without requesting extension permissions
|
|
---
|
|
duration_ms: 1.244947
|
|
type: 'test'
|
|
...
|
|
# Subtest: loadSubscriptions retries permission-required decrypts only when enabled
|
|
ok 7 - loadSubscriptions retries permission-required decrypts only when enabled
|
|
---
|
|
duration_ms: 1.288537
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
ok 8 - showSubscriptionVideos waits for nostrService warm-up and refreshes after updates
|
|
---
|
|
duration_ms: 92.78486
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureLoaded memoizes concurrent loads
|
|
ok 9 - ensureLoaded memoizes concurrent loads
|
|
---
|
|
duration_ms: 8.288905
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
ok 10 - publishSubscriptionList succeeds with direct signer without requesting extension permissions
|
|
---
|
|
duration_ms: 2.664709
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList prefers nip44 encryption when available
|
|
ok 11 - publishSubscriptionList prefers nip44 encryption when available
|
|
---
|
|
duration_ms: 0.988737
|
|
type: 'test'
|
|
...
|
|
# Subtest: publishSubscriptionList falls back to nip04 when nip44 fails
|
|
ok 12 - publishSubscriptionList falls back to nip04 when nip44 fails
|
|
---
|
|
duration_ms: 1.03744
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle shows empty state message
|
|
ok 13 - renderSameGridStyle shows empty state message
|
|
---
|
|
duration_ms: 14.136755
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderSameGridStyle forwards moderation badge actions to the application
|
|
ok 14 - renderSameGridStyle forwards moderation badge actions to the application
|
|
---
|
|
duration_ms: 65.627473
|
|
type: 'test'
|
|
...
|
|
1..14
|
|
# tests 14
|
|
# suites 0
|
|
# pass 14
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 6025.502873
|
|
|
|
→ Running tests/torrent/service-worker-fallback-message.test.mjs
|
|
TAP version 13
|
|
# Subtest: returns generic message when error missing
|
|
ok 1 - returns generic message when error missing
|
|
---
|
|
duration_ms: 2.488385
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies HTTPS requirement errors
|
|
ok 2 - identifies HTTPS requirement errors
|
|
---
|
|
duration_ms: 0.210206
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies disabled service worker errors
|
|
ok 3 - identifies disabled service worker errors
|
|
---
|
|
duration_ms: 0.237557
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies Brave specific guidance
|
|
ok 4 - identifies Brave specific guidance
|
|
---
|
|
duration_ms: 0.195386
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies blocked script errors
|
|
ok 5 - identifies blocked script errors
|
|
---
|
|
duration_ms: 0.169724
|
|
type: 'test'
|
|
...
|
|
# Subtest: identifies controller claim timeout
|
|
ok 6 - identifies controller claim timeout
|
|
---
|
|
duration_ms: 0.155125
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.266973
|
|
|
|
→ Running tests/torrent/style-helpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/styleHelpers
|
|
# Subtest: returns null when no element is provided
|
|
ok 1 - returns null when no element is provided
|
|
---
|
|
duration_ms: 0.948501
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns the original element without mutations
|
|
ok 2 - returns the original element without mutations
|
|
---
|
|
duration_ms: 74.977473
|
|
type: 'test'
|
|
...
|
|
# Subtest: provides an empty, frozen fallback map
|
|
ok 3 - provides an empty, frozen fallback map
|
|
---
|
|
duration_ms: 1.323353
|
|
type: 'test'
|
|
...
|
|
# Subtest: no-ops when removing styles
|
|
ok 4 - no-ops when removing styles
|
|
---
|
|
duration_ms: 9.404521
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - torrent/ui/styleHelpers
|
|
---
|
|
duration_ms: 88.225829
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 101.373519
|
|
|
|
→ Running tests/torrent/toast-service.test.mjs
|
|
TAP version 13
|
|
# Subtest: torrent/ui/toastService
|
|
# Subtest: renders a toast with Tailwind token classes and removes it on dismiss
|
|
ok 1 - renders a toast with Tailwind token classes and removes it on dismiss
|
|
---
|
|
duration_ms: 350.329291
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 1 - torrent/ui/toastService
|
|
---
|
|
duration_ms: 351.646691
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 1
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 360.575179
|
|
|
|
→ Running tests/ui/app-chrome-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: AppChromeController binds upload button when elements hydrate later
|
|
ok 1 - AppChromeController binds upload button when elements hydrate later
|
|
---
|
|
duration_ms: 90.849011
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 101.531594
|
|
|
|
→ Running tests/ui/components/debug_hashtag_strip_helper.test.mjs
|
|
Global ResizeObserver type: function
|
|
Helper window ResizeObserver: undefined
|
|
TAP version 13
|
|
# Subtest: Debug HashtagStripHelper fallback
|
|
ok 1 - Debug HashtagStripHelper fallback
|
|
---
|
|
duration_ms: 99.380474
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 109.121565
|
|
|
|
→ Running tests/ui/components/hashtagStripHelper.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper uses ResizeObserver when available
|
|
ok 1 - HashtagStripHelper uses ResizeObserver when available
|
|
---
|
|
duration_ms: 102.451992
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with RAF
|
|
ok 2 - HashtagStripHelper falls back to window resize with RAF
|
|
---
|
|
duration_ms: 16.431002
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
ok 3 - HashtagStripHelper falls back to window resize with setTimeout when RAF is missing
|
|
---
|
|
duration_ms: 14.154776
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper handles teardown correctly
|
|
ok 4 - HashtagStripHelper handles teardown correctly
|
|
---
|
|
duration_ms: 9.778895
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 161.948291
|
|
|
|
→ Running tests/ui/components/videoMenuRenderers.test.mjs
|
|
TAP version 13
|
|
# Subtest: createVideoMoreMenuPanel - basic rendering
|
|
ok 1 - createVideoMoreMenuPanel - basic rendering
|
|
---
|
|
duration_ms: 119.213074
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - pointer info rendering
|
|
ok 2 - createVideoMoreMenuPanel - pointer info rendering
|
|
---
|
|
duration_ms: 13.149368
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - mirror logic
|
|
ok 3 - createVideoMoreMenuPanel - mirror logic
|
|
---
|
|
duration_ms: 11.681242
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoMoreMenuPanel - blacklist logic
|
|
ok 4 - createVideoMoreMenuPanel - blacklist logic
|
|
---
|
|
duration_ms: 11.380868
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - permission logic
|
|
ok 5 - createVideoShareMenuPanel - permission logic
|
|
---
|
|
duration_ms: 14.028873
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoShareMenuPanel - magnet/cdn logic
|
|
ok 6 - createVideoShareMenuPanel - magnet/cdn logic
|
|
---
|
|
duration_ms: 9.878489
|
|
type: 'test'
|
|
...
|
|
# Subtest: createChannelProfileMenuPanel - basic actions
|
|
ok 7 - createChannelProfileMenuPanel - basic actions
|
|
---
|
|
duration_ms: 10.085777
|
|
type: 'test'
|
|
...
|
|
# Subtest: createVideoSettingsMenuPanel - capabilities
|
|
ok 8 - createVideoSettingsMenuPanel - capabilities
|
|
---
|
|
duration_ms: 9.958747
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 220.332251
|
|
|
|
→ Running tests/ui/creatorProfileController.test.mjs
|
|
TAP version 13
|
|
# Subtest: CreatorProfileController
|
|
# Subtest: resolveCreatorProfileFromSources prioritizes cached profile
|
|
ok 1 - resolveCreatorProfileFromSources prioritizes cached profile
|
|
---
|
|
duration_ms: 1.334815
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCreatorProfileFromSources falls back to fetched profile
|
|
ok 2 - resolveCreatorProfileFromSources falls back to fetched profile
|
|
---
|
|
duration_ms: 0.299936
|
|
type: 'test'
|
|
...
|
|
# Subtest: decorateVideoCreatorIdentity modifies video object
|
|
ok 3 - decorateVideoCreatorIdentity modifies video object
|
|
---
|
|
duration_ms: 0.545368
|
|
type: 'test'
|
|
...
|
|
# Subtest: fetchModalCreatorProfile fetches profile and updates modal
|
|
ok 4 - fetchModalCreatorProfile fetches profile and updates modal
|
|
---
|
|
duration_ms: 1.183687
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - CreatorProfileController
|
|
---
|
|
duration_ms: 6.25741
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.126208
|
|
|
|
→ Running tests/ui/dm/zapHelpers.test.mjs
|
|
TAP version 13
|
|
# Subtest: formatZapAmount
|
|
# Subtest: formats standard amounts correctly
|
|
ok 1 - formats standard amounts correctly
|
|
---
|
|
duration_ms: 23.696688
|
|
type: 'test'
|
|
...
|
|
# Subtest: formats compact amounts correctly
|
|
ok 2 - formats compact amounts correctly
|
|
---
|
|
duration_ms: 0.756929
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles zero and small numbers
|
|
ok 3 - handles zero and small numbers
|
|
---
|
|
duration_ms: 0.549926
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles invalid inputs gracefully
|
|
ok 4 - handles invalid inputs gracefully
|
|
---
|
|
duration_ms: 0.42067
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles string number inputs
|
|
ok 5 - handles string number inputs
|
|
---
|
|
duration_ms: 0.265497
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - formatZapAmount
|
|
---
|
|
duration_ms: 27.401917
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aggregateZapTotals
|
|
# Subtest: aggregates totals correctly
|
|
ok 1 - aggregates totals correctly
|
|
---
|
|
duration_ms: 0.400506
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles empty input
|
|
ok 2 - handles empty input
|
|
---
|
|
duration_ms: 0.337031
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles non-array input
|
|
ok 3 - handles non-array input
|
|
---
|
|
duration_ms: 0.374264
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing or invalid amounts
|
|
ok 4 - handles missing or invalid amounts
|
|
---
|
|
duration_ms: 0.412199
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles missing IDs
|
|
ok 5 - handles missing IDs
|
|
---
|
|
duration_ms: 0.39253
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 2 - aggregateZapTotals
|
|
---
|
|
duration_ms: 2.468249
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeZapReceipt
|
|
# Subtest: normalizes valid receipt
|
|
ok 1 - normalizes valid receipt
|
|
---
|
|
duration_ms: 0.294122
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes receipt with amount fallback
|
|
ok 2 - normalizes receipt with amount fallback
|
|
---
|
|
duration_ms: 0.133556
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes empty receipt
|
|
ok 3 - normalizes empty receipt
|
|
---
|
|
duration_ms: 0.10341
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes undefined receipt
|
|
ok 4 - normalizes undefined receipt
|
|
---
|
|
duration_ms: 0.116113
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes invalid amount
|
|
ok 5 - normalizes invalid amount
|
|
---
|
|
duration_ms: 0.100061
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - normalizeZapReceipt
|
|
---
|
|
duration_ms: 0.976193
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
# tests 15
|
|
# suites 3
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 53.560297
|
|
|
|
→ Running tests/ui/engagement-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: EngagementController
|
|
# Subtest: handleRepostAction - should show error if no event ID is available
|
|
ok 1 - handleRepostAction - should show error if no event ID is available
|
|
---
|
|
duration_ms: 2.821302
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should call repostEvent with correct parameters
|
|
ok 2 - handleRepostAction - should call repostEvent with correct parameters
|
|
---
|
|
duration_ms: 0.754219
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should handle failure from repostEvent
|
|
ok 3 - handleRepostAction - should handle failure from repostEvent
|
|
---
|
|
duration_ms: 0.562635
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleRepostAction - should use currentVideoPointer when in modal context
|
|
ok 4 - handleRepostAction - should use currentVideoPointer when in modal context
|
|
---
|
|
duration_ms: 0.562155
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should show error if video has no URL
|
|
ok 5 - handleMirrorAction - should show error if video has no URL
|
|
---
|
|
duration_ms: 0.976319
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
ok 6 - handleMirrorAction - should call mirrorVideoEvent when URL is provided
|
|
---
|
|
duration_ms: 0.512844
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleMirrorAction - should prevent mirroring private videos
|
|
ok 7 - handleMirrorAction - should prevent mirroring private videos
|
|
---
|
|
duration_ms: 0.513254
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show error if no event ID
|
|
ok 8 - handleEnsurePresenceAction - should show error if no event ID
|
|
---
|
|
duration_ms: 0.667141
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should handle throttled response
|
|
ok 9 - handleEnsurePresenceAction - should handle throttled response
|
|
---
|
|
duration_ms: 0.760138
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
ok 10 - handleEnsurePresenceAction - should show success on successful rebroadcast
|
|
---
|
|
duration_ms: 0.447565
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
ok 1 - EngagementController
|
|
---
|
|
duration_ms: 12.276823
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.932707
|
|
|
|
→ Running tests/ui/hashtag-strip-helper-bounce.test.mjs
|
|
TAP version 13
|
|
# Subtest: HashtagStripHelper triggers scroll hint when content overflows
|
|
ok 1 - HashtagStripHelper triggers scroll hint when content overflows
|
|
---
|
|
duration_ms: 98.474943
|
|
type: 'test'
|
|
...
|
|
# Subtest: HashtagStripHelper does not trigger scroll hint when no overflow
|
|
ok 2 - HashtagStripHelper does not trigger scroll hint when no overflow
|
|
---
|
|
duration_ms: 12.73861
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 127.47112
|
|
|
|
→ Running tests/ui/popoverEngine.test.mjs
|
|
TAP version 13
|
|
# Subtest: opens a popover in the overlay root and positions the panel
|
|
ok 1 - opens a popover in the overlay root and positions the panel
|
|
---
|
|
duration_ms: 348.384721
|
|
type: 'test'
|
|
...
|
|
# Subtest: positions bottom-end panels flush with the trigger's right edge
|
|
ok 2 - positions bottom-end panels flush with the trigger's right edge
|
|
---
|
|
duration_ms: 54.276806
|
|
type: 'test'
|
|
...
|
|
# Subtest: closes on outside pointer events and restores focus
|
|
ok 3 - closes on outside pointer events and restores focus
|
|
---
|
|
duration_ms: 36.827117
|
|
type: 'test'
|
|
...
|
|
# Subtest: supports roving focus, home/end navigation, and typeahead
|
|
ok 4 - supports roving focus, home/end navigation, and typeahead
|
|
---
|
|
duration_ms: 45.872537
|
|
type: 'test'
|
|
...
|
|
# Subtest: escape closes the popover and restores trigger focus
|
|
ok 5 - escape closes the popover and restores trigger focus
|
|
---
|
|
duration_ms: 33.711508
|
|
type: 'test'
|
|
...
|
|
# Subtest: close respects restoreFocus option for contextual menus
|
|
ok 6 - close respects restoreFocus option for contextual menus
|
|
---
|
|
duration_ms: 31.83765
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensures only one popover is open at a time
|
|
ok 7 - ensures only one popover is open at a time
|
|
---
|
|
duration_ms: 67.251408
|
|
type: 'test'
|
|
...
|
|
# Subtest: applies token-based sizing and arrow positioning
|
|
ok 8 - applies token-based sizing and arrow positioning
|
|
---
|
|
duration_ms: 48.613631
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
# tests 8
|
|
# suites 0
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 680.479596
|
|
|
|
→ Running tests/ui/profile-modal-moderation-settings.test.mjs
|
|
TAP version 13
|
|
# Subtest: moderation settings save updates service and disables control
|
|
ok 1 - moderation settings save updates service and disables control
|
|
---
|
|
duration_ms: 160.484215
|
|
type: 'test'
|
|
...
|
|
# Subtest: moderation reset restores defaults and clearing inputs uses defaults
|
|
ok 2 - moderation reset restores defaults and clearing inputs uses defaults
|
|
---
|
|
duration_ms: 35.391655
|
|
type: 'test'
|
|
...
|
|
# Subtest: guest fallback uses config moderation defaults
|
|
ok 3 - guest fallback uses config moderation defaults
|
|
---
|
|
duration_ms: 22.685895
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 234.140116
|
|
|
|
→ Running tests/ui/profileModalController-addProfile.test.mjs
|
|
Success: Profile added. Select it when you're ready to switch.
|
|
Success: That profile is already saved on this device.
|
|
TAP version 13
|
|
# Subtest: handleAddProfile adds a new profile correctly
|
|
ok 1 - handleAddProfile adds a new profile correctly
|
|
---
|
|
duration_ms: 147.713236
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile prevents duplicates
|
|
ok 2 - handleAddProfile prevents duplicates
|
|
---
|
|
duration_ms: 21.977099
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles missing login result
|
|
ok 3 - handleAddProfile handles missing login result
|
|
---
|
|
duration_ms: 24.015124
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleAddProfile handles errors gracefully
|
|
ok 4 - handleAddProfile handles errors gracefully
|
|
---
|
|
duration_ms: 19.271801
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 227.76647
|
|
|
|
→ Running tests/ui/reactionController.test.mjs
|
|
TAP version 13
|
|
# Subtest: ReactionController
|
|
# Subtest: should subscribe to reactions
|
|
ok 1 - should subscribe to reactions
|
|
---
|
|
duration_ms: 2.799489
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle reaction update from subscription
|
|
ok 2 - should handle reaction update from subscription
|
|
---
|
|
duration_ms: 0.638484
|
|
type: 'test'
|
|
...
|
|
# Subtest: should apply optimistic update on handleReaction
|
|
ok 3 - should apply optimistic update on handleReaction
|
|
---
|
|
duration_ms: 1.099585
|
|
type: 'test'
|
|
...
|
|
# Subtest: should rollback optimistic update on publish failure
|
|
ok 4 - should rollback optimistic update on publish failure
|
|
---
|
|
duration_ms: 0.744525
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not react if user not logged in
|
|
ok 5 - should not react if user not logged in
|
|
---
|
|
duration_ms: 0.784357
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - ReactionController
|
|
---
|
|
duration_ms: 7.839396
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 1
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 21.498735
|
|
|
|
→ Running tests/ui/similar-content-card.test.mjs
|
|
TAP version 13
|
|
# Subtest: cached thumbnails reuse existing src without lazy-loading
|
|
ok 1 - cached thumbnails reuse existing src without lazy-loading
|
|
---
|
|
duration_ms: 237.440025
|
|
type: 'test'
|
|
...
|
|
# Subtest: uncached thumbnails use fallback, cache on load, and retain blur state
|
|
ok 2 - uncached thumbnails use fallback, cache on load, and retain blur state
|
|
---
|
|
duration_ms: 34.582298
|
|
type: 'test'
|
|
...
|
|
# Subtest: primary clicks trigger onPlay while modifiers and right clicks do not
|
|
ok 3 - primary clicks trigger onPlay while modifiers and right clicks do not
|
|
---
|
|
duration_ms: 18.348207
|
|
type: 'test'
|
|
...
|
|
# Subtest: author identity fields render supplied values and datasets
|
|
ok 4 - author identity fields render supplied values and datasets
|
|
---
|
|
duration_ms: 17.460673
|
|
type: 'test'
|
|
...
|
|
# Subtest: view counter wiring exposes pointer datasets
|
|
ok 5 - view counter wiring exposes pointer datasets
|
|
---
|
|
duration_ms: 17.637796
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 340.335861
|
|
|
|
→ Running tests/ui/similarContentController.test.mjs
|
|
TAP version 13
|
|
# Subtest: SimilarContentController
|
|
# Subtest: extractDTagValue
|
|
# Subtest: should return the 'd' tag value
|
|
ok 1 - should return the 'd' tag value
|
|
---
|
|
duration_ms: 1.671527
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string if no 'd' tag
|
|
ok 2 - should return empty string if no 'd' tag
|
|
---
|
|
duration_ms: 0.604527
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - extractDTagValue
|
|
---
|
|
duration_ms: 3.224168
|
|
type: 'suite'
|
|
...
|
|
# Subtest: computeCandidates
|
|
# Subtest: should return empty array if no active video
|
|
ok 1 - should return empty array if no active video
|
|
---
|
|
duration_ms: 1.823815
|
|
type: 'test'
|
|
...
|
|
# Subtest: should compute similar candidates based on tags
|
|
ok 2 - should compute similar candidates based on tags
|
|
---
|
|
duration_ms: 1.525149
|
|
type: 'test'
|
|
...
|
|
# Subtest: should exclude blocked authors
|
|
ok 3 - should exclude blocked authors
|
|
---
|
|
duration_ms: 0.739178
|
|
type: 'test'
|
|
...
|
|
# Subtest: should prioritize higher shared tag count
|
|
ok 4 - should prioritize higher shared tag count
|
|
---
|
|
duration_ms: 0.760793
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - computeCandidates
|
|
---
|
|
duration_ms: 5.252366
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateModal
|
|
# Subtest: should clear similar content if no active video
|
|
ok 1 - should clear similar content if no active video
|
|
---
|
|
duration_ms: 0.500135
|
|
type: 'test'
|
|
...
|
|
# Subtest: should set similar content if matches found
|
|
ok 2 - should set similar content if matches found
|
|
---
|
|
duration_ms: 0.878593
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear similar content if no matches found
|
|
ok 3 - should clear similar content if no matches found
|
|
---
|
|
duration_ms: 0.765289
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 3 - updateModal
|
|
---
|
|
duration_ms: 2.478636
|
|
type: 'suite'
|
|
...
|
|
1..3
|
|
ok 1 - SimilarContentController
|
|
---
|
|
duration_ms: 11.954153
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 4
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 32.342877
|
|
|
|
→ Running tests/ui/storageService.test.mjs
|
|
TAP version 13
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
# Subtest: StorageService
|
|
# Subtest: should unlock storage with a valid signer
|
|
ok 1 - should unlock storage with a valid signer
|
|
---
|
|
duration_ms: 15.271316
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection r2-test-1
|
|
# Subtest: should save and retrieve an R2 connection
|
|
ok 2 - should save and retrieve an R2 connection
|
|
---
|
|
duration_ms: 7.812743
|
|
type: 'test'
|
|
...
|
|
[bitvid] [StorageService] Unlocked storage for 00000000...
|
|
[bitvid] [StorageService] Saved connection s3-generic-1
|
|
# Subtest: should save and retrieve a Generic S3 connection with extra fields
|
|
ok 3 - should save and retrieve a Generic S3 connection with extra fields
|
|
---
|
|
duration_ms: 4.333448
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fail to get connection if locked
|
|
ok 4 - should fail to get connection if locked
|
|
---
|
|
duration_ms: 1.231638
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - StorageService
|
|
---
|
|
duration_ms: 147.910651
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 155.706921
|
|
|
|
→ Running tests/ui/tag-pill-list.test.mjs
|
|
TAP version 13
|
|
# Subtest: renderTagPillStrip builds buttons with labels and icons
|
|
ok 1 - renderTagPillStrip builds buttons with labels and icons
|
|
---
|
|
duration_ms: 93.822492
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip applies preference state styling
|
|
ok 2 - renderTagPillStrip applies preference state styling
|
|
---
|
|
duration_ms: 11.063721
|
|
type: 'test'
|
|
...
|
|
# Subtest: renderTagPillStrip wires the activation callback
|
|
ok 3 - renderTagPillStrip wires the activation callback
|
|
---
|
|
duration_ms: 10.894798
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 128.253391
|
|
|
|
→ Running tests/ui/tag-preference-menu.test.mjs
|
|
TAP version 13
|
|
# Subtest: createTagPreferenceMenu renders heading and actions
|
|
ok 1 - createTagPreferenceMenu renders heading and actions
|
|
---
|
|
duration_ms: 88.158781
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu disables actions based on membership and login
|
|
ok 2 - createTagPreferenceMenu disables actions based on membership and login
|
|
---
|
|
duration_ms: 14.402269
|
|
type: 'test'
|
|
...
|
|
# Subtest: createTagPreferenceMenu forwards actions to callback
|
|
ok 3 - createTagPreferenceMenu forwards actions to callback
|
|
---
|
|
duration_ms: 11.186807
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 126.088518
|
|
|
|
→ Running tests/ui/tagPreferenceMenuController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TagPreferenceMenuController
|
|
# Subtest: ensurePopover
|
|
# Subtest: should create a new popover entry if one does not exist
|
|
ok 1 - should create a new popover entry if one does not exist
|
|
---
|
|
duration_ms: 2.298023
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return existing entry if one exists
|
|
ok 2 - should return existing entry if one exists
|
|
---
|
|
duration_ms: 0.490151
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return null if trigger or tag is missing
|
|
ok 3 - should return null if trigger or tag is missing
|
|
---
|
|
duration_ms: 0.978252
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - ensurePopover
|
|
---
|
|
duration_ms: 5.030322
|
|
type: 'suite'
|
|
...
|
|
# Subtest: requestMenu
|
|
# Subtest: should ensure popover, close others, and open the requested one
|
|
ok 1 - should ensure popover, close others, and open the requested one
|
|
---
|
|
duration_ms: 1.600285
|
|
type: 'test'
|
|
...
|
|
# Subtest: should close the popover if it is already open
|
|
ok 2 - should close the popover if it is already open
|
|
---
|
|
duration_ms: 0.694584
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - requestMenu
|
|
---
|
|
duration_ms: 2.723635
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleMenuAction
|
|
# Subtest: should call service method and notify update
|
|
ok 1 - should call service method and notify update
|
|
---
|
|
duration_ms: 0.772165
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle error and call showError
|
|
ok 2 - should handle error and call showError
|
|
---
|
|
duration_ms: 0.931981
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - handleMenuAction
|
|
---
|
|
duration_ms: 2.154643
|
|
type: 'suite'
|
|
...
|
|
# Subtest: persistPreferencesFromMenu
|
|
# Subtest: should call service.publish
|
|
ok 1 - should call service.publish
|
|
---
|
|
duration_ms: 0.793844
|
|
type: 'test'
|
|
...
|
|
# Subtest: should reuse in-flight promise
|
|
ok 2 - should reuse in-flight promise
|
|
---
|
|
duration_ms: 0.817718
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 4 - persistPreferencesFromMenu
|
|
---
|
|
duration_ms: 1.847413
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - TagPreferenceMenuController
|
|
---
|
|
duration_ms: 13.014308
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 9
|
|
# suites 5
|
|
# pass 9
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 34.098818
|
|
|
|
→ Running tests/ui/torrentStatusController.test.mjs
|
|
TAP version 13
|
|
# Subtest: TorrentStatusController throws if accessor is missing
|
|
ok 1 - TorrentStatusController throws if accessor is missing
|
|
---
|
|
duration_ms: 1.502794
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController updates video modal and calls onRemovePoster
|
|
ok 2 - TorrentStatusController updates video modal and calls onRemovePoster
|
|
---
|
|
duration_ms: 0.608504
|
|
type: 'test'
|
|
...
|
|
# Subtest: TorrentStatusController handles missing modal gracefully
|
|
ok 3 - TorrentStatusController handles missing modal gracefully
|
|
---
|
|
duration_ms: 0.343267
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.353996
|
|
|
|
→ Running tests/ui/uploadModal-integration.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Integration
|
|
# Subtest: should detect default R2 connection and show summary when loaded and unlocked
|
|
ok 1 - should detect default R2 connection and show summary when loaded and unlocked
|
|
---
|
|
duration_ms: 59.74338
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle locked state and unlock flow
|
|
ok 2 - should handle locked state and unlock flow
|
|
---
|
|
duration_ms: 43.950259
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - UploadModal Integration
|
|
---
|
|
duration_ms: 12300.834389
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12309.286117
|
|
|
|
→ Running tests/ui/uploadModal-reset.test.mjs
|
|
TAP version 13
|
|
# Subtest: UploadModal Reset Logic
|
|
# Subtest: should reset upload state and inputs when resetUploads is called
|
|
ok 1 - should reset upload state and inputs when resetUploads is called
|
|
---
|
|
duration_ms: 56.889978
|
|
type: 'test'
|
|
...
|
|
# Subtest: should guard against zombie callbacks when upload is reset during process
|
|
ok 2 - should guard against zombie callbacks when upload is reset during process
|
|
---
|
|
duration_ms: 21.161669
|
|
type: 'test'
|
|
...
|
|
# Subtest: should call resetUploads when close is called
|
|
ok 3 - should call resetUploads when close is called
|
|
---
|
|
duration_ms: 15.491797
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - UploadModal Reset Logic
|
|
---
|
|
duration_ms: 12305.549464
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 1
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12316.36654
|
|
|
|
→ Running tests/ui/url-health-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: UrlHealthController
|
|
# Subtest: probeUrl returns ok for valid URL
|
|
ok 1 - probeUrl returns ok for valid URL
|
|
---
|
|
duration_ms: 94.504473
|
|
type: 'test'
|
|
...
|
|
# Subtest: probeUrl returns error for 404
|
|
ok 2 - probeUrl returns error for 404
|
|
---
|
|
duration_ms: 20.89531
|
|
type: 'test'
|
|
...
|
|
# Subtest: handleUrlHealthBadge updates badge
|
|
ok 3 - handleUrlHealthBadge updates badge
|
|
---
|
|
duration_ms: 73.490925
|
|
type: 'test'
|
|
...
|
|
# Subtest: getUrlHealthPlaceholderMarkup returns string
|
|
ok 4 - getUrlHealthPlaceholderMarkup returns string
|
|
---
|
|
duration_ms: 9.265431
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - UrlHealthController
|
|
---
|
|
duration_ms: 199.868327
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 1
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 207.678373
|
|
|
|
→ Running tests/ui/video-list-view-popular-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView renders sorted popular tag pills
|
|
ok 1 - VideoListView renders sorted popular tag pills
|
|
---
|
|
duration_ms: 141.333327
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView applies tag preference variants to popular tags
|
|
ok 2 - VideoListView applies tag preference variants to popular tags
|
|
---
|
|
duration_ms: 24.796032
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView hides popular tags when no tags are available
|
|
ok 3 - VideoListView hides popular tags when no tags are available
|
|
---
|
|
duration_ms: 15.781616
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoListView setModerationBlockHandler stores callable
|
|
ok 4 - VideoListView setModerationBlockHandler stores callable
|
|
---
|
|
duration_ms: 8.415517
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 203.829359
|
|
|
|
→ Running tests/ui/video-list-view-sorting.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoListView sorts cards by original posted timestamp
|
|
ok 1 - VideoListView sorts cards by original posted timestamp
|
|
---
|
|
duration_ms: 148.707069
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 164.413917
|
|
|
|
→ Running tests/unit/app_guard_logic.test.mjs
|
|
TAP version 13
|
|
# Subtest: Application.resetTorrentStats logic
|
|
# Subtest: does not throw when videoModal is null
|
|
ok 1 - does not throw when videoModal is null
|
|
---
|
|
duration_ms: 1.011466
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal is undefined
|
|
ok 2 - does not throw when videoModal is undefined
|
|
---
|
|
duration_ms: 1.308173
|
|
type: 'test'
|
|
...
|
|
# Subtest: does not throw when videoModal lacks resetStats
|
|
ok 3 - does not throw when videoModal lacks resetStats
|
|
---
|
|
duration_ms: 0.276349
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls resetStats when available
|
|
ok 4 - calls resetStats when available
|
|
---
|
|
duration_ms: 0.244974
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - Application.resetTorrentStats logic
|
|
---
|
|
duration_ms: 4.795062
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 5
|
|
# suites 0
|
|
# pass 5
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.811788
|
|
|
|
→ Running tests/unit/client-count-resilience.test.mjs
|
|
TAP version 13
|
|
# Subtest: NostrClient resilience to COUNT timeouts
|
|
ok 1 - NostrClient resilience to COUNT timeouts
|
|
---
|
|
duration_ms: 3408.680296
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 3416.516757
|
|
|
|
→ Running tests/unit/comment-avatar.test.mjs
|
|
TAP version 13
|
|
# Subtest: normalizeCommentAvatarKey handles inputs correctly
|
|
ok 1 - normalizeCommentAvatarKey handles inputs correctly
|
|
---
|
|
duration_ms: 1.204326
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveCommentAvatarAsset resolves avatars correctly
|
|
ok 2 - resolveCommentAvatarAsset resolves avatars correctly
|
|
---
|
|
duration_ms: 2.727737
|
|
type: 'test'
|
|
...
|
|
# Subtest: registerCommentAvatarFailure registers failures correctly
|
|
ok 3 - registerCommentAvatarFailure registers failures correctly
|
|
---
|
|
duration_ms: 0.428224
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.408765
|
|
|
|
→ Running tests/unit/editModalController.test.mjs
|
|
TAP version 13
|
|
# Subtest: EditModalController
|
|
# Subtest: open()
|
|
# Subtest: should resolve target and open modal if authorized
|
|
ok 1 - should resolve target and open modal if authorized
|
|
---
|
|
duration_ms: 2.525881
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.834454
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if user does not own video
|
|
ok 3 - should show error if user does not own video
|
|
---
|
|
duration_ms: 0.511948
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle modal load errors
|
|
ok 4 - should handle modal load errors
|
|
---
|
|
duration_ms: 0.881634
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - open()
|
|
---
|
|
duration_ms: 5.877097
|
|
type: 'suite'
|
|
...
|
|
# Subtest: handleSubmit()
|
|
# Subtest: should handle successful submission
|
|
ok 1 - should handle successful submission
|
|
---
|
|
duration_ms: 1.116244
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show error if not logged in
|
|
ok 2 - should show error if not logged in
|
|
---
|
|
duration_ms: 0.498033
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle submission errors
|
|
ok 3 - should handle submission errors
|
|
---
|
|
duration_ms: 1.360921
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 2 - handleSubmit()
|
|
---
|
|
duration_ms: 3.62322
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - EditModalController
|
|
---
|
|
duration_ms: 10.328358
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 3
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 32.301993
|
|
|
|
→ Running tests/unit/embed_player_modal.test.mjs
|
|
TAP version 13
|
|
# Subtest: EmbedPlayerModal interface
|
|
# Subtest: has expected methods
|
|
ok 1 - has expected methods
|
|
---
|
|
duration_ms: 2.152302
|
|
type: 'test'
|
|
...
|
|
# Subtest: resetStats is no-op and does not throw
|
|
ok 2 - resetStats is no-op and does not throw
|
|
---
|
|
duration_ms: 0.346783
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - EmbedPlayerModal interface
|
|
---
|
|
duration_ms: 3.92973
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 15.261706
|
|
|
|
→ Running tests/unit/embed-accent.test.mjs
|
|
TAP version 13
|
|
# Subtest: embed accent color configuration
|
|
ok 1 - embed accent color configuration
|
|
---
|
|
duration_ms: 1.29508
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 1
|
|
# suites 0
|
|
# pass 1
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 12.649508
|
|
|
|
→ Running tests/unit/hashChangeHandler.test.mjs
|
|
TAP version 13
|
|
# Subtest: createHashChangeHandler
|
|
# Subtest: loads default view if hash is empty
|
|
ok 1 - loads default view if hash is empty
|
|
---
|
|
duration_ms: 1.287408
|
|
type: 'test'
|
|
...
|
|
# Subtest: redirects legacy view
|
|
ok 2 - redirects legacy view
|
|
---
|
|
duration_ms: 0.32724
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips redundant reload
|
|
ok 3 - skips redundant reload
|
|
---
|
|
duration_ms: 0.287397
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - createHashChangeHandler
|
|
---
|
|
duration_ms: 3.927917
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 17.418117
|
|
|
|
→ Running tests/unit/notificationController.test.mjs
|
|
TAP version 13
|
|
# Subtest: NotificationController
|
|
# Subtest: should instantiate correctly
|
|
ok 1 - should instantiate correctly
|
|
---
|
|
duration_ms: 2.693388
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should update text content and show container
|
|
ok 2 - showError should update text content and show container
|
|
---
|
|
duration_ms: 1.115809
|
|
type: 'test'
|
|
...
|
|
# Subtest: showError should hide container when msg is empty
|
|
ok 3 - showError should hide container when msg is empty
|
|
---
|
|
duration_ms: 1.285199
|
|
type: 'test'
|
|
...
|
|
# Subtest: updateNotificationPortalVisibility should toggle active class on portal
|
|
ok 4 - updateNotificationPortalVisibility should toggle active class on portal
|
|
---
|
|
duration_ms: 1.067633
|
|
type: 'test'
|
|
...
|
|
# Subtest: showSuccess should update text content and show container
|
|
ok 5 - showSuccess should update text content and show container
|
|
---
|
|
duration_ms: 0.774822
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should update text content and show container
|
|
ok 6 - showStatus should update text content and show container
|
|
---
|
|
duration_ms: 0.955298
|
|
type: 'test'
|
|
...
|
|
# Subtest: showStatus should handle spinner option
|
|
ok 7 - showStatus should handle spinner option
|
|
---
|
|
duration_ms: 0.661304
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - NotificationController
|
|
---
|
|
duration_ms: 10.580224
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.812783
|
|
|
|
→ Running tests/unit/searchFilters.test.mjs
|
|
TAP version 13
|
|
# Subtest: parseFilterQuery collects filters and text tokens
|
|
ok 1 - parseFilterQuery collects filters and text tokens
|
|
---
|
|
duration_ms: 2.979785
|
|
type: 'test'
|
|
...
|
|
# Subtest: serializeFiltersToQuery emits filter tokens in order
|
|
ok 2 - serializeFiltersToQuery emits filter tokens in order
|
|
---
|
|
duration_ms: 0.399767
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
ok 3 - video search filter matcher enforces tags, duration, and nsfw when allowed
|
|
---
|
|
duration_ms: 0.583274
|
|
type: 'test'
|
|
...
|
|
# Subtest: video search filter matcher blocks nsfw when disallowed and requires url
|
|
ok 4 - video search filter matcher blocks nsfw when disallowed and requires url
|
|
---
|
|
duration_ms: 0.243159
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 16.850568
|
|
|
|
→ Running tests/unit/security-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: Security configuration: Development mode should be disabled in production
|
|
ok 1 - Security configuration: Development mode should be disabled in production
|
|
---
|
|
duration_ms: 1.097692
|
|
type: 'test'
|
|
...
|
|
# Subtest: Security configuration: Verbose diagnostics should be disabled in production
|
|
ok 2 - Security configuration: Verbose diagnostics should be disabled in production
|
|
---
|
|
duration_ms: 0.280951
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.239812
|
|
|
|
→ Running tests/unit/services/moderationDecorator.test.mjs
|
|
TAP version 13
|
|
# Subtest: ModerationDecorator
|
|
# Subtest: deriveModerationReportType
|
|
# Subtest: should return empty string for null summary
|
|
ok 1 - should return empty string for null summary
|
|
---
|
|
duration_ms: 1.059418
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty types
|
|
ok 2 - should return empty string for empty types
|
|
---
|
|
duration_ms: 0.231395
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the type with highest trusted count
|
|
ok 3 - should return the type with highest trusted count
|
|
---
|
|
duration_ms: 0.186932
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - deriveModerationReportType
|
|
---
|
|
duration_ms: 2.544969
|
|
type: 'suite'
|
|
...
|
|
# Subtest: deriveModerationTrustedCount
|
|
# Subtest: should return trusted count for specific type
|
|
ok 1 - should return trusted count for specific type
|
|
---
|
|
duration_ms: 0.433953
|
|
type: 'test'
|
|
...
|
|
# Subtest: should fall back to totalTrusted if type not found
|
|
ok 2 - should fall back to totalTrusted if type not found
|
|
---
|
|
duration_ms: 0.179637
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - deriveModerationTrustedCount
|
|
---
|
|
duration_ms: 0.81939
|
|
type: 'suite'
|
|
...
|
|
# Subtest: getReporterDisplayName
|
|
# Subtest: should return name from cache if available
|
|
ok 1 - should return name from cache if available
|
|
---
|
|
duration_ms: 0.38295
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return short formatted string if not in cache
|
|
ok 2 - should return short formatted string if not in cache
|
|
---
|
|
duration_ms: 1.179733
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 3 - getReporterDisplayName
|
|
---
|
|
duration_ms: 2.037418
|
|
type: 'suite'
|
|
...
|
|
# Subtest: decorateVideo
|
|
# Subtest: should return the video object if input is invalid
|
|
ok 1 - should return the video object if input is invalid
|
|
---
|
|
duration_ms: 0.720458
|
|
type: 'test'
|
|
...
|
|
# Subtest: should decorate video with basic moderation
|
|
ok 2 - should decorate video with basic moderation
|
|
---
|
|
duration_ms: 0.573135
|
|
type: 'test'
|
|
...
|
|
# Subtest: should flag video as hidden if trusted mute count exceeds threshold
|
|
ok 3 - should flag video as hidden if trusted mute count exceeds threshold
|
|
---
|
|
duration_ms: 0.534976
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - decorateVideo
|
|
---
|
|
duration_ms: 2.046583
|
|
type: 'suite'
|
|
...
|
|
# Subtest: updateSettings
|
|
# Subtest: should update moderation settings and affect decoration
|
|
ok 1 - should update moderation settings and affect decoration
|
|
---
|
|
duration_ms: 0.506354
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
ok 5 - updateSettings
|
|
---
|
|
duration_ms: 0.60984
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - ModerationDecorator
|
|
---
|
|
duration_ms: 9.306911
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 11
|
|
# suites 6
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.510068
|
|
|
|
→ Running tests/unit/services/r2Service.storage-config.test.mjs
|
|
TAP version 13
|
|
[bitvid] [R2] Verifying access for Bucket: 'r2-meta-bucket' in Account: 'acc…23'
|
|
# Subtest: R2Service bucket selection
|
|
# Subtest: uses meta.bucket for ensureBucketExists and multipartUpload
|
|
ok 1 - uses meta.bucket for ensureBucketExists and multipartUpload
|
|
---
|
|
duration_ms: 29.660084
|
|
type: 'test'
|
|
...
|
|
# Subtest: uses configured meta.bucket when verifying public access
|
|
ok 2 - uses configured meta.bucket when verifying public access
|
|
---
|
|
duration_ms: 1.883099
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 1 - R2Service bucket selection
|
|
---
|
|
duration_ms: 33.012255
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 2
|
|
# suites 1
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 43.292187
|
|
|
|
→ Running tests/utils/cardSourceVisibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: cardSourceVisibility
|
|
# Subtest: updateVideoCardSourceVisibility
|
|
# Subtest: should handle null or undefined input gracefully
|
|
ok 1 - should handle null or undefined input gracefully
|
|
---
|
|
duration_ms: 5.691003
|
|
type: 'test'
|
|
...
|
|
# Subtest: should resolve card from object with .card property
|
|
ok 2 - should resolve card from object with .card property
|
|
---
|
|
duration_ms: 2.550751
|
|
type: 'test'
|
|
...
|
|
# Subtest: should always show card if owner is viewer
|
|
ok 3 - should always show card if owner is viewer
|
|
---
|
|
duration_ms: 1.521193
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is healthy
|
|
ok 4 - should show card if at least one source is healthy
|
|
---
|
|
duration_ms: 1.919304
|
|
type: 'test'
|
|
...
|
|
# Subtest: should show card if at least one source is checking/pending
|
|
ok 5 - should show card if at least one source is checking/pending
|
|
---
|
|
duration_ms: 1.576533
|
|
type: 'test'
|
|
...
|
|
# Subtest: should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
ok 6 - should hide card ONLY if both sources are failed (not healthy and not pending)
|
|
---
|
|
duration_ms: 1.0184
|
|
type: 'test'
|
|
...
|
|
# Subtest: should recover from hidden state when source becomes healthy
|
|
ok 7 - should recover from hidden state when source becomes healthy
|
|
---
|
|
duration_ms: 0.984864
|
|
type: 'test'
|
|
...
|
|
# Subtest: should check closest .card if element is not .card itself
|
|
ok 8 - should check closest .card if element is not .card itself
|
|
---
|
|
duration_ms: 8.139214
|
|
type: 'test'
|
|
...
|
|
1..8
|
|
ok 1 - updateVideoCardSourceVisibility
|
|
---
|
|
duration_ms: 24.90032
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
ok 1 - cardSourceVisibility
|
|
---
|
|
duration_ms: 25.921065
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 8
|
|
# suites 2
|
|
# pass 8
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 44.651835
|
|
|
|
→ Running tests/utils/domUtils.test.mjs
|
|
TAP version 13
|
|
# Subtest: domUtils
|
|
# Subtest: escapeHTML
|
|
# Subtest: should return empty string for null or undefined
|
|
ok 1 - should return empty string for null or undefined
|
|
---
|
|
duration_ms: 1.202382
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return the string as is if no special characters are present
|
|
ok 2 - should return the string as is if no special characters are present
|
|
---
|
|
duration_ms: 0.234555
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape special characters
|
|
ok 3 - should escape special characters
|
|
---
|
|
duration_ms: 0.281801
|
|
type: 'test'
|
|
...
|
|
# Subtest: should escape multiple occurrences of special characters
|
|
ok 4 - should escape multiple occurrences of special characters
|
|
---
|
|
duration_ms: 0.405081
|
|
type: 'test'
|
|
...
|
|
# Subtest: should handle mixed content correctly
|
|
ok 5 - should handle mixed content correctly
|
|
---
|
|
duration_ms: 0.194207
|
|
type: 'test'
|
|
...
|
|
# Subtest: should convert non-string inputs to string and escape
|
|
ok 6 - should convert non-string inputs to string and escape
|
|
---
|
|
duration_ms: 0.158791
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 1 - escapeHTML
|
|
---
|
|
duration_ms: 3.621264
|
|
type: 'suite'
|
|
...
|
|
# Subtest: removeTrackingScripts
|
|
# Subtest: should do nothing if root is null or undefined
|
|
ok 1 - should do nothing if root is null or undefined
|
|
---
|
|
duration_ms: 0.365521
|
|
type: 'test'
|
|
...
|
|
# Subtest: should do nothing if root has no querySelectorAll
|
|
ok 2 - should do nothing if root has no querySelectorAll
|
|
---
|
|
duration_ms: 0.488692
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts matching the tracking pattern
|
|
ok 3 - should remove scripts matching the tracking pattern
|
|
---
|
|
duration_ms: 22.111584
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not remove inline scripts (no src)
|
|
ok 4 - should not remove inline scripts (no src)
|
|
---
|
|
duration_ms: 2.524986
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src ends with tracking.js
|
|
ok 5 - should remove scripts where src ends with tracking.js
|
|
---
|
|
duration_ms: 1.254354
|
|
type: 'test'
|
|
...
|
|
# Subtest: should remove scripts where src contains /tracking.js
|
|
ok 6 - should remove scripts where src contains /tracking.js
|
|
---
|
|
duration_ms: 0.865382
|
|
type: 'test'
|
|
...
|
|
1..6
|
|
ok 2 - removeTrackingScripts
|
|
---
|
|
duration_ms: 28.250623
|
|
type: 'suite'
|
|
...
|
|
1..2
|
|
ok 1 - domUtils
|
|
---
|
|
duration_ms: 32.768094
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 3
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 53.784058
|
|
|
|
→ Running tests/utils/hex.test.mjs
|
|
TAP version 13
|
|
# Subtest: hex utils
|
|
# Subtest: normalizeHexString
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.937752
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for empty or whitespace-only strings
|
|
ok 2 - should return empty string for empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.290641
|
|
type: 'test'
|
|
...
|
|
# Subtest: should trim and lowercase valid hex strings
|
|
ok 3 - should trim and lowercase valid hex strings
|
|
---
|
|
duration_ms: 0.173874
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 1 - normalizeHexString
|
|
---
|
|
duration_ms: 2.391263
|
|
type: 'suite'
|
|
...
|
|
# Subtest: aliases
|
|
# Subtest: should export normalizeHexId as an alias
|
|
ok 1 - should export normalizeHexId as an alias
|
|
---
|
|
duration_ms: 0.321141
|
|
type: 'test'
|
|
...
|
|
# Subtest: should export normalizeHexPubkey as an alias
|
|
ok 2 - should export normalizeHexPubkey as an alias
|
|
---
|
|
duration_ms: 0.151718
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - aliases
|
|
---
|
|
duration_ms: 0.747492
|
|
type: 'suite'
|
|
...
|
|
# Subtest: HEX64_REGEX
|
|
# Subtest: should match valid 64-character hex strings
|
|
ok 1 - should match valid 64-character hex strings
|
|
---
|
|
duration_ms: 0.523889
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with incorrect length
|
|
ok 2 - should not match strings with incorrect length
|
|
---
|
|
duration_ms: 0.449799
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match strings with non-hex characters
|
|
ok 3 - should not match strings with non-hex characters
|
|
---
|
|
duration_ms: 0.232721
|
|
type: 'test'
|
|
...
|
|
# Subtest: should not match empty strings
|
|
ok 4 - should not match empty strings
|
|
---
|
|
duration_ms: 0.260547
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 3 - HEX64_REGEX
|
|
---
|
|
duration_ms: 2.11641
|
|
type: 'suite'
|
|
...
|
|
# Subtest: normalizeHexHash
|
|
# Subtest: should return empty string for non-string inputs
|
|
ok 1 - should return empty string for non-string inputs
|
|
---
|
|
duration_ms: 0.396514
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return empty string for invalid hex
|
|
ok 2 - should return empty string for invalid hex
|
|
---
|
|
duration_ms: 0.13609
|
|
type: 'test'
|
|
...
|
|
# Subtest: should return normalized hex for valid inputs
|
|
ok 3 - should return normalized hex for valid inputs
|
|
---
|
|
duration_ms: 0.114843
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
ok 4 - normalizeHexHash
|
|
---
|
|
duration_ms: 0.862007
|
|
type: 'suite'
|
|
...
|
|
1..4
|
|
ok 1 - hex utils
|
|
---
|
|
duration_ms: 7.108398
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 12
|
|
# suites 5
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.572169
|
|
|
|
→ Running tests/utils/linkPreviewSettings.test.mjs
|
|
TAP version 13
|
|
# Subtest: linkPreviewSettings
|
|
# Subtest: getLinkPreviewSettings
|
|
# Subtest: returns defaults when storage is empty
|
|
ok 1 - returns defaults when storage is empty
|
|
---
|
|
duration_ms: 2.672973
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns stored settings
|
|
ok 2 - returns stored settings
|
|
---
|
|
duration_ms: 1.178817
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns defaults when storage is invalid
|
|
ok 3 - returns defaults when storage is invalid
|
|
---
|
|
duration_ms: 0.986632
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizes settings from storage
|
|
ok 4 - sanitizes settings from storage
|
|
---
|
|
duration_ms: 0.77958
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getLinkPreviewSettings
|
|
---
|
|
duration_ms: 6.831383
|
|
type: 'suite'
|
|
...
|
|
# Subtest: setLinkPreviewAutoFetch
|
|
# Subtest: updates settings and persists to storage
|
|
ok 1 - updates settings and persists to storage
|
|
---
|
|
duration_ms: 1.108773
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 2 - emits an event on change
|
|
---
|
|
duration_ms: 1.352625
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 2 - setLinkPreviewAutoFetch
|
|
---
|
|
duration_ms: 2.837038
|
|
type: 'suite'
|
|
...
|
|
# Subtest: allowLinkPreviewDomain
|
|
# Subtest: adds a domain and persists to storage
|
|
ok 1 - adds a domain and persists to storage
|
|
---
|
|
duration_ms: 0.737089
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles duplicates
|
|
ok 2 - handles duplicates
|
|
---
|
|
duration_ms: 0.582021
|
|
type: 'test'
|
|
...
|
|
# Subtest: normalizes domains
|
|
ok 3 - normalizes domains
|
|
---
|
|
duration_ms: 0.613116
|
|
type: 'test'
|
|
...
|
|
# Subtest: emits an event on change
|
|
ok 4 - emits an event on change
|
|
---
|
|
duration_ms: 0.757312
|
|
type: 'test'
|
|
...
|
|
# Subtest: respects silent option
|
|
ok 5 - respects silent option
|
|
---
|
|
duration_ms: 0.451499
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 3 - allowLinkPreviewDomain
|
|
---
|
|
duration_ms: 3.642877
|
|
type: 'suite'
|
|
...
|
|
# Subtest: isLinkPreviewDomainAllowed
|
|
# Subtest: returns true for allowed domains
|
|
ok 1 - returns true for allowed domains
|
|
---
|
|
duration_ms: 0.632632
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for disallowed domains
|
|
ok 2 - returns false for disallowed domains
|
|
---
|
|
duration_ms: 0.30811
|
|
type: 'test'
|
|
...
|
|
# Subtest: handles normalization
|
|
ok 3 - handles normalization
|
|
---
|
|
duration_ms: 0.718981
|
|
type: 'test'
|
|
...
|
|
# Subtest: accepts settings object as second argument
|
|
ok 4 - accepts settings object as second argument
|
|
---
|
|
duration_ms: 0.323522
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 4 - isLinkPreviewDomainAllowed
|
|
---
|
|
duration_ms: 2.218464
|
|
type: 'suite'
|
|
...
|
|
# Subtest: subscribeToLinkPreviewSettings
|
|
# Subtest: calls callback on event emission
|
|
ok 1 - calls callback on event emission
|
|
---
|
|
duration_ms: 0.789108
|
|
type: 'test'
|
|
...
|
|
# Subtest: unsubscribes correctly
|
|
ok 2 - unsubscribes correctly
|
|
---
|
|
duration_ms: 0.717531
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
ok 5 - subscribeToLinkPreviewSettings
|
|
---
|
|
duration_ms: 1.646129
|
|
type: 'suite'
|
|
...
|
|
1..5
|
|
ok 1 - linkPreviewSettings
|
|
---
|
|
duration_ms: 18.40924
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 17
|
|
# suites 6
|
|
# pass 17
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 51.832331
|
|
|
|
→ Running tests/utils/lruCache.test.mjs
|
|
TAP version 13
|
|
# Subtest: LRUCache
|
|
# Subtest: should initialize with default options
|
|
ok 1 - should initialize with default options
|
|
---
|
|
duration_ms: 1.481248
|
|
type: 'test'
|
|
...
|
|
# Subtest: should store and retrieve values
|
|
ok 2 - should store and retrieve values
|
|
---
|
|
duration_ms: 0.37016
|
|
type: 'test'
|
|
...
|
|
# Subtest: should evict oldest item when limit is reached
|
|
ok 3 - should evict oldest item when limit is reached
|
|
---
|
|
duration_ms: 0.353474
|
|
type: 'test'
|
|
...
|
|
# Subtest: should refresh recency on access
|
|
ok 4 - should refresh recency on access
|
|
---
|
|
duration_ms: 0.379817
|
|
type: 'test'
|
|
...
|
|
# Subtest: should update value and refresh recency on set
|
|
ok 5 - should update value and refresh recency on set
|
|
---
|
|
duration_ms: 0.636834
|
|
type: 'test'
|
|
...
|
|
# Subtest: should track stats
|
|
ok 6 - should track stats
|
|
---
|
|
duration_ms: 0.37147
|
|
type: 'test'
|
|
...
|
|
# Subtest: should clear cache
|
|
ok 7 - should clear cache
|
|
---
|
|
duration_ms: 0.314356
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 1 - LRUCache
|
|
---
|
|
duration_ms: 5.795795
|
|
type: 'suite'
|
|
...
|
|
1..1
|
|
# tests 7
|
|
# suites 1
|
|
# pass 7
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.344254
|
|
|
|
→ Running tests/utils/profileMedia.test.mjs
|
|
TAP version 13
|
|
# Subtest: sanitizeProfileMediaUrl handles non-string inputs
|
|
ok 1 - sanitizeProfileMediaUrl handles non-string inputs
|
|
---
|
|
duration_ms: 1.539523
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
ok 2 - sanitizeProfileMediaUrl handles empty or whitespace-only strings
|
|
---
|
|
duration_ms: 0.354776
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
ok 3 - sanitizeProfileMediaUrl trims whitespace and removes quotes
|
|
---
|
|
duration_ms: 0.832962
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows data:image/ URLs
|
|
ok 4 - sanitizeProfileMediaUrl allows data:image/ URLs
|
|
---
|
|
duration_ms: 0.167891
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows blob: URLs
|
|
ok 5 - sanitizeProfileMediaUrl allows blob: URLs
|
|
---
|
|
duration_ms: 0.260791
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects specific placeholder images
|
|
ok 6 - sanitizeProfileMediaUrl rejects specific placeholder images
|
|
---
|
|
duration_ms: 0.198215
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
ok 7 - sanitizeProfileMediaUrl normalizes IPFS URLs
|
|
---
|
|
duration_ms: 0.375748
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
ok 8 - sanitizeProfileMediaUrl handles protocol-relative URLs
|
|
---
|
|
duration_ms: 0.166278
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl allows relative paths
|
|
ok 9 - sanitizeProfileMediaUrl allows relative paths
|
|
---
|
|
duration_ms: 0.54526
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
ok 10 - sanitizeProfileMediaUrl adds protocol to domains and localhost
|
|
---
|
|
duration_ms: 1.071984
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
ok 11 - sanitizeProfileMediaUrl coerces http to https except for localhost
|
|
---
|
|
duration_ms: 0.24227
|
|
type: 'test'
|
|
...
|
|
# Subtest: sanitizeProfileMediaUrl rejects unsupported patterns
|
|
ok 12 - sanitizeProfileMediaUrl rejects unsupported patterns
|
|
---
|
|
duration_ms: 0.198441
|
|
type: 'test'
|
|
...
|
|
1..12
|
|
# tests 12
|
|
# suites 0
|
|
# pass 12
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 23.421422
|
|
|
|
→ Running tests/utils/video-deduper.test.mjs
|
|
TAP version 13
|
|
# Subtest: dedupeToNewestByRoot replaces entries with missing timestamps
|
|
ok 1 - dedupeToNewestByRoot replaces entries with missing timestamps
|
|
---
|
|
duration_ms: 1.342502
|
|
type: 'test'
|
|
...
|
|
# Subtest: dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
ok 2 - dedupeToNewestByRoot replaces entries with non-numeric timestamps
|
|
---
|
|
duration_ms: 0.235071
|
|
type: 'test'
|
|
...
|
|
1..2
|
|
# tests 2
|
|
# suites 0
|
|
# pass 2
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 13.8285
|
|
|
|
→ Running tests/utils/video-tags.test.mjs
|
|
TAP version 13
|
|
# Subtest: collectVideoTags dedupes across metadata sources and respects casing
|
|
ok 1 - collectVideoTags dedupes across metadata sources and respects casing
|
|
---
|
|
duration_ms: 16.598908
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
ok 2 - collectVideoTags sorts case-insensitively and adds hashes when requested
|
|
---
|
|
duration_ms: 0.379987
|
|
type: 'test'
|
|
...
|
|
# Subtest: collectVideoTags handles malformed inputs safely
|
|
ok 3 - collectVideoTags handles malformed inputs safely
|
|
---
|
|
duration_ms: 0.212784
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 3
|
|
# suites 0
|
|
# pass 3
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 29.168967
|
|
|
|
→ Running tests/utils/videoPointer.test.mjs
|
|
TAP version 13
|
|
# Subtest: resolveVideoPointer returns address pointer with dTag
|
|
ok 1 - resolveVideoPointer returns address pointer with dTag
|
|
---
|
|
duration_ms: 2.345067
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns address pointer with videoRootId
|
|
ok 2 - resolveVideoPointer returns address pointer with videoRootId
|
|
---
|
|
duration_ms: 0.393604
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns event pointer with fallbackEventId
|
|
ok 3 - resolveVideoPointer returns event pointer with fallbackEventId
|
|
---
|
|
duration_ms: 0.229161
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over videoRootId
|
|
ok 4 - resolveVideoPointer prioritizes dTag over videoRootId
|
|
---
|
|
duration_ms: 0.252307
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
ok 5 - resolveVideoPointer prioritizes videoRootId over fallbackEventId
|
|
---
|
|
duration_ms: 0.195915
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
ok 6 - resolveVideoPointer prioritizes dTag over fallbackEventId
|
|
---
|
|
duration_ms: 0.185039
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer includes relay in pointer
|
|
ok 7 - resolveVideoPointer includes relay in pointer
|
|
---
|
|
duration_ms: 0.299233
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer normalizes inputs
|
|
ok 8 - resolveVideoPointer normalizes inputs
|
|
---
|
|
duration_ms: 0.186388
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer uses default kind when kind is missing or invalid
|
|
ok 9 - resolveVideoPointer uses default kind when kind is missing or invalid
|
|
---
|
|
duration_ms: 0.585621
|
|
type: 'test'
|
|
...
|
|
# Subtest: resolveVideoPointer returns null for invalid inputs
|
|
ok 10 - resolveVideoPointer returns null for invalid inputs
|
|
---
|
|
duration_ms: 0.550406
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 22.817803
|
|
|
|
→ Running tests/utils/videoTimestamps.test.mjs
|
|
TAP version 13
|
|
# Subtest: getVideoRootIdentifier
|
|
# Subtest: returns empty string for invalid inputs
|
|
ok 1 - returns empty string for invalid inputs
|
|
---
|
|
duration_ms: 2.489966
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns videoRootId when present
|
|
ok 2 - returns videoRootId when present
|
|
---
|
|
duration_ms: 0.252062
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is missing
|
|
ok 3 - returns id when videoRootId is missing
|
|
---
|
|
duration_ms: 0.247871
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns id when videoRootId is not a string
|
|
ok 4 - returns id when videoRootId is not a string
|
|
---
|
|
duration_ms: 0.159546
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 1 - getVideoRootIdentifier
|
|
---
|
|
duration_ms: 4.668582
|
|
type: 'test'
|
|
...
|
|
# Subtest: applyRootTimestampToVideosMap
|
|
# Subtest: returns early if videosMap is not a Map
|
|
ok 1 - returns early if videosMap is not a Map
|
|
---
|
|
duration_ms: 0.286841
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for matching video ID
|
|
ok 2 - updates rootCreatedAt for matching video ID
|
|
---
|
|
duration_ms: 0.196152
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates rootCreatedAt for other videos with same rootId
|
|
ok 3 - updates rootCreatedAt for other videos with same rootId
|
|
---
|
|
duration_ms: 0.308519
|
|
type: 'test'
|
|
...
|
|
# Subtest: skips invalid stored objects in map
|
|
ok 4 - skips invalid stored objects in map
|
|
---
|
|
duration_ms: 0.327971
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
ok 2 - applyRootTimestampToVideosMap
|
|
---
|
|
duration_ms: 2.723415
|
|
type: 'test'
|
|
...
|
|
# Subtest: syncActiveVideoRootTimestamp
|
|
# Subtest: returns false for invalid timestamp
|
|
ok 1 - returns false for invalid timestamp
|
|
---
|
|
duration_ms: 0.351148
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false for invalid activeVideo
|
|
ok 2 - returns false for invalid activeVideo
|
|
---
|
|
duration_ms: 0.150475
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if activeVideo has no root identifier
|
|
ok 3 - returns false if activeVideo has no root identifier
|
|
---
|
|
duration_ms: 0.146068
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if rootId mismatch
|
|
ok 4 - returns false if rootId mismatch
|
|
---
|
|
duration_ms: 0.160788
|
|
type: 'test'
|
|
...
|
|
# Subtest: returns false if timestamp already matches
|
|
ok 5 - returns false if timestamp already matches
|
|
---
|
|
duration_ms: 0.116238
|
|
type: 'test'
|
|
...
|
|
# Subtest: updates activeVideo and displayTags
|
|
ok 6 - updates activeVideo and displayTags
|
|
---
|
|
duration_ms: 0.506623
|
|
type: 'test'
|
|
...
|
|
# Subtest: calls videoModal.updateMetadata if provided
|
|
ok 7 - calls videoModal.updateMetadata if provided
|
|
---
|
|
duration_ms: 0.236773
|
|
type: 'test'
|
|
...
|
|
1..7
|
|
ok 3 - syncActiveVideoRootTimestamp
|
|
---
|
|
duration_ms: 2.668814
|
|
type: 'test'
|
|
...
|
|
1..3
|
|
# tests 18
|
|
# suites 0
|
|
# pass 18
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 31.213273
|
|
|
|
→ Running tests/validate-config.test.mjs
|
|
TAP version 13
|
|
# Subtest: validateInstanceConfig succeeds with valid configuration
|
|
ok 1 - validateInstanceConfig succeeds with valid configuration
|
|
---
|
|
duration_ms: 2.06434
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when platform fee is positive without a platform override
|
|
ok 2 - validateInstanceConfig throws when platform fee is positive without a platform override
|
|
---
|
|
duration_ms: 0.957658
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
ok 3 - validateInstanceConfig throws when ADMIN_SUPER_NPUB is empty
|
|
---
|
|
duration_ms: 0.234417
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
ok 4 - validateInstanceConfig throws when ADMIN_SUPER_NPUB does not start with npub
|
|
---
|
|
duration_ms: 0.200045
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
ok 5 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is negative
|
|
---
|
|
duration_ms: 0.208166
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
ok 6 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is greater than 100
|
|
---
|
|
duration_ms: 0.313117
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
ok 7 - validateInstanceConfig throws when PLATFORM_FEE_PERCENT is not finite
|
|
---
|
|
duration_ms: 0.221306
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
ok 8 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES has invalid hex color
|
|
---
|
|
duration_ms: 0.277376
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
ok 9 - validateInstanceConfig throws when THEME_ACCENT_OVERRIDES structure is invalid
|
|
---
|
|
duration_ms: 0.51804
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL is invalid
|
|
ok 10 - validateInstanceConfig throws when optional URL is invalid
|
|
---
|
|
duration_ms: 0.731262
|
|
type: 'test'
|
|
...
|
|
# Subtest: validateInstanceConfig throws when optional URL has invalid protocol
|
|
ok 11 - validateInstanceConfig throws when optional URL has invalid protocol
|
|
---
|
|
duration_ms: 0.357589
|
|
type: 'test'
|
|
...
|
|
1..11
|
|
# tests 11
|
|
# suites 0
|
|
# pass 11
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 24.903947
|
|
|
|
→ Running tests/video-card-source-visibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
ok 1 - updateVideoCardSourceVisibility hides non-owner cards without healthy sources and restores visibility
|
|
---
|
|
duration_ms: 105.631922
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
ok 2 - VideoCard hides cards without playable sources until a healthy CDN update arrives
|
|
---
|
|
duration_ms: 37.65888
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
ok 3 - VideoCard.closeMoreMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 17.762978
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
ok 4 - VideoCard.closeSettingsMenu only restores focus when the trigger was expanded
|
|
---
|
|
duration_ms: 17.904083
|
|
type: 'test'
|
|
...
|
|
1..4
|
|
# tests 4
|
|
# suites 0
|
|
# pass 4
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 195.686048
|
|
|
|
→ Running tests/video-modal-accessibility.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 330.719916
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 24.028517
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 313.538188
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 108.444285
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 89.829047
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 86.721428
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 84.790652
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 90.209274
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 241.177695
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 70.615596
|
|
type: 'test'
|
|
...
|
|
1..10
|
|
# tests 10
|
|
# suites 0
|
|
# pass 10
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1455.1382
|
|
|
|
→ Running tests/video-modal-comments.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 326.215915
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 25.144977
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 497.322859
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 163.836646
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 146.285632
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 102.12496
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 90.51574
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 129.484937
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 252.163879
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 77.273344
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section toggles visibility and renders hydrated comments
|
|
ok 11 - VideoModal comment section toggles visibility and renders hydrated comments
|
|
---
|
|
duration_ms: 98.218195
|
|
type: 'test'
|
|
...
|
|
# Subtest: Unauthenticated users can read comments while the composer stays disabled
|
|
ok 12 - Unauthenticated users can read comments while the composer stays disabled
|
|
---
|
|
duration_ms: 86.279796
|
|
type: 'test'
|
|
...
|
|
# Subtest: Guest users render loaded thread snapshots before composer auth enforcement
|
|
ok 13 - Guest users render loaded thread snapshots before composer auth enforcement
|
|
---
|
|
duration_ms: 108.788924
|
|
type: 'test'
|
|
...
|
|
# Subtest: Thread ready snapshots force comments visible before composer gating
|
|
ok 14 - Thread ready snapshots force comments visible before composer gating
|
|
---
|
|
duration_ms: 108.498513
|
|
type: 'test'
|
|
...
|
|
# Subtest: Controller renders synchronous loadThread snapshots immediately
|
|
ok 15 - Controller renders synchronous loadThread snapshots immediately
|
|
---
|
|
duration_ms: 76.412588
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController attaches profiles using normalized pubkeys
|
|
ok 16 - VideoModalCommentController attaches profiles using normalized pubkeys
|
|
---
|
|
duration_ms: 1.819689
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
ok 17 - VideoModalCommentController accepts mixed-case videoEventIds for snapshots
|
|
---
|
|
duration_ms: 0.600185
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment composer updates messaging and dispatches events
|
|
ok 18 - VideoModal comment composer updates messaging and dispatches events
|
|
---
|
|
duration_ms: 72.745446
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController load preserves current video for submissions
|
|
ok 19 - VideoModalCommentController load preserves current video for submissions
|
|
---
|
|
duration_ms: 1.099811
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
ok 20 - VideoModalCommentController falls back to thread pointer when video tags are absent
|
|
---
|
|
duration_ms: 0.515085
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
ok 21 - VideoModalCommentController preserves videoRootId when only root pointer is provided
|
|
---
|
|
duration_ms: 0.760852
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
ok 22 - VideoModalCommentController uses pointerIdentifiers root id fallback
|
|
---
|
|
duration_ms: 0.745102
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController publishes comment using event id fallback
|
|
ok 23 - VideoModalCommentController publishes comment using event id fallback
|
|
---
|
|
duration_ms: 0.478406
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController disposes safely during in-flight comment loads
|
|
ok 24 - VideoModalCommentController disposes safely during in-flight comment loads
|
|
---
|
|
duration_ms: 0.678991
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController prompts login when publish requires authentication
|
|
ok 25 - VideoModalCommentController prompts login when publish requires authentication
|
|
---
|
|
duration_ms: 0.694688
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModalCommentController includes parent metadata when replying
|
|
ok 26 - VideoModalCommentController includes parent metadata when replying
|
|
---
|
|
duration_ms: 0.396988
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
ok 27 - VideoModal comment section exposes aria landmarks and participates in focus trap
|
|
---
|
|
duration_ms: 77.734351
|
|
type: 'test'
|
|
...
|
|
1..27
|
|
# tests 27
|
|
# suites 0
|
|
# pass 27
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 2529.850963
|
|
|
|
→ Running tests/video-modal-controller.test.mjs
|
|
TAP version 13
|
|
# Subtest: VideoModalController
|
|
# Subtest: ensureVideoModalReady throws if modal is missing
|
|
ok 1 - ensureVideoModalReady throws if modal is missing
|
|
---
|
|
duration_ms: 1.822035
|
|
type: 'test'
|
|
...
|
|
# Subtest: ensureVideoModalReady loads modal if needs rehydrate
|
|
ok 2 - ensureVideoModalReady loads modal if needs rehydrate
|
|
---
|
|
duration_ms: 0.439138
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster uses provided video
|
|
ok 3 - showModalWithPoster uses provided video
|
|
---
|
|
duration_ms: 0.78437
|
|
type: 'test'
|
|
...
|
|
# Subtest: showModalWithPoster falls back to current video
|
|
ok 4 - showModalWithPoster falls back to current video
|
|
---
|
|
duration_ms: 0.434669
|
|
type: 'test'
|
|
...
|
|
# Subtest: forceRemoveModalPoster calls modal method
|
|
ok 5 - forceRemoveModalPoster calls modal method
|
|
---
|
|
duration_ms: 0.278677
|
|
type: 'test'
|
|
...
|
|
1..5
|
|
ok 1 - VideoModalController
|
|
---
|
|
duration_ms: 5.684192
|
|
type: 'test'
|
|
...
|
|
1..1
|
|
# tests 6
|
|
# suites 0
|
|
# pass 6
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 18.418388
|
|
|
|
→ Running tests/video-modal-controllers.test.mjs
|
|
TAP version 13
|
|
# Subtest: video modal rehydrates and plays through a connected element across views
|
|
ok 1 - video modal rehydrates and plays through a connected element across views
|
|
---
|
|
duration_ms: 327.375648
|
|
type: 'test'
|
|
...
|
|
# Subtest: torrent-only playback resets the modal video before the next hosted session
|
|
ok 2 - torrent-only playback resets the modal video before the next hosted session
|
|
---
|
|
duration_ms: 24.46139
|
|
type: 'test'
|
|
...
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
[VideoModal] Cleared loading poster (close).
|
|
# Subtest: backdrop data-dismiss closes the modal and restores focus
|
|
ok 3 - backdrop data-dismiss closes the modal and restores focus
|
|
---
|
|
duration_ms: 312.248023
|
|
type: 'test'
|
|
...
|
|
# Subtest: Escape key closes the modal and returns focus to the trigger
|
|
ok 4 - Escape key closes the modal and returns focus to the trigger
|
|
---
|
|
duration_ms: 104.601484
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal sticky navigation responds to scroll direction
|
|
ok 5 - video modal sticky navigation responds to scroll direction
|
|
---
|
|
duration_ms: 86.82105
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal video shell is not sticky at mobile breakpoints
|
|
ok 6 - video modal video shell is not sticky at mobile breakpoints
|
|
---
|
|
duration_ms: 86.051215
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal toggles document scroll locking on open/close
|
|
ok 7 - video modal toggles document scroll locking on open/close
|
|
---
|
|
duration_ms: 83.55835
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal comments region exposes aria landmarks and stays in the focus order
|
|
ok 8 - video modal comments region exposes aria landmarks and stays in the focus order
|
|
---
|
|
duration_ms: 93.440586
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal zap dialog updates aria state while toggling
|
|
ok 9 - video modal zap dialog updates aria state while toggling
|
|
---
|
|
duration_ms: 248.423901
|
|
type: 'test'
|
|
...
|
|
# Subtest: video modal inherits design system mode when loaded dynamically
|
|
ok 10 - video modal inherits design system mode when loaded dynamically
|
|
---
|
|
duration_ms: 77.244605
|
|
type: 'test'
|
|
...
|
|
# Subtest: CommentsController lifecycle manages comment references
|
|
ok 11 - CommentsController lifecycle manages comment references
|
|
---
|
|
duration_ms: 81.891195
|
|
type: 'test'
|
|
...
|
|
# Subtest: ReactionsController delegates reaction updates
|
|
ok 12 - ReactionsController delegates reaction updates
|
|
---
|
|
duration_ms: 67.561332
|
|
type: 'test'
|
|
...
|
|
# Subtest: SimilarContentController toggles section visibility
|
|
ok 13 - SimilarContentController toggles section visibility
|
|
---
|
|
duration_ms: 63.398973
|
|
type: 'test'
|
|
...
|
|
# Subtest: ModerationController reset clears moderation overlay references
|
|
ok 14 - ModerationController reset clears moderation overlay references
|
|
---
|
|
duration_ms: 61.524719
|
|
type: 'test'
|
|
...
|
|
# Subtest: VideoModal trims tag strip to fit modal width
|
|
ok 15 - VideoModal trims tag strip to fit modal width
|
|
---
|
|
duration_ms: 69.846064
|
|
type: 'test'
|
|
...
|
|
1..15
|
|
# tests 15
|
|
# suites 0
|
|
# pass 15
|
|
# fail 0
|
|
# cancelled 0
|
|
# skipped 0
|
|
# todo 0
|
|
# duration_ms 1850.314216
|
|
|
|
→ Running tests/video-modal-moderation.test.mjs
|