1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/test/e2e/helpers.js
Mark Stacey b1b6d7ae38
Fix intermittent metrics e2e test failure (#9980)
The metrics e2e test would fail if the segment events still weren't
dispatched when the page loaded. The Segment events are sent on a set
interval, so it isn't abnormal for them to lag behind the page load
itself. The `waitUntilCalled` utility has been used to wait until all
required events have been dispatched.

The `wait-until-called` module was converted to an ES5 module, so that
it could be used from an e2e test. The optional `callCount` parameter
has also been added, to allow waiting for more than one call.

The `segmentSpy` had to be converted to a `segmentStub`, to allow the
`waitUntilCalled` utility to be used.
2020-12-03 14:30:50 -03:30

120 lines
2.9 KiB
JavaScript

const path = require('path')
const sinon = require('sinon')
const createStaticServer = require('../../development/create-static-server')
const {
createSegmentServer,
} = require('../../development/lib/create-segment-server')
const Ganache = require('./ganache')
const FixtureServer = require('./fixture-server')
const { buildWebDriver } = require('./webdriver')
const tinyDelayMs = 200
const regularDelayMs = tinyDelayMs * 2
const largeDelayMs = regularDelayMs * 2
const dappPort = 8080
async function withFixtures(options, testSuite) {
const {
dapp,
fixtures,
ganacheOptions,
driverOptions,
mockSegment,
title,
} = options
const fixtureServer = new FixtureServer()
const ganacheServer = new Ganache()
let dappServer
let segmentServer
let segmentStub
let webDriver
try {
await ganacheServer.start(ganacheOptions)
await fixtureServer.start()
await fixtureServer.loadState(path.join(__dirname, 'fixtures', fixtures))
if (dapp) {
const dappDirectory = path.resolve(
__dirname,
'..',
'..',
'node_modules',
'@metamask',
'test-dapp',
'dist',
)
dappServer = createStaticServer(dappDirectory)
dappServer.listen(dappPort)
await new Promise((resolve, reject) => {
dappServer.on('listening', resolve)
dappServer.on('error', reject)
})
}
if (mockSegment) {
segmentStub = sinon.stub()
segmentServer = createSegmentServer((_request, response, events) => {
for (const event of events) {
segmentStub(event)
}
response.statusCode = 200
response.end()
})
await segmentServer.start(9090)
}
const { driver } = await buildWebDriver(driverOptions)
webDriver = driver
await testSuite({
driver,
segmentStub,
})
if (process.env.SELENIUM_BROWSER === 'chrome') {
const errors = await driver.checkBrowserForConsoleErrors(driver)
if (errors.length) {
const errorReports = errors.map((err) => err.message)
const errorMessage = `Errors found in browser console:\n${errorReports.join(
'\n',
)}`
throw new Error(errorMessage)
}
}
} catch (error) {
if (webDriver) {
try {
await webDriver.verboseReportOnFailure(title)
} catch (verboseReportError) {
console.error(verboseReportError)
}
}
throw error
} finally {
await fixtureServer.stop()
await ganacheServer.quit()
if (webDriver) {
await webDriver.quit()
}
if (dappServer) {
await new Promise((resolve, reject) => {
dappServer.close((error) => {
if (error) {
return reject(error)
}
return resolve()
})
})
}
if (segmentServer) {
await segmentServer.stop()
}
}
}
module.exports = {
tinyDelayMs,
regularDelayMs,
largeDelayMs,
withFixtures,
}