diff --git a/public/js/pages/Settings.js b/public/js/pages/Settings.js index 57dc6d1..4b10395 100644 --- a/public/js/pages/Settings.js +++ b/public/js/pages/Settings.js @@ -154,12 +154,9 @@ class SettingsPage { const presentation = LiveAnalysisPresentation.present(status); buttons.forEach(button => { button.disabled = presentation.busy; }); const rebuildButton = document.getElementById('live-rebuild-catalog-button'); - const fullRefreshPhases = new Set([ - 'refreshing_live_sources', 'refreshing_epg_sources', 'matching_epg', - 'laya_epg_matching', 'writing_epg_matches' - ]); const fullRefreshBusy = presentation.busy && - (this.currentLiveAnalysisAction === 'rebuild' || fullRefreshPhases.has(presentation.phase)); + (this.currentLiveAnalysisAction === 'rebuild' || + LiveAnalysisPresentation.isFullRefreshPhase(presentation.phase)); if (rebuildButton) rebuildButton.textContent = fullRefreshBusy ? 'Refreshing…' : 'Run full refresh'; statusElement.textContent = presentation.statusLabel; progress.hidden = !presentation.busy; diff --git a/public/js/services/liveAnalysisPresentation.js b/public/js/services/liveAnalysisPresentation.js index 9e218ac..22a6814 100644 --- a/public/js/services/liveAnalysisPresentation.js +++ b/public/js/services/liveAnalysisPresentation.js @@ -8,6 +8,14 @@ const INDETERMINATE_PHASES = new Set([ 'writing', 'refreshing_live_sources', 'refreshing_epg_sources', 'writing_epg_matches' ]); + const FULL_REFRESH_PHASES = new Set([ + 'refreshing_live_sources', 'laya_identity', 'laya_language', 'projecting', 'writing', + 'refreshing_epg_sources', 'matching_epg', 'laya_epg_matching', 'writing_epg_matches' + ]); + + function isFullRefreshPhase(phase) { + return FULL_REFRESH_PHASES.has(String(phase || '').toLowerCase()); + } function progressValues(status, phase) { if (phase === 'laya_identity') { @@ -93,5 +101,5 @@ : ''; } - return { layaFallbackMessage, present }; + return { isFullRefreshPhase, layaFallbackMessage, present }; }); diff --git a/test/liveAnalysisPresentation.test.js b/test/liveAnalysisPresentation.test.js index 71e00b6..11fd493 100644 --- a/test/liveAnalysisPresentation.test.js +++ b/test/liveAnalysisPresentation.test.js @@ -1,6 +1,16 @@ const test = require('node:test'); const assert = require('node:assert/strict'); -const { layaFallbackMessage, present } = require('../public/js/services/liveAnalysisPresentation.js'); +const { isFullRefreshPhase, layaFallbackMessage, present } = require('../public/js/services/liveAnalysisPresentation.js'); + +test('classifies every persisted full refresh phase centrally', () => { + const phases = [ + 'refreshing_live_sources', 'laya_identity', 'laya_language', 'projecting', 'writing', + 'refreshing_epg_sources', 'matching_epg', 'laya_epg_matching', 'writing_epg_matches' + ]; + assert.ok(phases.every(isFullRefreshPhase)); + assert.equal(isFullRefreshPhase('complete'), false); + assert.equal(isFullRefreshPhase(''), false); +}); test('presents determinate channel analysis progress', () => { const view = present({ status: 'building', phase: 'projecting', processed: 25, total: 100 }); diff --git a/test/t44FullRefreshLiveRegression.test.js b/test/t44FullRefreshLiveRegression.test.js new file mode 100644 index 0000000..8874d2c --- /dev/null +++ b/test/t44FullRefreshLiveRegression.test.js @@ -0,0 +1,57 @@ +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(` + + + +
+