const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { JSDOM } = require('jsdom');
const root = path.resolve(__dirname, '..');
const readPublicScript = relativePath => fs.readFileSync(path.join(root, 'public', relativePath), 'utf8');
function createSettingsDom() {
const dom = new JSDOM(`
`, { url: 'http://nodecast.test/', runScripts: 'outside-only' });
const { window } = dom;
window.eval(readPublicScript('js/services/liveAnalysisPresentation.js'));
window.eval(`${readPublicScript('js/pages/Settings.js')}\nwindow.SettingsPage = SettingsPage;`);
return { dom, window };
}
test('full refresh keeps the rebuild action visibly busy during Laya language detection from persisted status', () => {
const { dom, window } = createSettingsDom();
const settingsPage = Object.create(window.SettingsPage.prototype);
settingsPage.app = { player: { settings: { languageDetectionMode: 'laya' } } };
settingsPage.layaStatus = { modelPresent: true, runtimeAvailable: true };
settingsPage.currentLiveAnalysisAction = '';
try {
settingsPage.renderLiveAnalysisStatus({
status: 'building',
phase: 'laya_language',
phaseProcessed: 2,
phaseTotal: 4,
processed: 0,
total: 128
});
assert.equal(window.document.getElementById('live-analysis-status').textContent, 'Detecting stream languages…');
assert.equal(window.document.getElementById('live-analysis-progress-text').textContent, 'Language batch 2 of 4 · 50%');
assert.equal(
window.document.getElementById('live-rebuild-catalog-button').textContent,
'Refreshing…',
'full refresh should remain visibly active while the backend publishes laya_language'
);
} finally {
dom.window.close();
}
});