pinafore/tests/spec/038-memory-leaks.js
Nolan Lawson cbbf5abd7a
test: test for DOM listener memory leaks (#1654)
* test: test for DOM listener memory leaks

* fix whitespace change, unintended
2019-11-23 23:42:22 -08:00

109 lines
3 KiB
JavaScript

import {
accountProfileName,
closeDialogButton,
composeInput,
getNthAutosuggestionResult,
getNthStatusMediaButton, getNthStatusSensitiveMediaButton,
getNthStatus,
getNumSyntheticListeners,
getUrl,
homeNavButton, modalDialog, notificationsNavButton,
scrollToStatus,
scrollToTop,
settingsNavButton, sleep
} from '../utils'
import { loginAsFoobar } from '../roles'
import { installDomListenerListener, getNumDomListeners } from '../spyDomListeners'
import { homeTimeline } from '../fixtures'
import { Selector as $ } from 'testcafe'
fixture`038-memory-leaks.js`
.page`http://localhost:4002`
async function runMemoryLeakTest (t, firstStep, secondStep) {
await loginAsFoobar(t)
await installDomListenerListener()
await firstStep()
await sleep(1000)
const numSyntheticListeners = await getNumSyntheticListeners()
const numDomListeners = await getNumDomListeners()
await t
.expect(numSyntheticListeners).typeOf('number')
.expect(numDomListeners).typeOf('number')
await secondStep()
await sleep(1000)
await t
.expect(getNumSyntheticListeners()).eql(numSyntheticListeners)
.expect(getNumDomListeners()).eql(numDomListeners)
}
async function goToSettings (t) {
await t
.click(settingsNavButton)
.expect(getUrl()).contains('/settings')
}
async function scrollUpAndDownAndDoAutosuggest (t) {
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
await scrollToStatus(t, 15)
await scrollToTop()
await t
.typeText(composeInput, 'hey @qu')
.expect(getNthAutosuggestionResult(1).find('.sr-only').innerText).contains('@quux')
await goToSettings(t)
}
async function openAndCloseMediaModal (t) {
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
const idx = homeTimeline.findIndex(_ => _.spoiler === 'kitten CW')
await scrollToStatus(t, idx + 1)
await t
.click(getNthStatusSensitiveMediaButton(idx + 1))
.click(getNthStatusMediaButton(idx + 1))
.expect(modalDialog.hasAttribute('aria-hidden')).notOk()
.click(closeDialogButton)
.expect(modalDialog.exists).notOk()
await goToSettings(t)
}
async function openAProfileAndNotifications (t) {
await t
.click(homeNavButton)
.expect(getUrl()).eql('http://localhost:4002/')
.hover(getNthStatus(1))
.click($('.status-author-name').withText(('quux')))
.expect(getUrl()).contains('/accounts/3')
.expect(accountProfileName.innerText).contains('quux')
.click(notificationsNavButton)
.hover(getNthStatus(1))
await goToSettings(t)
}
test('Does not leak listeners in timeline or autosuggest', async t => {
await runMemoryLeakTest(
t,
() => goToSettings(t),
() => scrollUpAndDownAndDoAutosuggest(t)
)
})
test('Does not leak listeners in modal', async t => {
await runMemoryLeakTest(
t,
() => goToSettings(t),
() => openAndCloseMediaModal(t)
)
})
test('Does not leak listeners in account profile or notifications page', async t => {
await runMemoryLeakTest(
t,
() => goToSettings(t),
() => openAProfileAndNotifications(t)
)
})