Files
gramps-web/test/unit/memoryCleanup.test.js
2026-04-07 20:38:37 +02:00

76 lines
2.2 KiB
JavaScript

import {describe, it, expect, afterEach, vi} from 'vitest'
import {GrampsjsTaskProgressIndicator} from '../../src/components/GrampsjsTaskProgressIndicator.js'
import {GrampsjsFormEditMatch} from '../../src/components/GrampsjsFormEditMatch.js'
import {GrampsjsViewObject} from '../../src/views/GrampsjsViewObject.js'
class TestViewObject extends GrampsjsViewObject {
getUrl() {
return ''
}
}
if (!window.customElements.get('test-view-object')) {
window.customElements.define('test-view-object', TestViewObject)
}
describe('memory cleanup for event-driven components', () => {
afterEach(() => {
vi.clearAllTimers()
vi.useRealTimers()
vi.restoreAllMocks()
document.body.innerHTML = ''
})
it('removes the same edit action handler when GrampsjsViewObject disconnects', () => {
const element = document.createElement('test-view-object')
const addSpy = vi.spyOn(element, 'addEventListener')
const removeSpy = vi.spyOn(element, 'removeEventListener')
element.connectedCallback()
element.disconnectedCallback()
expect(addSpy).toHaveBeenCalledWith(
'edit:action',
element._boundHandleEditAction
)
expect(removeSpy).toHaveBeenCalledWith(
'edit:action',
element._boundHandleEditAction
)
})
it('unregisters the global save listener for GrampsjsFormEditMatch', () => {
const addSpy = vi.spyOn(window, 'addEventListener')
const removeSpy = vi.spyOn(window, 'removeEventListener')
const element = new GrampsjsFormEditMatch()
element.appState = {i18n: {strings: {}}, permissions: {}, dbInfo: {}}
element.connectedCallback()
element.disconnectedCallback()
expect(addSpy).toHaveBeenCalledWith(
'edit-mode:save',
element._boundHandleSaveButton
)
expect(removeSpy).toHaveBeenCalledWith(
'edit-mode:save',
element._boundHandleSaveButton
)
})
it('clears the delayed close timer when GrampsjsTaskProgressIndicator disconnects', () => {
vi.useFakeTimers()
const element = new GrampsjsTaskProgressIndicator()
element.open = true
element.hideAfter = 1
element.closeAfter()
element.disconnectedCallback()
vi.advanceTimersByTime(1000)
expect(element.open).toBe(true)
expect(element._closeTimer).toBeNull()
})
})