pulsar/spec/async-spec-helpers.js

110 lines
2.3 KiB
JavaScript

function beforeEach (fn) {
global.beforeEach(() => {
const result = fn()
if (result instanceof Promise) {
waitsForPromise(() => result)
}
})
}
function afterEach (fn) {
global.afterEach(() => {
const result = fn()
if (result instanceof Promise) {
waitsForPromise(() => result)
}
})
}
;['it', 'fit', 'ffit', 'fffit'].forEach(name => {
exports[name] = (description, fn) => {
if (fn === undefined) {
global[name](description)
return
}
global[name](description, () => {
const result = fn()
if (result instanceof Promise) {
waitsForPromise(() => result)
}
})
}
})
async function conditionPromise (condition, description = 'anonymous condition') {
const startTime = Date.now()
while (true) {
await timeoutPromise(100)
if (await condition()) {
return
}
if (Date.now() - startTime > 5000) {
throw new Error('Timed out waiting on ' + description)
}
}
}
function timeoutPromise (timeout) {
return new Promise(resolve => {
global.setTimeout(resolve, timeout)
})
}
function waitsForPromise (fn) {
const promise = fn()
global.waitsFor('spec promise to resolve', done => {
promise.then(done, error => {
jasmine.getEnv().currentSpec.fail(error)
done()
})
})
}
function emitterEventPromise (emitter, event, timeout = 15000) {
return new Promise((resolve, reject) => {
const timeoutHandle = setTimeout(() => {
reject(new Error(`Timed out waiting for '${event}' event`))
}, timeout)
emitter.once(event, () => {
clearTimeout(timeoutHandle)
resolve()
})
})
}
function promisify (original) {
return function (...args) {
return new Promise((resolve, reject) => {
args.push((err, ...results) => {
if (err) {
reject(err)
} else {
resolve(...results)
}
})
return original(...args)
})
}
}
function promisifySome (obj, fnNames) {
const result = {}
for (const fnName of fnNames) {
result[fnName] = promisify(obj[fnName])
}
return result
}
exports.afterEach = afterEach
exports.beforeEach = beforeEach
exports.conditionPromise = conditionPromise
exports.emitterEventPromise = emitterEventPromise
exports.promisify = promisify
exports.promisifySome = promisifySome
exports.timeoutPromise = timeoutPromise