bigint-crypto-utils/build/testing/browser/index.cjs

122 lines
3.5 KiB
JavaScript
Raw Normal View History

2022-04-20 21:55:44 +00:00
const path = require('path')
2021-03-25 12:40:04 +00:00
const puppeteer = require('puppeteer')
2022-04-20 21:55:44 +00:00
const minimatch = require('minimatch')
const glob = require('glob')
const rootDir = path.join(__dirname, '../../..')
2021-03-25 12:40:04 +00:00
2022-04-20 21:55:44 +00:00
const browserTests = async (
{
logWarnings = false,
serverPort = 38000,
keepServerRunning = false,
puppeteerOptions = {
headless: false,
devtools: true
}
}, testFiles) => {
2022-08-01 02:19:48 +00:00
const server = require('./server.cjs').server
2022-04-20 21:55:44 +00:00
await server.init(testFiles)
2021-03-25 12:40:04 +00:00
await server.listen(serverPort)
const browser = await puppeteer.launch(puppeteerOptions)
2022-04-20 21:55:44 +00:00
const page = (await browser.pages())[0]
2021-03-25 12:40:04 +00:00
page.on('console', function (message) {
let ignore = message.type() === 'warning' && !logWarnings
if (message.type() === 'error' && message.location()) {
if (message.location().url.includes('favicon.ico')) {
ignore = true
}
}
if (ignore) return
2022-10-03 17:57:08 +00:00
let text = (message.args().length > 0) ? message.args()[0].remoteObject().value : message.text()
2021-03-25 12:40:04 +00:00
const args = []
if (message.args() !== undefined && message.args().length > 1) {
for (let i = 1; i < message.args().length; i++) {
2022-10-03 17:57:08 +00:00
args.push(message.args()[i].remoteObject().value)
2021-03-25 12:40:04 +00:00
}
}
if (message.type() === 'error' && message.location()) {
text = `${message.location().url} : ${text}`
}
let consoleType = 'log'
switch (message.type()) {
case 'error':
consoleType = 'error'
break
case 'warning':
consoleType = 'warn'
break
default:
break
}
console[consoleType](text, ...args)
})
2022-04-20 21:55:44 +00:00
2021-03-25 12:40:04 +00:00
page.on('error', function (err) { page.emit(new Error(err)) })
2022-04-20 21:55:44 +00:00
page.on('close', async () => {
await close()
})
page.goto('http://localhost:38000/').then(async () => {
const watchDog = page.waitForFunction('_mocha.state === \'stopped\'', { timeout: 0 })
await watchDog.catch(async (reason) => {
console.error(reason)
})
if (puppeteerOptions.headless === true) {
await close()
}
}).catch(async (reason) => {
console.error(reason)
})
async function close () {
console.log('Closing browser tests...')
await browser.close().catch(() => {})
if (keepServerRunning !== true) {
await server.close().catch(() => {})
}
}
}
2021-03-25 12:40:04 +00:00
2022-04-20 21:55:44 +00:00
function processedTestFiles (testFilesStr) {
if (testFilesStr === undefined) {
return undefined
}
// Let us first remove surrounding quotes in string (it gives issues in windows)
testFilesStr = testFilesStr.replace(/^['"]/, '').replace(/['"]$/, '')
const filenames = glob.sync(testFilesStr, { cwd: rootDir, matchBase: true })
if (filenames.length > 0) {
filenames.forEach(file => {
const isTsTestFile = minimatch(file, '{test/**/*.ts,src/**/*.spec.ts}', { matchBase: true })
if (!isTsTestFile) {
throw new Error(`test file '${file}' not found`)
}
})
2021-03-25 12:40:04 +00:00
}
2022-04-20 21:55:44 +00:00
return filenames
2021-03-25 12:40:04 +00:00
}
const opts = {
// puppeteer options
puppeteerOptions: {
2022-04-20 21:55:44 +00:00
headless: false,
devtools: true
2021-03-25 12:40:04 +00:00
// slowMo: 100,
// timeout: 10000
},
2022-04-20 21:55:44 +00:00
logWarnings: false, // log warnings in Node console (usually not needed)
2021-03-25 12:40:04 +00:00
keepServerRunning: false, // keep server running until manually closed with ctrl-c. In combination with puppeteerOptions.headless (or just connecting any browser to the test page) allows debugging in browser
serverPort: 38000
}
2022-04-20 21:55:44 +00:00
const args = process.argv.slice(2)
if (args[0] === 'headless') {
opts.puppeteerOptions.headless = true
args.shift()
}
browserTests(opts, processedTestFiles(args[0]))