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 ()
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,
}