> bitvid@1.0.0 test:unit > node scripts/run-unit-tests.mjs → Running tests/app-batch-fetch-profiles.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. [batchFetchProfiles] Failed to fetch profiles from relay wss://fail.example: Error: relay timed out at Object.list (file:///app/tests/app-batch-fetch-profiles.test.mjs:80:31) at file:///app/js/utils/profileBatchFetcher.js:115:10 at Array.map () at batchFetchProfilesFromRelays (file:///app/js/utils/profileBatchFetcher.js:112:75) at TestContext. (file:///app/tests/app-batch-fetch-profiles.test.mjs:87:11) at Test.runInAsyncScope (node:async_hooks:214:14) at Test.run (node:internal/test_runner/test:1047:25) at Test.start (node:internal/test_runner/test:944:17) at startSubtestAfterBootstrap (node:internal/test_runner/harness:296:17) TAP version 13 # Subtest: batchFetchProfiles handles fast and failing relays ok 1 - batchFetchProfiles handles fast and failing relays --- duration_ms: 3.941211 type: 'test' ... 1..1 # tests 1 # suites 0 # pass 1 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 16.455907 → Running tests/app/channel-profile-moderation.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. [feedEngine/moderation] metadata.moderation updated { stage: 'moderation', videoId: 'vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv', blockAutoplay: true, blurThumbnail: true, trustedCount: 2, reportType: 'nudity', hidden: false, hideReason: null, hideBypass: null } TAP version 13 # Subtest: renderChannelVideosFromList decorates videos before storing ok 1 - renderChannelVideosFromList decorates videos before storing --- duration_ms: 243.403366 type: 'test' ... # Subtest: renderChannelVideosFromList applies moderation blur without existing metadata ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata --- duration_ms: 31.534109 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: 10.992319 type: 'test' ... # Subtest: moderation override clears channel blur via event wiring ok 4 - moderation override clears channel blur via event wiring --- duration_ms: 38.203729 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: 32.713928 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: 20.992921 type: 'test' ... 1..6 # tests 6 # suites 0 # pass 6 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 389.736415 → 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: 73.866587 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.66665 type: 'test' ... # Subtest: handleHashChange respects explicit view regardless of login state ok 3 - handleHashChange respects explicit view regardless of login state --- duration_ms: 9.863301 type: 'test' ... 1..3 # tests 3 # suites 0 # pass 3 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 106.76867 → Running tests/app/hydrate-sidebar-navigation.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. TAP version 13 # Subtest: hydrateSidebarNavigation reveals chrome controls for authenticated viewers ok 1 - hydrateSidebarNavigation reveals chrome controls for authenticated viewers --- duration_ms: 85.299474 type: 'test' ... # Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers ok 2 - hydrateSidebarNavigation hides chrome controls for logged-out viewers --- duration_ms: 13.586181 type: 'test' ... 1..2 # tests 2 # suites 0 # pass 2 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 110.142612 → Running tests/app/is-user-logged-in.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. 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.567229 type: 'test' ... # Subtest: isUserLoggedIn treats extension logins as authenticated ok 2 - isUserLoggedIn treats extension logins as authenticated --- duration_ms: 0.354268 type: 'test' ... # Subtest: isUserLoggedIn guards against mismatched nostrClient state ok 3 - isUserLoggedIn guards against mismatched nostrClient state --- duration_ms: 0.275984 type: 'test' ... # Subtest: isUserLoggedIn ignores anonymous session actor mismatches ok 4 - isUserLoggedIn ignores anonymous session actor mismatches --- duration_ms: 0.274841 type: 'test' ... # Subtest: isUserLoggedIn rejects mismatched managed session actors ok 5 - isUserLoggedIn rejects mismatched managed session actors --- duration_ms: 0.252751 type: 'test' ... 1..5 # tests 5 # suites 0 # pass 5 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 34.328915 → Running tests/app/moderation-overrides.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. 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: 225.848661 type: 'test' ... # Subtest: handleModerationOverride resumes deferred playback ok 2 - handleModerationOverride resumes deferred playback --- duration_ms: 1.28016 type: 'test' ... # Subtest: handleModerationBlock requests a block, clears overrides, and refreshes hidden state not ok 3 - handleModerationBlock requests a block, clears overrides, and refreshes hidden state --- duration_ms: 5.041835 type: 'test' location: '/app/tests/app/moderation-overrides.test.mjs:112:1' failureType: 'testCodeFailure' error: |- Expected values to be strictly equal: false !== true code: 'ERR_ASSERTION' name: 'AssertionError' expected: true actual: false operator: 'strictEqual' stack: |- TestContext. (file:///app/tests/app/moderation-overrides.test.mjs:232:10) async Test.run (node:internal/test_runner/test:1054:7) async Test.processPendingSubtests (node:internal/test_runner/test:744:7) ... # Subtest: handleModerationBlock returns false when viewer is logged out ok 4 - handleModerationBlock returns false when viewer is logged out --- duration_ms: 1.571133 type: 'test' ... 1..4 # tests 4 # suites 0 # pass 3 # fail 1 # cancelled 0 # skipped 0 # todo 0 # duration_ms 268.845775 file:///app/scripts/run-unit-tests.mjs:68 reject(new Error(`${relativePath} failed with exit code ${code}`)); ^ Error: tests/app/moderation-overrides.test.mjs failed with exit code 1 at ChildProcess. (file:///app/scripts/run-unit-tests.mjs:68:16) at ChildProcess.emit (node:events:519:28) at maybeClose (node:internal/child_process:1101:16) at ChildProcess._handle.onexit (node:internal/child_process:304:5) Node.js v22.21.1