> 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: 7.683186 type: 'test' ... 1..1 # tests 1 # suites 0 # pass 1 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 28.640279 → 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: 376.493065 type: 'test' ... # Subtest: renderChannelVideosFromList applies moderation blur without existing metadata ok 2 - renderChannelVideosFromList applies moderation blur without existing metadata --- duration_ms: 39.743453 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.335853 type: 'test' ... # Subtest: moderation override clears channel blur via event wiring ok 4 - moderation override clears channel blur via event wiring --- duration_ms: 47.515622 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: 52.962084 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: 27.377719 type: 'test' ... 1..6 # tests 6 # suites 0 # pass 6 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 573.718626 → 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.304539 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.802311 type: 'test' ... # Subtest: handleHashChange respects explicit view regardless of login state ok 3 - handleHashChange respects explicit view regardless of login state --- duration_ms: 10.826679 type: 'test' ... 1..3 # tests 3 # suites 0 # pass 3 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 111.820727 → 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: 121.895181 type: 'test' ... # Subtest: hydrateSidebarNavigation hides chrome controls for logged-out viewers ok 2 - hydrateSidebarNavigation hides chrome controls for logged-out viewers --- duration_ms: 27.859075 type: 'test' ... 1..2 # tests 2 # suites 0 # pass 2 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 166.232762 → 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: 2.070726 type: 'test' ... # Subtest: isUserLoggedIn treats extension logins as authenticated ok 2 - isUserLoggedIn treats extension logins as authenticated --- duration_ms: 0.592571 type: 'test' ... # Subtest: isUserLoggedIn guards against mismatched nostrClient state ok 3 - isUserLoggedIn guards against mismatched nostrClient state --- duration_ms: 0.445862 type: 'test' ... # Subtest: isUserLoggedIn ignores anonymous session actor mismatches ok 4 - isUserLoggedIn ignores anonymous session actor mismatches --- duration_ms: 0.5379 type: 'test' ... # Subtest: isUserLoggedIn rejects mismatched managed session actors ok 5 - isUserLoggedIn rejects mismatched managed session actors --- duration_ms: 0.568571 type: 'test' ... 1..5 # tests 5 # suites 0 # pass 5 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 42.558696 → Running tests/app/moderation-overrides.test.mjs [bitvid] Initialized nostr nip04 helpers. [bitvid] Initialized nostr nip44 helpers. DEBUG: Test 3 Result: true 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: 221.521473 type: 'test' ... # Subtest: handleModerationOverride resumes deferred playback ok 2 - handleModerationOverride resumes deferred playback --- duration_ms: 1.277155 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.235509 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:229: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.748986 type: 'test' ... 1..4 # tests 4 # suites 0 # pass 3 # fail 1 # cancelled 0 # skipped 0 # todo 0 # duration_ms 263.815159 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