|
|
- global.TEST = true
- var Bottleneck = require('./bottleneck')
- var assert = require('assert')
-
- module.exports = function (options={}) {
- var mustEqual = function (a, b) {
- var strA = JSON.stringify(a)
- var strB = JSON.stringify(b)
- if (strA !== strB) {
- console.log(strA + ' !== ' + strB, (new Error('').stack))
- assert(strA === strB)
- }
- }
-
- var start
- var calls = []
-
- // set options.datastore
- if (options.datastore == null && process.env.DATASTORE === 'redis') {
- options.datastore = 'redis'
- options.clearDatastore = true
- } else if (options.datastore == null && process.env.DATASTORE === 'ioredis') {
- options.datastore = 'ioredis'
- options.clearDatastore = true
- } else {
- options.datastore = 'local'
- }
-
- var limiter = new Bottleneck(options)
- // limiter.on("debug", function (str, args) { console.log(`${Date.now()-start} ${str} ${JSON.stringify(args)}`) })
- if (!options.errorEventsExpected) {
- limiter.on("error", function (err) {
- console.log('(CONTEXT) ERROR EVENT', err)
- })
- }
- limiter.ready().then(function (client) {
- start = Date.now()
- })
- var getResults = function () {
- return {
- elapsed: Date.now() - start,
- callsDuration: calls.length > 0 ? calls[calls.length - 1].time : null,
- calls: calls
- }
- }
-
- var context = {
- job: function (err, ...result) {
- var cb = result.pop()
- calls.push({err: err, result: result, time: Date.now()-start})
- if (process.env.DEBUG) console.log(result, calls)
- cb.apply({}, [err].concat(result))
- },
- slowJob: function (duration, err, ...result) {
- setTimeout(function () {
- var cb = result.pop()
- calls.push({err: err, result: result, time: Date.now()-start})
- if (process.env.DEBUG) console.log(result, calls)
- cb.apply({}, [err].concat(result))
- }, duration)
- },
- promise: function (err, ...result) {
- return new Promise(function (resolve, reject) {
- if (process.env.DEBUG) console.log('In c.promise. Result: ', result)
- calls.push({err: err, result: result, time: Date.now()-start})
- if (process.env.DEBUG) console.log(result, calls)
- if (err == null) {
- return resolve(result)
- } else {
- return reject(err)
- }
- })
- },
- slowPromise: function (duration, err, ...result) {
- return new Promise(function (resolve, reject) {
- setTimeout(function () {
- if (process.env.DEBUG) console.log('In c.slowPromise. Result: ', result)
- calls.push({err: err, result: result, time: Date.now()-start})
- if (process.env.DEBUG) console.log(result, calls)
- if (err == null) {
- return resolve(result)
- } else {
- return reject(err)
- }
- }, duration)
- })
- },
- pNoErrVal: function (promise, ...expected) {
- if (process.env.DEBUG) console.log('In c.pNoErrVal. Expected:', expected)
- return promise.then(function (actual) {
- mustEqual(actual, expected)
- })
- },
- noErrVal: function (...expected) {
- return function (err, ...actual) {
- mustEqual(err, null)
- mustEqual(actual, expected)
- }
- },
- last: function (options) {
- var opt = options != null ? options : {}
- return limiter.schedule(opt, function () { return Promise.resolve(getResults()) })
- .catch(function (err) { console.error("Error in context.last:", err)})
- },
- wait: function (wait) {
- return new Promise(function (resolve, reject) {
- setTimeout(resolve, wait)
- })
- },
- limiter: limiter,
- mustEqual: mustEqual,
- mustExist: function (a) { assert(a != null) },
- results: getResults,
- checkResultsOrder: function (order) {
- mustEqual(order.length, calls.length)
- for (var i = 0; i < Math.max(calls.length, order.length); i++) {
- mustEqual(order[i], calls[i].result)
- }
- },
- checkDuration: function (shouldBe, minBound = 10) {
- var results = getResults()
- var min = shouldBe - minBound
- var max = shouldBe + 50
- if (!(results.callsDuration > min && results.callsDuration < max)) {
- console.error('Duration not around ' + shouldBe + '. Was ' + results.callsDuration)
- }
- assert(results.callsDuration > min && results.callsDuration < max)
- }
- }
-
- return context
- }
|