mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 16:02:26 +00:00
92 lines
3.2 KiB
JavaScript
92 lines
3.2 KiB
JavaScript
import { test, describe, beforeEach, afterEach, mock } from 'node:test';
|
|
import assert from 'node:assert';
|
|
import ExploreDataService from '../../../js/services/exploreDataService.js';
|
|
|
|
describe('ExploreDataService', () => {
|
|
let service;
|
|
let originalDocument;
|
|
let visibilityHandler;
|
|
|
|
beforeEach(() => {
|
|
// Mock global document
|
|
originalDocument = global.document;
|
|
visibilityHandler = null;
|
|
global.document = {
|
|
hidden: false,
|
|
addEventListener: (event, handler) => {
|
|
if (event === 'visibilitychange') {
|
|
visibilityHandler = handler;
|
|
}
|
|
},
|
|
removeEventListener: () => {}
|
|
};
|
|
|
|
service = new ExploreDataService({
|
|
historyRefreshIntervalMs: 100,
|
|
idfRefreshIntervalMs: 100,
|
|
logger: { warn: () => {} } // silent logger
|
|
});
|
|
|
|
// Mock the refresh methods to track calls
|
|
service.refreshWatchHistoryTagCounts = mock.fn();
|
|
service.refreshTagIdf = mock.fn();
|
|
});
|
|
|
|
afterEach(() => {
|
|
if (service) {
|
|
service.destroy();
|
|
}
|
|
global.document = originalDocument;
|
|
mock.restoreAll();
|
|
});
|
|
|
|
test('intervals trigger refresh when visible', (t) => {
|
|
t.mock.timers.enable({ apis: ['setInterval'] });
|
|
service.startIntervals();
|
|
|
|
// Advance time by 150ms (interval is 100ms)
|
|
t.mock.timers.tick(150);
|
|
|
|
assert.strictEqual(service.refreshWatchHistoryTagCounts.mock.callCount(), 1);
|
|
assert.strictEqual(service.refreshTagIdf.mock.callCount(), 1);
|
|
});
|
|
|
|
test('intervals skip refresh when hidden', (t) => {
|
|
global.document.hidden = true;
|
|
t.mock.timers.enable({ apis: ['setInterval'] });
|
|
service.startIntervals();
|
|
|
|
// Advance time by 150ms
|
|
t.mock.timers.tick(150);
|
|
|
|
assert.strictEqual(service.refreshWatchHistoryTagCounts.mock.callCount(), 0, "Should skip history refresh when hidden");
|
|
assert.strictEqual(service.refreshTagIdf.mock.callCount(), 0, "Should skip IDF refresh when hidden");
|
|
});
|
|
|
|
test('visibility change triggers refresh', () => {
|
|
service.subscribeToUpdates();
|
|
|
|
assert.ok(visibilityHandler, "Visibility change listener should be registered");
|
|
|
|
// Simulate hidden -> visible
|
|
global.document.hidden = false;
|
|
visibilityHandler();
|
|
|
|
assert.strictEqual(service.refreshWatchHistoryTagCounts.mock.callCount(), 1, "Should refresh history on visibility");
|
|
assert.strictEqual(service.refreshTagIdf.mock.callCount(), 1, "Should refresh IDF on visibility");
|
|
});
|
|
|
|
test('visibility change DOES NOT trigger refresh if hidden', () => {
|
|
service.subscribeToUpdates();
|
|
|
|
assert.ok(visibilityHandler, "Visibility change listener should be registered");
|
|
|
|
// Simulate visible -> hidden (handler called but document.hidden is true)
|
|
global.document.hidden = true;
|
|
visibilityHandler();
|
|
|
|
assert.strictEqual(service.refreshWatchHistoryTagCounts.mock.callCount(), 0, "Should NOT refresh when becoming hidden");
|
|
assert.strictEqual(service.refreshTagIdf.mock.callCount(), 0, "Should NOT refresh when becoming hidden");
|
|
});
|
|
});
|