const { test, describe, beforeEach } = require('node:test'); const assert = require('node:assert'); // Mock ipcRenderer for all modules const mockIpcRenderer = { invoke: async (channel, ...args) => { switch (channel) { case 'select-directory': return { success: true, directory: '/test/dir' }; case 'scan-directory': return { success: true, files: [{ name: 'test.mp4', type: 'media' }], folders: [] }; case 'rename-file': return { success: true, message: 'Renamed' }; case 'begin-mapping': return { success: true }; case 'log-audit-event': return { success: true }; case 'move-file-to-folder': return { success: true }; case 'log-file-info': return { success: true, fileInfo: { duration: 3600000 } }; case 'search-tvdb': return { success: true, results: [{ seriesName: 'Test Show', id: '123' }] }; case 'get-show-details': return { success: true, data: { seasons: [{ number: 1, episodeCount: 10 }] } }; case 'get-season-episodes': return { success: true, data: { episodes: [{ episodeNumber: 1, absoluteNumber: 1, episode: 'Pilot' }] } }; case 'test-tvdb-api': return { success: true, message: 'OK' }; default: return { success: true, data: null }; } }, on: () => {}, removeListener: () => {} }; // Mock fs const mockFs = { existsSync: () => true, statSync: () => ({ size: 1024 * 1024 }), mkdirSync: () => {}, renameSync: () => {}, readdirSync: () => [], writeFileSync: () => {} }; // Mock document for UIManager const mockDocument = { getElementById: () => null, querySelector: () => null, querySelectorAll: () => [], createElement: () => ({ addEventListener: () => {}, setAttribute: () => {}, removeAttribute: () => {}, getAttribute: () => null, style: {}, classList: { add: () => {}, remove: () => {} }, appendChild: () => {}, insertBefore: () => {}, remove: () => {}, innerHTML: '', textContent: '', dataset: {}, tagName: 'DIV' }), body: { appendChild: () => {} } }; // Make document available globally global.document = mockDocument; // Intercept module loading - must be done before any modules that require electron/fs are loaded const Module = require('module'); const path = require('path'); // Store original require const originalRequire = Module.prototype.require; // Create a mock electron module that exports ipcRenderer const mockElectron = { ipcRenderer: mockIpcRenderer }; // Mock fs module const mockFsModule = mockFs; // Override require for specific modules Module.prototype.require = function(id) { // Handle electron if (id === 'electron') { return mockElectron; } // Handle fs if (id === 'fs') { return mockFsModule; } // For relative paths, use original require if (id.startsWith('.')) { return originalRequire.apply(this, arguments); } // For other modules, try original require try { return originalRequire.apply(this, arguments); } catch (e) { // If module not found, return empty object return {}; } }; // Load all modules const AppState = require('./utils/renderer/AppState.js'); const EpisodeManager = require('./utils/renderer/EpisodeManager.js'); const TagManager = require('./utils/renderer/TagManager.js'); const SearchManager = require('./utils/renderer/SearchManager.js'); const FileManager = require('./utils/renderer/FileManager.js'); const ModalManager = require('./utils/renderer/ModalManager.js'); const ProgressManager = require('./utils/renderer/ProgressManager.js'); const FileListManager = require('./utils/renderer/FileListManager.js'); const UIManager = require('./utils/renderer/UIManager.js'); // ============ AppState Tests ============ describe('AppState', () => { let appState; beforeEach(() => { appState = new AppState(); }); test('should create instance with default values', () => { assert.strictEqual(appState.currentDirectory, null); assert.deepStrictEqual(appState.currentFiles, []); assert.strictEqual(appState.currentShow, null); assert.deepStrictEqual(appState.currentSeasons, []); assert.deepStrictEqual(appState.currentEpisodes, []); assert.strictEqual(appState.selectedSeasonEpisodeCount, 0); assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); }); test('should set and get current directory', () => { appState.setCurrentDirectory('/test/dir'); assert.strictEqual(appState.currentDirectory, '/test/dir'); }); test('should set and get current files', () => { appState.setCurrentFiles([{ name: 'file.mp4' }]); assert.deepStrictEqual(appState.currentFiles, [{ name: 'file.mp4' }]); }); test('should set and get current show', () => { appState.setCurrentShow({ id: '123', seriesName: 'Test' }); assert.deepStrictEqual(appState.currentShow, { id: '123', seriesName: 'Test' }); }); test('should set and get current seasons', () => { appState.setCurrentSeasons([{ number: 1, episodeCount: 10 }]); assert.deepStrictEqual(appState.currentSeasons, [{ number: 1, episodeCount: 10 }]); }); test('should set and get current episodes', () => { appState.setCurrentEpisodes([{ episodeNumber: 1 }]); assert.deepStrictEqual(appState.currentEpisodes, [{ episodeNumber: 1 }]); }); test('should set and get selected season episode count', () => { appState.setSelectedSeasonEpisodeCount(25); assert.strictEqual(appState.selectedSeasonEpisodeCount, 25); }); test('should set and get updating episode numbers flag', () => { appState.setUpdatingEpisodeNumbers(true); assert.strictEqual(appState.isUpdatingEpisodeNumbers, true); appState.setUpdatingEpisodeNumbers(false); assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); }); test('should reset all state', () => { appState.setCurrentDirectory('/test'); appState.setCurrentFiles([{ name: 'file.mp4' }]); appState.setCurrentShow({ id: '1' }); appState.setSelectedSeasonEpisodeCount(10); appState.reset(); assert.strictEqual(appState.currentDirectory, null); assert.deepStrictEqual(appState.currentFiles, []); assert.strictEqual(appState.currentShow, null); assert.deepStrictEqual(appState.currentSeasons, []); assert.deepStrictEqual(appState.currentEpisodes, []); assert.strictEqual(appState.selectedSeasonEpisodeCount, 0); assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); }); }); // ============ EpisodeManager Tests ============ describe('EpisodeManager', () => { let episodeManager; beforeEach(() => { episodeManager = new EpisodeManager(); }); test('should initialize with isUpdatingEpisodeNumbers false', () => { assert.strictEqual(episodeManager.isUpdatingEpisodeNumbers, false); }); test('should get updating episode numbers flag', () => { assert.strictEqual(episodeManager.getIsUpdatingEpisodeNumbers(), false); }); test('should set updating episode numbers flag', () => { episodeManager.setIsUpdatingEpisodeNumbers(true); assert.strictEqual(episodeManager.getIsUpdatingEpisodeNumbers(), true); episodeManager.setIsUpdatingEpisodeNumbers(false); assert.strictEqual(episodeManager.getIsUpdatingEpisodeNumbers(), false); }); test('should get episode range from element with start and end', () => { const mockElement = { dataset: { episodeStart: '1', episodeEnd: '3' } }; const range = episodeManager.getEpisodeRange(mockElement); assert.strictEqual(range.start, 1); assert.strictEqual(range.end, 3); }); test('should get episode range with single episode', () => { const mockElement = { dataset: { episodeStart: '5' } }; const range = episodeManager.getEpisodeRange(mockElement); assert.strictEqual(range.start, 5); assert.strictEqual(range.end, 5); }); test('should default to episode 1 when no start specified', () => { const mockElement = { dataset: { episodeEnd: '3' } }; const range = episodeManager.getEpisodeRange(mockElement); assert.strictEqual(range.start, 1); assert.strictEqual(range.end, 3); }); test('should have updateEpisodeNumbers method', () => { assert.strictEqual(typeof episodeManager.updateEpisodeNumbers, 'function'); }); test('should have removeEpisodeHighlights method', () => { assert.strictEqual(typeof episodeManager.removeEpisodeHighlights, 'function'); }); test('should have getLastEpisodeEnd method', () => { assert.strictEqual(typeof episodeManager.getLastEpisodeEnd, 'function'); }); }); // ============ TagManager Tests ============ describe('TagManager', () => { let tagManager; beforeEach(() => { tagManager = new TagManager(); }); test('should initialize', () => { assert.ok(tagManager); }); test('should have getTaggedFiles method', () => { assert.strictEqual(typeof tagManager.getTaggedFiles, 'function'); }); }); // ============ SearchManager Tests ============ describe('SearchManager', () => { let searchManager; beforeEach(() => { searchManager = new SearchManager(); }); test('should initialize with currentShow null', () => { assert.strictEqual(searchManager.currentShow, null); }); test('should initialize with currentSeasons undefined', () => { assert.strictEqual(searchManager.currentSeasons, undefined); }); test('should initialize with currentEpisodes undefined', () => { assert.strictEqual(searchManager.currentEpisodes, undefined); }); test('should have updateFileListWithEpisodeInfo method', () => { assert.strictEqual(typeof searchManager.updateFileListWithEpisodeInfo, 'function'); }); }); // ============ FileManager Tests ============ describe('FileManager', () => { let fileManager; beforeEach(() => { fileManager = new FileManager(); }); test('should select directory via IPC', async () => { const result = await fileManager.selectDirectory(); assert.strictEqual(result.success, true); assert.strictEqual(result.directory, '/test/dir'); }); test('should scan directory via IPC', async () => { const result = await fileManager.scanDirectory('/test/dir'); assert.strictEqual(result.success, true); assert.deepStrictEqual(result.files, [{ name: 'test.mp4', type: 'media' }]); }); test('should rename file via IPC', async () => { const result = await fileManager.renameFile('/test/old.mp4', '/test/new.mp4'); assert.strictEqual(result.success, true); }); test('should begin mapping via IPC', async () => { const result = await fileManager.beginMapping(); assert.strictEqual(result.success, true); }); test('should log audit event via IPC', async () => { const result = await fileManager.logAuditEvent('test event'); assert.strictEqual(result.success, true); }); test('should move file to folder via IPC', async () => { const result = await fileManager.moveFileToFolder('/test/file.mp4', 'extras'); assert.strictEqual(result.success, true); }); test('should log file info via IPC', async () => { const result = await fileManager.logFileInfo('/test/file.mp4'); assert.strictEqual(result.success, true); }); }); // ============ ModalManager Tests ============ describe('ModalManager', () => { let modalManager; beforeEach(() => { modalManager = new ModalManager(); }); test('should initialize with videoPreviewModal null', () => { assert.strictEqual(modalManager.videoPreviewModal, null); }); test('should have openVideoPreview method', () => { assert.strictEqual(typeof modalManager.openVideoPreview, 'function'); }); test('should have createVideoPreviewModal method', () => { assert.strictEqual(typeof modalManager.createVideoPreviewModal, 'function'); }); test('should have loadVideoPreview method', () => { assert.strictEqual(typeof modalManager.loadVideoPreview, 'function'); }); test('should have closeVideoPreview method', () => { assert.strictEqual(typeof modalManager.closeVideoPreview, 'function'); }); test('should have getModal method', () => { assert.strictEqual(typeof modalManager.getModal, 'function'); }); }); // ============ ProgressManager Tests ============ describe('ProgressManager', () => { let progressManager; beforeEach(() => { progressManager = new ProgressManager(); }); test('should show progress with default message', () => { progressManager.showProgress(); assert.ok(true); // If no error, test passes }); test('should show progress with custom message', () => { progressManager.showProgress('Custom message'); assert.ok(true); // If no error, test passes }); test('should hide progress', () => { progressManager.hideProgress(); assert.ok(true); // If no error, test passes }); test('should update progress count', () => { progressManager.updateProgressCount(10, 100); assert.ok(true); // If no error, test passes }); test('should update progress text', () => { progressManager.updateProgressText('Processing...'); assert.ok(true); // If no error, test passes }); }); // ============ FileListManager Tests ============ describe('FileListManager', () => { let fileListManager; let mockFileListEl; beforeEach(() => { // Create a mock DOM element mockFileListEl = { querySelectorAll: () => [], innerHTML: '', appendChild: () => {}, insertBefore: () => {} }; fileListManager = new FileListManager(mockFileListEl); }); test('should have getMediaFileItems method', () => { assert.strictEqual(typeof fileListManager.getMediaFileItems, 'function'); }); test('should have getFolderItems method', () => { assert.strictEqual(typeof fileListManager.getFolderItems, 'function'); }); test('should have updateEpisodeNumbers method', () => { assert.strictEqual(typeof fileListManager.updateEpisodeNumbers, 'function'); }); test('should get media file items', () => { const items = fileListManager.getMediaFileItems(); assert.deepStrictEqual(items, []); }); test('should get folder items', () => { const items = fileListManager.getFolderItems(); assert.deepStrictEqual(items, []); }); }); // ============ AppState Additional Tests ============ describe('AppState - additional tests', () => { let appState; beforeEach(() => { appState = new AppState(); }); test('should update current directory', () => { appState.setCurrentDirectory('/new/dir'); assert.strictEqual(appState.currentDirectory, '/new/dir'); }); test('should update current files array', () => { const files = [ { name: 'file1.mp4', path: '/test/file1.mp4' }, { name: 'file2.mp4', path: '/test/file2.mp4' } ]; appState.setCurrentFiles(files); assert.strictEqual(appState.currentFiles.length, 2); }); test('should update current show object', () => { const show = { id: '456', seriesName: 'Another Show' }; appState.setCurrentShow(show); assert.strictEqual(appState.currentShow.seriesName, 'Another Show'); }); test('should update current seasons array', () => { const seasons = [ { number: 1, episodeCount: 10 }, { number: 2, episodeCount: 12 } ]; appState.setCurrentSeasons(seasons); assert.strictEqual(appState.currentSeasons.length, 2); }); test('should update current episodes array', () => { const episodes = [ { episodeNumber: 1, title: 'Episode 1' }, { episodeNumber: 2, title: 'Episode 2' } ]; appState.setCurrentEpisodes(episodes); assert.strictEqual(appState.currentEpisodes.length, 2); }); test('should update selected season episode count', () => { appState.setSelectedSeasonEpisodeCount(25); assert.strictEqual(appState.selectedSeasonEpisodeCount, 25); }); test('should toggle updating episode numbers flag', () => { assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); appState.setUpdatingEpisodeNumbers(true); assert.strictEqual(appState.isUpdatingEpisodeNumbers, true); }); test('should reset state completely', () => { appState.setCurrentDirectory('/test'); appState.setCurrentFiles([{ name: 'test.mp4' }]); appState.setCurrentShow({ id: '123' }); appState.setCurrentSeasons([{ number: 1 }]); appState.setCurrentEpisodes([{ episodeNumber: 1 }]); appState.setSelectedSeasonEpisodeCount(10); appState.setUpdatingEpisodeNumbers(true); appState.reset(); assert.strictEqual(appState.currentDirectory, null); assert.deepStrictEqual(appState.currentFiles, []); assert.strictEqual(appState.currentShow, null); assert.deepStrictEqual(appState.currentSeasons, []); assert.deepStrictEqual(appState.currentEpisodes, []); assert.strictEqual(appState.selectedSeasonEpisodeCount, 0); assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); }); }); // ============ EpisodeManager Additional Tests ============ describe('EpisodeManager - additional tests', () => { let episodeManager; beforeEach(() => { episodeManager = new EpisodeManager(); }); test('should get last episode end from fileListEl', () => { const mockFileListEl = { querySelector: (selector) => { if (selector === '.episode-number') { return { dataset: { episodeEnd: '10' } }; } return null; }, querySelectorAll: (selector) => { if (selector === '.file-item:not(.folder-item)') { return [{ querySelector: (sel) => { if (sel === '.episode-number') { return { dataset: { episodeEnd: '10' } }; } return null; } }]; } return []; } }; const result = episodeManager.getLastEpisodeEnd(mockFileListEl); assert.strictEqual(result, 10); }); }); // ============ TagManager Additional Tests ============ describe('TagManager - additional tests', () => { let tagManager; beforeEach(() => { tagManager = new TagManager(); }); test('should have tagFile method', () => { assert.strictEqual(typeof tagManager.tagFile, 'function'); }); test('should have untagFile method', () => { assert.strictEqual(typeof tagManager.untagFile, 'function'); }); test('should have getTaggedFiles method', () => { assert.strictEqual(typeof tagManager.getTaggedFiles, 'function'); }); }); // ============ SearchManager Additional Tests ============ describe('SearchManager - additional tests', () => { let searchManager; beforeEach(() => { // SearchManager requires DOM elements, skip for now searchManager = null; }); test('should have searchTvdb method', () => { // This is a static method or global function assert.ok(true); // Placeholder }); }); // ============ FileManager Additional Tests ============ describe('FileManager - additional tests', () => { let fileManager; beforeEach(() => { fileManager = new FileManager(); }); test('should have openFileInPlayer method', () => { assert.strictEqual(typeof fileManager.openFileInPlayer, 'function'); }); test('should have collectFileData method', () => { assert.strictEqual(typeof fileManager.collectFileData, 'function'); }); }); // ============ ModalManager Additional Tests ============ describe('ModalManager - additional tests', () => { let modalManager; beforeEach(() => { modalManager = new ModalManager(); }); test('should have modal property', () => { assert.ok('videoPreviewModal' in modalManager); }); test('should have createVideoPreviewModal method', () => { assert.strictEqual(typeof modalManager.createVideoPreviewModal, 'function'); }); test('should have loadVideoPreview method', () => { assert.strictEqual(typeof modalManager.loadVideoPreview, 'function'); }); }); // ============ ProgressManager Additional Tests ============ describe('ProgressManager - additional tests', () => { let progressManager; beforeEach(() => { progressManager = new ProgressManager(); }); test('should have showProgress method', () => { assert.strictEqual(typeof progressManager.showProgress, 'function'); }); test('should have hideProgress method', () => { assert.strictEqual(typeof progressManager.hideProgress, 'function'); }); test('should have updateProgressCount method', () => { assert.strictEqual(typeof progressManager.updateProgressCount, 'function'); }); test('should have updateProgressText method', () => { assert.strictEqual(typeof progressManager.updateProgressText, 'function'); }); }); // ============ FileListManager Additional Tests ============ describe('FileListManager - additional tests', () => { let fileListManager; let mockFileListEl; beforeEach(() => { mockFileListEl = { querySelectorAll: () => [], innerHTML: '', appendChild: () => {}, insertBefore: () => {} }; fileListManager = new FileListManager(mockFileListEl); }); test('should have clear method', () => { assert.strictEqual(typeof fileListManager.clear, 'function'); }); test('should have displayFiles method', () => { assert.strictEqual(typeof fileListManager.displayFiles, 'function'); }); test('should have updateEpisodeNumbers method', () => { assert.strictEqual(typeof fileListManager.updateEpisodeNumbers, 'function'); }); }); // ============ UIManager Tests ============ describe('UIManager', () => { // UIManager requires full DOM setup, skip for now test('should exist', () => { assert.ok(UIManager); }); }); // ============ AppState Comprehensive Tests ============ describe('AppState - comprehensive tests', () => { let appState; beforeEach(() => { appState = new AppState(); }); test('should have all getter methods', () => { assert.strictEqual(typeof appState.getCurrentDirectory, 'function'); assert.strictEqual(typeof appState.getCurrentFiles, 'function'); assert.strictEqual(typeof appState.getCurrentShow, 'function'); assert.strictEqual(typeof appState.getCurrentSeasons, 'function'); assert.strictEqual(typeof appState.getCurrentEpisodes, 'function'); assert.strictEqual(typeof appState.getSelectedSeasonEpisodeCount, 'function'); }); test('should have all setter methods', () => { assert.strictEqual(typeof appState.setCurrentDirectory, 'function'); assert.strictEqual(typeof appState.setCurrentFiles, 'function'); assert.strictEqual(typeof appState.setCurrentShow, 'function'); assert.strictEqual(typeof appState.setCurrentSeasons, 'function'); assert.strictEqual(typeof appState.setCurrentEpisodes, 'function'); assert.strictEqual(typeof appState.setSelectedSeasonEpisodeCount, 'function'); assert.strictEqual(typeof appState.setUpdatingEpisodeNumbers, 'function'); }); test('should return null for currentDirectory initially', () => { assert.strictEqual(appState.getCurrentDirectory(), null); }); test('should return empty array for currentFiles initially', () => { assert.deepStrictEqual(appState.getCurrentFiles(), []); }); test('should return null for currentShow initially', () => { assert.strictEqual(appState.getCurrentShow(), null); }); test('should return empty array for currentSeasons initially', () => { assert.deepStrictEqual(appState.getCurrentSeasons(), []); }); test('should return empty array for currentEpisodes initially', () => { assert.deepStrictEqual(appState.getCurrentEpisodes(), []); }); test('should return 0 for selectedSeasonEpisodeCount initially', () => { assert.strictEqual(appState.getSelectedSeasonEpisodeCount(), 0); }); test('should return false for isUpdatingEpisodeNumbers initially', () => { assert.strictEqual(appState.isUpdatingEpisodeNumbers, false); }); // test('should chain setter calls', () => { // appState // .setCurrentDirectory('/test') // .setCurrentFiles([{ name: 'file.mp4' }]) // .setCurrentShow({ id: '123' }); // assert.strictEqual(appState.getCurrentDirectory(), '/test'); // assert.strictEqual(appState.getCurrentFiles().length, 1); // assert.strictEqual(appState.getCurrentShow().id, '123'); // }); test('should handle complex show object', () => { const complexShow = { id: '456', seriesName: 'Complex Show', year: 2024, genres: ['Drama', 'Action'], rating: 8.5 }; appState.setCurrentShow(complexShow); assert.deepStrictEqual(appState.getCurrentShow(), complexShow); }); test('should handle multiple seasons', () => { const seasons = [ { number: 1, episodeCount: 10, name: 'Season 1' }, { number: 2, episodeCount: 12, name: 'Season 2' }, { number: 3, episodeCount: 14, name: 'Season 3' } ]; appState.setCurrentSeasons(seasons); assert.strictEqual(appState.getCurrentSeasons().length, 3); assert.strictEqual(appState.getCurrentSeasons()[1].number, 2); }); test('should handle multiple episodes', () => { const episodes = [ { episodeNumber: 1, title: 'Episode 1', airDate: '2024-01-01' }, { episodeNumber: 2, title: 'Episode 2', airDate: '2024-01-08' } ]; appState.setCurrentEpisodes(episodes); assert.strictEqual(appState.getCurrentEpisodes().length, 2); assert.strictEqual(appState.getCurrentEpisodes()[0].episodeNumber, 1); }); }); // ============ EpisodeManager Comprehensive Tests ============ describe('EpisodeManager - comprehensive tests', () => { let episodeManager; let mockFileListEl; beforeEach(() => { mockFileListEl = { querySelector: () => null, querySelectorAll: () => [], addEventListener: () => {} }; episodeManager = new EpisodeManager(mockFileListEl); }); test('should have updateEpisodeNumbers method', () => { assert.strictEqual(typeof episodeManager.updateEpisodeNumbers, 'function'); }); test('should have removeEpisodeHighlights method', () => { assert.strictEqual(typeof episodeManager.removeEpisodeHighlights, 'function'); }); test('should have makeEpisodeRangeEditable method', () => { assert.strictEqual(typeof episodeManager.makeEpisodeRangeEditable, 'function'); }); test('should have getEpisodeRange method', () => { assert.strictEqual(typeof episodeManager.getEpisodeRange, 'function'); }); // These methods don't exist in EpisodeManager // test('should have getEpisodeStart method', () => { // assert.strictEqual(typeof episodeManager.getEpisodeStart, 'function'); // }); // test('should have getEpisodeEnd method', () => { // assert.strictEqual(typeof episodeManager.getEpisodeEnd, 'function'); // }); test('should have getLastEpisodeEnd method', () => { assert.strictEqual(typeof episodeManager.getLastEpisodeEnd, 'function'); }); }); // ============ TagManager Comprehensive Tests ============ describe('TagManager - comprehensive tests', () => { let tagManager; beforeEach(() => { tagManager = new TagManager(); }); test('should have tagColors property', () => { assert.ok(tagManager.tagColors); }); test('should have extra color in tagColors', () => { assert.ok(tagManager.tagColors.extra); }); test('should have behind-the-scenes color in tagColors', () => { assert.ok(tagManager.tagColors['behind-the-scenes']); }); test('should have delete color in tagColors', () => { assert.ok(tagManager.tagColors.delete); }); }); // ============ FileManager Comprehensive Tests ============ describe('FileManager - comprehensive tests', () => { let fileManager; beforeEach(() => { fileManager = new FileManager(); }); test('should be instantiable', () => { assert.ok(fileManager instanceof FileManager); }); test('should have all required methods', () => { assert.strictEqual(typeof fileManager.selectDirectory, 'function'); assert.strictEqual(typeof fileManager.scanDirectory, 'function'); assert.strictEqual(typeof fileManager.renameFile, 'function'); assert.strictEqual(typeof fileManager.beginMapping, 'function'); assert.strictEqual(typeof fileManager.logAuditEvent, 'function'); assert.strictEqual(typeof fileManager.moveFileToFolder, 'function'); assert.strictEqual(typeof fileManager.logFileInfo, 'function'); assert.strictEqual(typeof fileManager.openFileInPlayer, 'function'); assert.strictEqual(typeof fileManager.collectFileData, 'function'); }); }); // ============ ModalManager Comprehensive Tests ============ describe('ModalManager - comprehensive tests', () => { let modalManager; beforeEach(() => { modalManager = new ModalManager(); }); test('should have videoPreviewModal property', () => { assert.ok('videoPreviewModal' in modalManager); }); test('should have all required methods', () => { assert.strictEqual(typeof modalManager.openVideoPreview, 'function'); assert.strictEqual(typeof modalManager.createVideoPreviewModal, 'function'); assert.strictEqual(typeof modalManager.loadVideoPreview, 'function'); assert.strictEqual(typeof modalManager.closeVideoPreview, 'function'); assert.strictEqual(typeof modalManager.getModal, 'function'); }); }); // ============ ProgressManager Comprehensive Tests ============ describe('ProgressManager - comprehensive tests', () => { let progressManager; let mockContainer; let mockText; let mockCount; beforeEach(() => { mockContainer = { style: {}, innerHTML: '' }; mockText = { textContent: '' }; mockCount = { textContent: '' }; progressManager = new ProgressManager(mockContainer, mockText, mockCount); }); test('should be instantiable with elements', () => { assert.ok(progressManager instanceof ProgressManager); }); test('should have all required methods', () => { assert.strictEqual(typeof progressManager.showProgress, 'function'); assert.strictEqual(typeof progressManager.hideProgress, 'function'); assert.strictEqual(typeof progressManager.updateProgressCount, 'function'); assert.strictEqual(typeof progressManager.updateProgressText, 'function'); }); test('should show progress by setting style', () => { progressManager.showProgress(); assert.ok(true); // If no error, test passes }); test('should hide progress by setting style', () => { progressManager.hideProgress(); assert.ok(true); // If no error, test passes }); test('should update progress count', () => { progressManager.updateProgressCount(50, 100); assert.ok(true); // If no error, test passes }); test('should update progress text', () => { progressManager.updateProgressText('Processing...'); assert.ok(true); // If no error, test passes }); }); // ============ FileListManager Comprehensive Tests ============ describe('FileListManager - comprehensive tests', () => { let fileListManager; let mockFileListEl; beforeEach(() => { mockFileListEl = { querySelector: () => null, querySelectorAll: () => [], innerHTML: '', appendChild: () => {}, insertBefore: () => {}, addEventListener: () => {} }; fileListManager = new FileListManager(mockFileListEl); }); test('should be instantiable with element', () => { assert.ok(fileListManager instanceof FileListManager); }); test('should have all required methods', () => { assert.strictEqual(typeof fileListManager.displayFiles, 'function'); assert.strictEqual(typeof fileListManager.clear, 'function'); assert.strictEqual(typeof fileListManager.getMediaFileItems, 'function'); assert.strictEqual(typeof fileListManager.getFolderItems, 'function'); assert.strictEqual(typeof fileListManager.updateEpisodeNumbers, 'function'); }); test('should handle empty files array', () => { fileListManager.displayFiles([]); assert.ok(true); // If no error, test passes }); test('should handle files array', () => { const files = [ { name: 'file1.mp4', path: '/test/file1.mp4', isFolder: false }, { name: 'file2.mp4', path: '/test/file2.mp4', isFolder: false } ]; fileListManager.displayFiles(files); assert.ok(true); // If no error, test passes }); test('should handle folders in files array', () => { const files = [ { name: 'folder1', path: '/test/folder1', isFolder: true }, { name: 'file1.mp4', path: '/test/file1.mp4', isFolder: false } ]; fileListManager.displayFiles(files); assert.ok(true); // If no error, test passes }); }); // ============ SearchManager Comprehensive Tests ============ describe('SearchManager - comprehensive tests', () => { // SearchManager requires DOM elements, so we just test that it exists test('should exist', () => { assert.ok(SearchManager); }); test('should be a class', () => { assert.strictEqual(typeof SearchManager, 'function'); }); }); console.log('\n✅ All tests completed!\n');