@webex/test-helper-mocha 3.11.0 → 3.12.0-llmrefactor.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/index.js +49 -0
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
4
5
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
5
6
|
var _isNan = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/number/is-nan"));
|
|
7
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
6
8
|
/*!
|
|
7
9
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
8
10
|
*/
|
|
@@ -90,6 +92,106 @@ module.exports = {
|
|
|
90
92
|
var shouldSkip = envVar && envVar !== 'false' && !!envVar;
|
|
91
93
|
return shouldSkip ? mochaMethod.skip : mochaMethod;
|
|
92
94
|
},
|
|
95
|
+
/**
|
|
96
|
+
* Retries a promise-returning function when it rejects with an HTTP 429
|
|
97
|
+
* (Too Many Requests) response, using exponential backoff between attempts.
|
|
98
|
+
* Any other rejection - or exhausting the retries - is re-thrown immediately
|
|
99
|
+
* so genuine failures still surface. Intended for integration tests that hit
|
|
100
|
+
* rate-limited backend endpoints (e.g. user activation / email verification).
|
|
101
|
+
*
|
|
102
|
+
* The `fn` is (re)invoked on every attempt, so callers that inspect spies
|
|
103
|
+
* should reset their history at the start of `fn`.
|
|
104
|
+
*
|
|
105
|
+
* Note: backoff is bounded by the mocha per-test timeout, so keep the delays
|
|
106
|
+
* modest relative to that budget.
|
|
107
|
+
*
|
|
108
|
+
* @param {Function} fn - Returns the promise to (re)execute; receives the
|
|
109
|
+
* zero-based attempt number.
|
|
110
|
+
* @param {object} [options]
|
|
111
|
+
* @param {number} [options.retries=3] - Max retries after the first attempt.
|
|
112
|
+
* @param {number} [options.initialDelay=1000] - Base backoff delay in ms.
|
|
113
|
+
* @param {number} [options.maxDelay=5000] - Upper bound for a single backoff in ms.
|
|
114
|
+
* @returns {Promise<mixed>} Resolves with the first successful attempt's value.
|
|
115
|
+
*/
|
|
116
|
+
retryOn429: function () {
|
|
117
|
+
var _retryOn = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(fn) {
|
|
118
|
+
var _ref,
|
|
119
|
+
_ref$retries,
|
|
120
|
+
retries,
|
|
121
|
+
_ref$initialDelay,
|
|
122
|
+
initialDelay,
|
|
123
|
+
_ref$maxDelay,
|
|
124
|
+
maxDelay,
|
|
125
|
+
is429,
|
|
126
|
+
_loop,
|
|
127
|
+
_ret,
|
|
128
|
+
attempt,
|
|
129
|
+
_args2 = arguments;
|
|
130
|
+
return _regenerator.default.wrap(function (_context2) {
|
|
131
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
132
|
+
case 0:
|
|
133
|
+
_ref = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {}, _ref$retries = _ref.retries, retries = _ref$retries === void 0 ? 3 : _ref$retries, _ref$initialDelay = _ref.initialDelay, initialDelay = _ref$initialDelay === void 0 ? 1000 : _ref$initialDelay, _ref$maxDelay = _ref.maxDelay, maxDelay = _ref$maxDelay === void 0 ? 5000 : _ref$maxDelay;
|
|
134
|
+
is429 = function is429(error) {
|
|
135
|
+
return Boolean(error) && (error.statusCode === 429 || error.body && (error.body.statusCode === 429 || error.body.errorCode === 429));
|
|
136
|
+
};
|
|
137
|
+
_loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
|
|
138
|
+
var backoff, _t, _t2;
|
|
139
|
+
return _regenerator.default.wrap(function (_context) {
|
|
140
|
+
while (1) switch (_context.prev = _context.next) {
|
|
141
|
+
case 0:
|
|
142
|
+
_context.prev = 0;
|
|
143
|
+
_context.next = 1;
|
|
144
|
+
return fn(attempt);
|
|
145
|
+
case 1:
|
|
146
|
+
_t = _context.sent;
|
|
147
|
+
return _context.abrupt("return", {
|
|
148
|
+
v: _t
|
|
149
|
+
});
|
|
150
|
+
case 2:
|
|
151
|
+
_context.prev = 2;
|
|
152
|
+
_t2 = _context["catch"](0);
|
|
153
|
+
if (!(attempt >= retries || !is429(_t2))) {
|
|
154
|
+
_context.next = 3;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
throw _t2;
|
|
158
|
+
case 3:
|
|
159
|
+
backoff = Math.min(initialDelay * Math.pow(2, attempt), maxDelay); // eslint-disable-next-line no-await-in-loop
|
|
160
|
+
_context.next = 4;
|
|
161
|
+
return new _promise.default(function (resolve) {
|
|
162
|
+
setTimeout(resolve, backoff);
|
|
163
|
+
});
|
|
164
|
+
case 4:
|
|
165
|
+
case "end":
|
|
166
|
+
return _context.stop();
|
|
167
|
+
}
|
|
168
|
+
}, _loop, null, [[0, 2]]);
|
|
169
|
+
});
|
|
170
|
+
attempt = 0;
|
|
171
|
+
case 1:
|
|
172
|
+
return _context2.delegateYield(_loop(), "t0", 2);
|
|
173
|
+
case 2:
|
|
174
|
+
_ret = _context2.t0;
|
|
175
|
+
if (!_ret) {
|
|
176
|
+
_context2.next = 3;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
return _context2.abrupt("return", _ret.v);
|
|
180
|
+
case 3:
|
|
181
|
+
attempt += 1;
|
|
182
|
+
_context2.next = 1;
|
|
183
|
+
break;
|
|
184
|
+
case 4:
|
|
185
|
+
case "end":
|
|
186
|
+
return _context2.stop();
|
|
187
|
+
}
|
|
188
|
+
}, _callee);
|
|
189
|
+
}));
|
|
190
|
+
function retryOn429(_x) {
|
|
191
|
+
return _retryOn.apply(this, arguments);
|
|
192
|
+
}
|
|
193
|
+
return retryOn429;
|
|
194
|
+
}(),
|
|
93
195
|
/**
|
|
94
196
|
* A lot of failures get produced by EventEmitters, which makes them difficult to
|
|
95
197
|
* detect in tests (they just look like timeouts). This is a test helper that
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["bowser","require","inNode","window","inBrowser","inSpecificBrowser","name","getParser","navigator","userAgent","isBrowser","inFirefox","inSafari","inJenkins","process","env","JENKINS","noop","module","exports","flaky","mochaMethod","envVar","skip","shouldSkip","handleErrorEvent","emitter","fn","r","p","_promise","default","resolve","reject","once","handler","race","then","unbind","catch","reason","add","e","off","err","skipInBrowser","skipInNode","skipInFirefox","skipInSafari","browserOnly","nodeOnly","jenkinsOnly","expectActivity","max","event","activityChecker","msg","timer","clearTimeout","setTimeout","Error","concat","on","result","activity","data","expectExactlyNEvents","count","lastResult","currentCount","expectNEvents","expectEvent","firefoxOnly","maxWaitForEvent","maxWaitForPromise","timeout","promise","snoozeUntil","until","explanation","now","Date","d","_isNan","getTime"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nconst bowser = require('bowser');\n\n/**\n * Indicates if we're running in node\n * @returns {boolean}\n * @private\n */\nfunction inNode() {\n return typeof window === 'undefined';\n}\n\n/**\n * Indicates if we're running in a web browser\n * @returns {boolean}\n * @private\n */\nfunction inBrowser() {\n return !inNode();\n}\n\n/**\n * Indicates if we are running in the named browser\n * @param {string} name name of the browser\n * @returns {boolean}\n */\nfunction inSpecificBrowser(name) {\n return window && bowser.getParser(window.navigator.userAgent).isBrowser(name);\n}\n\n/**\n * Indicates if we're running in firefox\n * @returns {boolean}\n * @private\n */\nfunction inFirefox() {\n return inSpecificBrowser('firefox');\n}\n\n/**\n * Indicates if we're running in safari\n * @returns {boolean}\n * @private\n */\nfunction inSafari() {\n return inSpecificBrowser('safari');\n}\n\n/**\n * Indicates if we're running on Jenkins\n * @returns {boolean}\n * @private\n */\nfunction inJenkins() {\n return process.env.JENKINS;\n}\n\n/**\n * noop\n * @returns {undefined}\n * @private\n */\nfunction noop() {\n // intentionally empty\n}\n\nmodule.exports = {\n /**\n * Wrap the desired mochaMethod with `flaky` to indicate it's a flaky test\n * and exclude it from the test suite.\n * example:\n * `flaky(it)('sometimes passes and sometimes failes')`\n * @param {Function} mochaMethod `it` or `describe`\n * @param {string} envVar process.env.SKIP_FLAKY_TESTS\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n flaky: function flaky(mochaMethod, envVar) {\n // If mochaMethod doesn't have a skip method,\n // assume the mochaMethod is either a .skip or .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n const shouldSkip = envVar && envVar !== 'false' && !!envVar;\n\n return shouldSkip ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * A lot of failures get produced by EventEmitters, which makes them difficult to\n * detect in tests (they just look like timeouts). This is a test helper that\n * captures that error and turns it into a rejected promise\n * @param {EventEmitter} emitter\n * @param {Function} fn\n * @returns {Promise}\n */\n handleErrorEvent: function handleErrorEvent(emitter, fn) {\n let r;\n const p = new Promise((resolve, reject) => {\n r = reject;\n emitter.once('error', reject);\n });\n\n const handler = Promise.race([p, fn(emitter)])\n .then(unbind)\n .catch((reason) => {\n unbind();\n throw reason;\n });\n\n // Make it possible to add additional emitters\n handler.add = (e) => e.once('error', r);\n\n return handler;\n\n /**\n * unbinder\n * @private\n * @returns {undefined}\n */\n function unbind() {\n try {\n emitter.off('error', r);\n } catch (err) {\n // ignore\n }\n }\n },\n\n inBrowser,\n\n inNode,\n\n /**\n * Wrap the desired mochaMethod with `skipInBrowser` to prevent the\n * corresponding test or group of tests from running in a web browser\n * example:\n * `skipInBrowser(it)('does a thing that only works in node')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInBrowser: function skipInBrowser(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inBrowser() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInNode` to prevent the\n * corresponding test or group of tests from running in node.\n * example:\n * `skipInNode(it)('does a thing that only works in a web browser')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInNode: function skipInNode(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inNode() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInFirefox` to prevent the\n * corresponding test or group of tests from running in Firefox.\n * example:\n * `skipInFirefox(it)('does a thing that does not work in Firefox')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInFirefox: function skipInFirefox(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inFirefox() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInSafari` to prevent the\n * corresponding test or group of tests from running in Safari.\n * example:\n * `skipInSafari(it)('does a thing that does not work in Safari')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInSafari: function skipInSafari(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inSafari() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Similar to skipInNode in that it prevents the test from running, but goes a\n * step further to hide it from the list of skipped tests. Should be used when\n * the test will never be valid in NodeJS\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n browserOnly: function browserOnly(mochaMethod) {\n return inBrowser() ? mochaMethod : noop;\n },\n\n /**\n * Similar to skipInBrowser in that it prevents the test from running, but\n * goes a step further to hide it from the list of skipped tests. Should be\n * used when the test will never be valid in a Browser\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n nodeOnly: function nodeOnly(mochaMethod) {\n return inNode() ? mochaMethod : noop;\n },\n\n /**\n * Similar to skipInBrowser in that it prevents the test from running, but\n * goes a step further to hide it from the list of skipped tests. Should be\n * used when the test should be run on Jenkins only\n * @param {*} mochaMethod\n * @returns {Functions}\n */\n jenkinsOnly: function jenkinsOnly(mochaMethod) {\n return inJenkins() ? mochaMethod : noop;\n },\n\n /**\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @param {function} activityChecker // callback to check if activity matches\n * @param {string} msg\n * @returns {Promise<mixed>} Resolves with the activity\n */\n expectActivity: function expectActivity(max, event, emitter, activityChecker, msg) {\n let timer;\n\n /**\n * helper\n * @private\n * @returns {undefined}\n */\n function unbind() {\n try {\n clearTimeout(timer);\n emitter.off(event);\n } catch (err) {\n // ignore\n }\n }\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`${event} did not fire within ${max}ms${msg ? `: ${msg}` : ''}`));\n }, max);\n }),\n new Promise((resolve) => {\n emitter.on(event, (result) => {\n const {\n data: {activity},\n } = result;\n\n if (activityChecker(activity)) {\n unbind();\n resolve(activity);\n }\n });\n }),\n ]).catch((reason) => {\n unbind();\n throw reason;\n });\n },\n\n /**\n * Returns a promise that resolves after timeout or rejects\n * when count has been exceeded. Will also reject if count\n * hasn't been met after timeout\n * @param {number} max amount of time to wait for events in ms\n * @param {number} count number of events to expect in timeframe\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise}\n */\n expectExactlyNEvents: function expectExactlyNEvents(max, count, event, emitter) {\n let lastResult;\n let timer;\n\n let currentCount = 0;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n if (currentCount === count) {\n resolve(lastResult);\n } else {\n reject(\n new Error(\n `${event} fired only ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }\n }, max);\n }),\n new Promise((resolve, reject) => {\n emitter.on(event, fn);\n\n /**\n * helper\n * @private\n * @param {object} result\n * @returns {undefined}\n */\n function fn(result) {\n lastResult = result;\n currentCount += 1;\n if (currentCount > count) {\n emitter.off(event, fn);\n clearTimeout(timer);\n reject(\n new Error(\n `${event} fired ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }\n }\n }),\n ]);\n },\n\n /**\n * Returns a promise that resolves when event is fired count times or rejects\n * when max expires\n * @param {number} max\n * @param {number} count\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise}\n */\n expectNEvents: function expectNEvents(max, count, event, emitter) {\n let timer;\n\n let currentCount = 0;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(\n new Error(\n `${event} fired only ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }, max);\n }),\n new Promise((resolve) => {\n emitter.on(event, fn);\n\n /**\n * helper\n * @private\n * @returns {undefined}\n */\n function fn() {\n currentCount += 1;\n if (currentCount === count) {\n emitter.off(event, fn);\n clearTimeout(timer);\n resolve();\n }\n }\n }),\n ]);\n },\n\n /**\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @param {string} msg\n * @returns {Promise<mixed>} Resolves with the results of the event\n */\n expectEvent: function expectEvent(max, event, emitter, msg) {\n let timer;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`${event} did not fire within ${max}ms${msg ? `: ${msg}` : ''}`));\n }, max);\n }),\n new Promise((resolve) => {\n emitter.once(event, (result) => {\n clearTimeout(timer);\n resolve(result);\n });\n }),\n ]);\n },\n\n /**\n * Only run the specified test in firefox\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n firefoxOnly: function firefoxOnly(mochaMethod) {\n return inFirefox() ? mochaMethod : noop;\n },\n\n /**\n * Waits max ms or until emitter fires event, then resolves\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise<mixed>}\n */\n maxWaitForEvent: function maxWaitForEvent(max, event, emitter) {\n return Promise.race([\n new Promise((resolve) => {\n setTimeout(resolve, max);\n }),\n new Promise((resolve) => {\n emitter.once(event, resolve);\n }),\n ]);\n },\n\n /**\n * Waits timeout ms or until the promise resolves. Rejects if the timeout is\n * hit, otherwise resolves\n * @param {number} timeout\n * @param {Promise} promise\n * @returns {Promise<mixed>}\n */\n maxWaitForPromise: function maxWaitForPromise(timeout, promise) {\n return Promise.race([\n promise,\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error(`Timeout of ${timeout} expired before promise completed`));\n }, timeout);\n }),\n ]);\n },\n\n /**\n * Do not execute the specified mochaMethod until we pass the specified date\n * @param {Date|string} until\n * @param {string} explanation - Doesn't do anything, but forces you to defend\n * your decision to snooze a test\n * @returns {Function}\n */\n snoozeUntil: function snoozeUntil(until, explanation) {\n const now = new Date();\n\n if (!explanation) {\n throw new Error('You must defend your decision to snooze this test');\n }\n\n const d = new Date(until);\n\n if (Number.isNaN(d.getTime())) {\n throw new Error(`\"${until}\" does not appear to a valid date`);\n }\n\n const skip = now < d;\n\n return (mochaMethod) => {\n if (skip) {\n return mochaMethod.skip;\n }\n\n return mochaMethod;\n };\n },\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["bowser","require","inNode","window","inBrowser","inSpecificBrowser","name","getParser","navigator","userAgent","isBrowser","inFirefox","inSafari","inJenkins","process","env","JENKINS","noop","module","exports","flaky","mochaMethod","envVar","skip","shouldSkip","retryOn429","_retryOn","_asyncToGenerator2","default","_regenerator","mark","_callee","fn","_ref","_ref$retries","retries","_ref$initialDelay","initialDelay","_ref$maxDelay","maxDelay","is429","_loop","_ret","attempt","_args2","arguments","wrap","_context2","prev","next","length","undefined","error","Boolean","statusCode","body","errorCode","backoff","_t","_t2","_context","sent","abrupt","v","Math","min","pow","_promise","resolve","setTimeout","stop","delegateYield","t0","_x","apply","handleErrorEvent","emitter","r","p","reject","once","handler","race","then","unbind","catch","reason","add","e","off","err","skipInBrowser","skipInNode","skipInFirefox","skipInSafari","browserOnly","nodeOnly","jenkinsOnly","expectActivity","max","event","activityChecker","msg","timer","clearTimeout","Error","concat","on","result","activity","data","expectExactlyNEvents","count","lastResult","currentCount","expectNEvents","expectEvent","firefoxOnly","maxWaitForEvent","maxWaitForPromise","timeout","promise","snoozeUntil","until","explanation","now","Date","d","_isNan","getTime"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nconst bowser = require('bowser');\n\n/**\n * Indicates if we're running in node\n * @returns {boolean}\n * @private\n */\nfunction inNode() {\n return typeof window === 'undefined';\n}\n\n/**\n * Indicates if we're running in a web browser\n * @returns {boolean}\n * @private\n */\nfunction inBrowser() {\n return !inNode();\n}\n\n/**\n * Indicates if we are running in the named browser\n * @param {string} name name of the browser\n * @returns {boolean}\n */\nfunction inSpecificBrowser(name) {\n return window && bowser.getParser(window.navigator.userAgent).isBrowser(name);\n}\n\n/**\n * Indicates if we're running in firefox\n * @returns {boolean}\n * @private\n */\nfunction inFirefox() {\n return inSpecificBrowser('firefox');\n}\n\n/**\n * Indicates if we're running in safari\n * @returns {boolean}\n * @private\n */\nfunction inSafari() {\n return inSpecificBrowser('safari');\n}\n\n/**\n * Indicates if we're running on Jenkins\n * @returns {boolean}\n * @private\n */\nfunction inJenkins() {\n return process.env.JENKINS;\n}\n\n/**\n * noop\n * @returns {undefined}\n * @private\n */\nfunction noop() {\n // intentionally empty\n}\n\nmodule.exports = {\n /**\n * Wrap the desired mochaMethod with `flaky` to indicate it's a flaky test\n * and exclude it from the test suite.\n * example:\n * `flaky(it)('sometimes passes and sometimes failes')`\n * @param {Function} mochaMethod `it` or `describe`\n * @param {string} envVar process.env.SKIP_FLAKY_TESTS\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n flaky: function flaky(mochaMethod, envVar) {\n // If mochaMethod doesn't have a skip method,\n // assume the mochaMethod is either a .skip or .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n const shouldSkip = envVar && envVar !== 'false' && !!envVar;\n\n return shouldSkip ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Retries a promise-returning function when it rejects with an HTTP 429\n * (Too Many Requests) response, using exponential backoff between attempts.\n * Any other rejection - or exhausting the retries - is re-thrown immediately\n * so genuine failures still surface. Intended for integration tests that hit\n * rate-limited backend endpoints (e.g. user activation / email verification).\n *\n * The `fn` is (re)invoked on every attempt, so callers that inspect spies\n * should reset their history at the start of `fn`.\n *\n * Note: backoff is bounded by the mocha per-test timeout, so keep the delays\n * modest relative to that budget.\n *\n * @param {Function} fn - Returns the promise to (re)execute; receives the\n * zero-based attempt number.\n * @param {object} [options]\n * @param {number} [options.retries=3] - Max retries after the first attempt.\n * @param {number} [options.initialDelay=1000] - Base backoff delay in ms.\n * @param {number} [options.maxDelay=5000] - Upper bound for a single backoff in ms.\n * @returns {Promise<mixed>} Resolves with the first successful attempt's value.\n */\n retryOn429: async function retryOn429(\n fn,\n {retries = 3, initialDelay = 1000, maxDelay = 5000} = {}\n ) {\n const is429 = (error) =>\n Boolean(error) &&\n (error.statusCode === 429 ||\n (error.body && (error.body.statusCode === 429 || error.body.errorCode === 429)));\n\n for (let attempt = 0; ; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n return await fn(attempt);\n } catch (error) {\n if (attempt >= retries || !is429(error)) {\n throw error;\n }\n\n const backoff = Math.min(initialDelay * 2 ** attempt, maxDelay);\n\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, backoff);\n });\n }\n }\n },\n\n /**\n * A lot of failures get produced by EventEmitters, which makes them difficult to\n * detect in tests (they just look like timeouts). This is a test helper that\n * captures that error and turns it into a rejected promise\n * @param {EventEmitter} emitter\n * @param {Function} fn\n * @returns {Promise}\n */\n handleErrorEvent: function handleErrorEvent(emitter, fn) {\n let r;\n const p = new Promise((resolve, reject) => {\n r = reject;\n emitter.once('error', reject);\n });\n\n const handler = Promise.race([p, fn(emitter)])\n .then(unbind)\n .catch((reason) => {\n unbind();\n throw reason;\n });\n\n // Make it possible to add additional emitters\n handler.add = (e) => e.once('error', r);\n\n return handler;\n\n /**\n * unbinder\n * @private\n * @returns {undefined}\n */\n function unbind() {\n try {\n emitter.off('error', r);\n } catch (err) {\n // ignore\n }\n }\n },\n\n inBrowser,\n\n inNode,\n\n /**\n * Wrap the desired mochaMethod with `skipInBrowser` to prevent the\n * corresponding test or group of tests from running in a web browser\n * example:\n * `skipInBrowser(it)('does a thing that only works in node')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInBrowser: function skipInBrowser(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inBrowser() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInNode` to prevent the\n * corresponding test or group of tests from running in node.\n * example:\n * `skipInNode(it)('does a thing that only works in a web browser')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInNode: function skipInNode(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inNode() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInFirefox` to prevent the\n * corresponding test or group of tests from running in Firefox.\n * example:\n * `skipInFirefox(it)('does a thing that does not work in Firefox')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInFirefox: function skipInFirefox(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inFirefox() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Wrap the desired mochaMethod with `skipInSafari` to prevent the\n * corresponding test or group of tests from running in Safari.\n * example:\n * `skipInSafari(it)('does a thing that does not work in Safari')`\n * @param {Function} mochaMethod `it` or `describe`\n * @returns {Function} mochaMethod or mochaMethod.skip\n */\n skipInSafari: function skipInSafari(mochaMethod) {\n // If mochaMethod doesn't have a skip method, assume that mochaMethod is\n // already either a .skip or a .only\n if (!mochaMethod.skip) {\n return mochaMethod;\n }\n\n return inSafari() ? mochaMethod.skip : mochaMethod;\n },\n\n /**\n * Similar to skipInNode in that it prevents the test from running, but goes a\n * step further to hide it from the list of skipped tests. Should be used when\n * the test will never be valid in NodeJS\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n browserOnly: function browserOnly(mochaMethod) {\n return inBrowser() ? mochaMethod : noop;\n },\n\n /**\n * Similar to skipInBrowser in that it prevents the test from running, but\n * goes a step further to hide it from the list of skipped tests. Should be\n * used when the test will never be valid in a Browser\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n nodeOnly: function nodeOnly(mochaMethod) {\n return inNode() ? mochaMethod : noop;\n },\n\n /**\n * Similar to skipInBrowser in that it prevents the test from running, but\n * goes a step further to hide it from the list of skipped tests. Should be\n * used when the test should be run on Jenkins only\n * @param {*} mochaMethod\n * @returns {Functions}\n */\n jenkinsOnly: function jenkinsOnly(mochaMethod) {\n return inJenkins() ? mochaMethod : noop;\n },\n\n /**\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @param {function} activityChecker // callback to check if activity matches\n * @param {string} msg\n * @returns {Promise<mixed>} Resolves with the activity\n */\n expectActivity: function expectActivity(max, event, emitter, activityChecker, msg) {\n let timer;\n\n /**\n * helper\n * @private\n * @returns {undefined}\n */\n function unbind() {\n try {\n clearTimeout(timer);\n emitter.off(event);\n } catch (err) {\n // ignore\n }\n }\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`${event} did not fire within ${max}ms${msg ? `: ${msg}` : ''}`));\n }, max);\n }),\n new Promise((resolve) => {\n emitter.on(event, (result) => {\n const {\n data: {activity},\n } = result;\n\n if (activityChecker(activity)) {\n unbind();\n resolve(activity);\n }\n });\n }),\n ]).catch((reason) => {\n unbind();\n throw reason;\n });\n },\n\n /**\n * Returns a promise that resolves after timeout or rejects\n * when count has been exceeded. Will also reject if count\n * hasn't been met after timeout\n * @param {number} max amount of time to wait for events in ms\n * @param {number} count number of events to expect in timeframe\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise}\n */\n expectExactlyNEvents: function expectExactlyNEvents(max, count, event, emitter) {\n let lastResult;\n let timer;\n\n let currentCount = 0;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n if (currentCount === count) {\n resolve(lastResult);\n } else {\n reject(\n new Error(\n `${event} fired only ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }\n }, max);\n }),\n new Promise((resolve, reject) => {\n emitter.on(event, fn);\n\n /**\n * helper\n * @private\n * @param {object} result\n * @returns {undefined}\n */\n function fn(result) {\n lastResult = result;\n currentCount += 1;\n if (currentCount > count) {\n emitter.off(event, fn);\n clearTimeout(timer);\n reject(\n new Error(\n `${event} fired ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }\n }\n }),\n ]);\n },\n\n /**\n * Returns a promise that resolves when event is fired count times or rejects\n * when max expires\n * @param {number} max\n * @param {number} count\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise}\n */\n expectNEvents: function expectNEvents(max, count, event, emitter) {\n let timer;\n\n let currentCount = 0;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(\n new Error(\n `${event} fired only ${currentCount} times within ${max}ms. expected ${count} times`\n )\n );\n }, max);\n }),\n new Promise((resolve) => {\n emitter.on(event, fn);\n\n /**\n * helper\n * @private\n * @returns {undefined}\n */\n function fn() {\n currentCount += 1;\n if (currentCount === count) {\n emitter.off(event, fn);\n clearTimeout(timer);\n resolve();\n }\n }\n }),\n ]);\n },\n\n /**\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @param {string} msg\n * @returns {Promise<mixed>} Resolves with the results of the event\n */\n expectEvent: function expectEvent(max, event, emitter, msg) {\n let timer;\n\n return Promise.race([\n new Promise((resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`${event} did not fire within ${max}ms${msg ? `: ${msg}` : ''}`));\n }, max);\n }),\n new Promise((resolve) => {\n emitter.once(event, (result) => {\n clearTimeout(timer);\n resolve(result);\n });\n }),\n ]);\n },\n\n /**\n * Only run the specified test in firefox\n * @param {Function} mochaMethod\n * @returns {Function}\n */\n firefoxOnly: function firefoxOnly(mochaMethod) {\n return inFirefox() ? mochaMethod : noop;\n },\n\n /**\n * Waits max ms or until emitter fires event, then resolves\n * @param {number} max\n * @param {string} event\n * @param {EventEmitter} emitter\n * @returns {Promise<mixed>}\n */\n maxWaitForEvent: function maxWaitForEvent(max, event, emitter) {\n return Promise.race([\n new Promise((resolve) => {\n setTimeout(resolve, max);\n }),\n new Promise((resolve) => {\n emitter.once(event, resolve);\n }),\n ]);\n },\n\n /**\n * Waits timeout ms or until the promise resolves. Rejects if the timeout is\n * hit, otherwise resolves\n * @param {number} timeout\n * @param {Promise} promise\n * @returns {Promise<mixed>}\n */\n maxWaitForPromise: function maxWaitForPromise(timeout, promise) {\n return Promise.race([\n promise,\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error(`Timeout of ${timeout} expired before promise completed`));\n }, timeout);\n }),\n ]);\n },\n\n /**\n * Do not execute the specified mochaMethod until we pass the specified date\n * @param {Date|string} until\n * @param {string} explanation - Doesn't do anything, but forces you to defend\n * your decision to snooze a test\n * @returns {Function}\n */\n snoozeUntil: function snoozeUntil(until, explanation) {\n const now = new Date();\n\n if (!explanation) {\n throw new Error('You must defend your decision to snooze this test');\n }\n\n const d = new Date(until);\n\n if (Number.isNaN(d.getTime())) {\n throw new Error(`\"${until}\" does not appear to a valid date`);\n }\n\n const skip = now < d;\n\n return (mochaMethod) => {\n if (skip) {\n return mochaMethod.skip;\n }\n\n return mochaMethod;\n };\n },\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
29
29
|
"@webex/jest-config-legacy": "0.0.0",
|
|
30
30
|
"@webex/legacy-tools": "0.0.0",
|
|
31
|
-
"@webex/test-helper-chai": "3.
|
|
32
|
-
"@webex/test-helper-mock-webex": "3.
|
|
33
|
-
"@webex/test-helper-test-users": "3.
|
|
31
|
+
"@webex/test-helper-chai": "3.12.0-llmrefactor.2",
|
|
32
|
+
"@webex/test-helper-mock-webex": "3.12.0-llmrefactor.1",
|
|
33
|
+
"@webex/test-helper-test-users": "3.12.0-llmrefactor.1",
|
|
34
34
|
"eslint": "^8.24.0",
|
|
35
35
|
"prettier": "^2.7.1"
|
|
36
36
|
},
|
|
37
|
-
"version": "3.
|
|
37
|
+
"version": "3.12.0-llmrefactor.2"
|
|
38
38
|
}
|
package/src/index.js
CHANGED
|
@@ -89,6 +89,55 @@ module.exports = {
|
|
|
89
89
|
return shouldSkip ? mochaMethod.skip : mochaMethod;
|
|
90
90
|
},
|
|
91
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Retries a promise-returning function when it rejects with an HTTP 429
|
|
94
|
+
* (Too Many Requests) response, using exponential backoff between attempts.
|
|
95
|
+
* Any other rejection - or exhausting the retries - is re-thrown immediately
|
|
96
|
+
* so genuine failures still surface. Intended for integration tests that hit
|
|
97
|
+
* rate-limited backend endpoints (e.g. user activation / email verification).
|
|
98
|
+
*
|
|
99
|
+
* The `fn` is (re)invoked on every attempt, so callers that inspect spies
|
|
100
|
+
* should reset their history at the start of `fn`.
|
|
101
|
+
*
|
|
102
|
+
* Note: backoff is bounded by the mocha per-test timeout, so keep the delays
|
|
103
|
+
* modest relative to that budget.
|
|
104
|
+
*
|
|
105
|
+
* @param {Function} fn - Returns the promise to (re)execute; receives the
|
|
106
|
+
* zero-based attempt number.
|
|
107
|
+
* @param {object} [options]
|
|
108
|
+
* @param {number} [options.retries=3] - Max retries after the first attempt.
|
|
109
|
+
* @param {number} [options.initialDelay=1000] - Base backoff delay in ms.
|
|
110
|
+
* @param {number} [options.maxDelay=5000] - Upper bound for a single backoff in ms.
|
|
111
|
+
* @returns {Promise<mixed>} Resolves with the first successful attempt's value.
|
|
112
|
+
*/
|
|
113
|
+
retryOn429: async function retryOn429(
|
|
114
|
+
fn,
|
|
115
|
+
{retries = 3, initialDelay = 1000, maxDelay = 5000} = {}
|
|
116
|
+
) {
|
|
117
|
+
const is429 = (error) =>
|
|
118
|
+
Boolean(error) &&
|
|
119
|
+
(error.statusCode === 429 ||
|
|
120
|
+
(error.body && (error.body.statusCode === 429 || error.body.errorCode === 429)));
|
|
121
|
+
|
|
122
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
123
|
+
try {
|
|
124
|
+
// eslint-disable-next-line no-await-in-loop
|
|
125
|
+
return await fn(attempt);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (attempt >= retries || !is429(error)) {
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const backoff = Math.min(initialDelay * 2 ** attempt, maxDelay);
|
|
132
|
+
|
|
133
|
+
// eslint-disable-next-line no-await-in-loop
|
|
134
|
+
await new Promise((resolve) => {
|
|
135
|
+
setTimeout(resolve, backoff);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
|
|
92
141
|
/**
|
|
93
142
|
* A lot of failures get produced by EventEmitters, which makes them difficult to
|
|
94
143
|
* detect in tests (they just look like timeouts). This is a test helper that
|