Files
bitvid/tests/revert-modal-controller.test.mjs
T

133 lines
3.4 KiB
JavaScript

import { test } from 'node:test';
import assert from 'node:assert/strict';
import RevertModalController from '../js/ui/revertModalController.js';
test('RevertModalController', async (t) => {
const mockVideo = { id: 'v1', pubkey: 'p1' };
const mockHistory = [{ id: 'v1' }, { id: 'v0' }];
const mocks = {
revertModal: {
load: async () => true,
setHistory: () => {},
open: () => {},
close: () => {},
setBusy: () => {},
},
services: {
nostrService: {
fetchVideos: async () => [mockVideo],
},
nostrClient: {
hydrateVideoHistory: async () => mockHistory,
revertVideo: async () => {},
},
},
state: {
getPubkey: () => 'p1', // must match video pubkey
getBlacklistedEventIds: () => new Set(),
},
ui: {
showError: () => {},
showSuccess: () => {},
},
callbacks: {
loadVideos: async () => {},
forceRefreshAllProfiles: () => {},
isAuthorBlocked: () => false,
},
helpers: {
normalizeActionTarget: () => ({ triggerElement: null }),
resolveVideoActionTarget: async () => mockVideo,
formatAbsoluteTimestamp: () => 'timestamp',
},
};
await t.test('open() fetches history and opens modal', async () => {
let historySet = null;
let modalOpened = false;
const controller = new RevertModalController({
...mocks,
revertModal: {
...mocks.revertModal,
setHistory: (_v, h) => {
historySet = h;
},
open: () => {
modalOpened = true;
},
},
});
await controller.open('v1');
assert.deepEqual(historySet, mockHistory, 'History should be set');
assert.equal(modalOpened, true, 'Modal should be opened');
});
await t.test('open() shows error if not logged in', async () => {
let errorMsg = '';
const controller = new RevertModalController({
...mocks,
state: { ...mocks.state, getPubkey: () => null },
ui: {
...mocks.ui,
showError: (m) => {
errorMsg = m;
},
},
});
await controller.open('v1');
assert.match(errorMsg, /login/, 'Should show login error');
});
await t.test('handleConfirm() calls revertVideo and refreshes', async () => {
let revertCalled = false;
let refreshCalled = false;
let modalClosed = false;
let modalBusyState = null;
const controller = new RevertModalController({
...mocks,
services: {
...mocks.services,
nostrClient: {
...mocks.services.nostrClient,
revertVideo: async () => {
revertCalled = true;
},
},
},
callbacks: {
...mocks.callbacks,
loadVideos: async () => {
refreshCalled = true;
},
},
revertModal: {
...mocks.revertModal,
close: () => {
modalClosed = true;
},
setBusy: (busy) => {
modalBusyState = busy;
},
},
});
await controller.handleConfirm({
detail: {
target: mockVideo,
entries: [{ id: 'v1', pubkey: 'p1', tags: [] }],
},
});
assert.equal(revertCalled, true, 'revertVideo should be called');
assert.equal(refreshCalled, true, 'loadVideos should be called');
assert.equal(modalClosed, true, 'Modal should be closed');
assert.equal(modalBusyState, false, 'Modal should not be busy at end');
});
});