diff --git a/phpmyfaq/admin/assets/src/utils/session.test.ts b/phpmyfaq/admin/assets/src/utils/session.test.ts new file mode 100644 index 0000000000..50cd2377e5 --- /dev/null +++ b/phpmyfaq/admin/assets/src/utils/session.test.ts @@ -0,0 +1,47 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { handleSessionTimeout } from './session'; + +vi.mock('bootstrap', () => ({ + Modal: vi.fn().mockImplementation(() => ({ + show: vi.fn(), + hide: vi.fn(), + })), +})); + +describe('Session Utils', () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe('handleSessionTimeout', () => { + it('should observe attribute changes and reload page on button click', () => { + document.body.innerHTML = ` +
+
+ + `; + + const mockObserver = { + observe: vi.fn(), + disconnect: vi.fn(), + takeRecords: vi.fn(), + }; + global.MutationObserver = vi.fn(() => mockObserver) as unknown as typeof MutationObserver; + + const mockReload = vi.fn(); + Object.defineProperty(global, 'location', { + value: { + reload: mockReload, + }, + writable: true, + }); + + handleSessionTimeout(); + + expect(mockObserver.observe).toHaveBeenCalled(); + const reloadButton = document.getElementById('pmf-button-reload-page'); + reloadButton?.click(); + expect(mockReload).toHaveBeenCalled(); + }); + }); +}); diff --git a/phpmyfaq/admin/assets/src/utils/sidebar.test.ts b/phpmyfaq/admin/assets/src/utils/sidebar.test.ts new file mode 100644 index 0000000000..e3059cfb6a --- /dev/null +++ b/phpmyfaq/admin/assets/src/utils/sidebar.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { sidebarToggle } from './sidebar'; + +describe('Sidebar Utils', () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe('sidebarToggle', () => { + it('should toggle sidebar class and update localStorage on button click', () => { + document.body.innerHTML = ` + + `; + + const mockSetItem = vi.fn(); + Object.defineProperty(global, 'localStorage', { + value: { + setItem: mockSetItem, + }, + writable: true, + }); + + sidebarToggle(); + + const toggleButton = document.getElementById('sidebarToggle'); + toggleButton?.click(); + + expect(document.body.classList.contains('pmf-admin-sidenav-toggled')).toBe(true); + expect(mockSetItem).toHaveBeenCalledWith('sb|sidebar-toggle', 'true'); + + toggleButton?.click(); + + expect(document.body.classList.contains('pmf-admin-sidenav-toggled')).toBe(false); + expect(mockSetItem).toHaveBeenCalledWith('sb|sidebar-toggle', 'false'); + }); + + it('should not throw an error if sidebarToggle button is not found', () => { + document.body.innerHTML = ``; + + expect(() => sidebarToggle()).not.toThrow(); + }); + }); +}); diff --git a/phpmyfaq/admin/assets/src/utils/utils.test.ts b/phpmyfaq/admin/assets/src/utils/utils.test.ts new file mode 100644 index 0000000000..09b5ab4979 --- /dev/null +++ b/phpmyfaq/admin/assets/src/utils/utils.test.ts @@ -0,0 +1,69 @@ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { selectAll, unSelectAll, formatBytes, initializeTooltips } from './utils'; +import { Tooltip } from 'bootstrap'; + +vi.mock('bootstrap', () => ({ + Tooltip: vi.fn(), +})); + +describe('Utils', () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe('selectAll', () => { + it('should select all options in the select element', () => { + document.body.innerHTML = ` + + `; + + selectAll('testSelect'); + + const selectElement = document.getElementById('testSelect') as HTMLSelectElement; + for (const option of selectElement.options) { + expect(option.selected).toBe(true); + } + }); + }); + + describe('unSelectAll', () => { + it('should unselect all options in the select element', () => { + document.body.innerHTML = ` + + `; + + unSelectAll('testSelect'); + + const selectElement = document.getElementById('testSelect') as HTMLSelectElement; + for (const option of selectElement.options) { + expect(option.selected).toBe(false); + } + }); + }); + + describe('formatBytes', () => { + it('should format bytes correctly', () => { + expect(formatBytes(1024)).toBe('1 KiB'); + expect(formatBytes(1048576)).toBe('1 MiB'); + expect(formatBytes(0)).toBe('0 Bytes'); + }); + }); + + describe('initializeTooltips', () => { + it('should initialize tooltips', () => { + document.body.innerHTML = ` +
+ `; + + initializeTooltips(); + + expect(vi.mocked(Tooltip)).toHaveBeenCalled(); + }); + }); +});