UNPKG

metaapi.cloud-sdk

Version:

SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)

145 lines (144 loc) 15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { arrayMatchWithEqualLength: function() { return arrayMatchWithEqualLength; }, callCountWithExactly: function() { return callCountWithExactly; }, callCountWithMatch: function() { return callCountWithMatch; }, callOrder: function() { return callOrder; } }); const _testHelpers = /*#__PURE__*/ _interop_require_wildcard(require("./testHelpers")); const _assert = require("assert"); const _util = /*#__PURE__*/ _interop_require_default(require("util")); require("should"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function callCountWithMatch(spy, calls, ...args) { if (!spy.isSinonProxy) { throw new _assert.AssertionError({ message: "Given function is not a sinon spy" }); } let matchedCalls = _testHelpers.getCallsWithMatch(spy, ...args); if (matchedCalls.length !== calls) { throw Object.assign(new _assert.AssertionError({ message: `Spy expected to be called ${calls} times with specified arguments but was called ` + `${matchedCalls.length} times with them of ${spy.callCount} total calls` }), { callArgs: _util.default.inspect(spy.args, { depth: 3 }) }); } } function callCountWithExactly(spy, calls, ...args) { if (!spy.isSinonProxy) { throw new _assert.AssertionError({ message: "Given function is not a sinon spy" }); } let matchedCalls = _testHelpers.getCallsWithExactly(spy, ...args); matchedCalls.length.should.equal(calls, `Spy expected to be called ${calls} times with specified arguments ` + `but was called ${matchedCalls.length} times with them of ${spy.callCount} total calls`); } function arrayMatchWithEqualLength(actualArray, expectedArray) { actualArray.should.match(expectedArray); actualArray.length.should.equal(expectedArray.length); } function callOrder(spyCalls) { let callIds = spyCalls.map((call, index)=>{ const label = call.label || call.spy.name || "default"; let sinonCall = call.spy.getCall(call.call); if (!sinonCall) { throw new _assert.AssertionError({ message: `Call ${index} (${label}) does not exist` }); } return { id: sinonCall.callId, label }; }); let previousCallId; for(let index = 0; index < spyCalls.length; ++index){ if (previousCallId !== undefined && callIds[index].id < previousCallId.id) { throw new _assert.AssertionError({ message: `Wrong call order detected in call ids ${callIds.map((id)=>`\n${id.id} (${id.label})`)}`, expected: `Call id larger than the previous call ${previousCallId}`, actual: callIds[index] }); } if (spyCalls[index].matchArgs) { try { spyCalls[index].spy.getCall(spyCalls[index].call).args.should.match(spyCalls[index].matchArgs); } catch (err) { throw Object.assign(new _assert.AssertionError({ message: `Call ${index} (${callIds[index].label}) args do not match` }), { index, label: callIds[index].label, cause: err }); } } previousCallId = callIds[index]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAqIGFzIHRlc3RIZWxwZXJzIGZyb20gJy4vdGVzdEhlbHBlcnMnO1xuaW1wb3J0IHtBc3NlcnRpb25FcnJvcn0gZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7RGVlcFBhcnRpYWx9IGZyb20gJy4uLy4uL3R5cGVzL3V0aWwnO1xuaW1wb3J0IHR5cGUgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGEgc3R1YiBvciBhcHkgY2FsbGVkIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgd2l0aCBhcmdzIG1hdGNoZWQgc3BlY2lmaWVkIG9uZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNweSBTaW5vbiBzdHViIG9yIHNweVxuICogQHBhcmFtIHtOdW1iZXJ9IGNhbGxzIEV4cGVjdGVkIG51bWJlciBvZiBjYWxsc1xuICogQHBhcmFtIHtBcnJheX0gYXJncyBFeHBlY3RlZCBjYWxsIGFyZ3VtZW50c1xuICogQHRocm93cyB7QXNzZXJ0aW9uRXJyb3J9IElmIGFzc2VydGlvbiBmYWlsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxDb3VudFdpdGhNYXRjaDxTcHkgZXh0ZW5kcyBzaW5vbi5TaW5vblNweT4oXG4gIHNweTogU3B5LCBjYWxsczogbnVtYmVyLCAuLi5hcmdzOiBEZWVwUGFydGlhbDxQYXJhbWV0ZXJzPFNweT4+XG4pIHtcbiAgaWYgKCEoc3B5IGFzIGFueSkuaXNTaW5vblByb3h5KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiAnR2l2ZW4gZnVuY3Rpb24gaXMgbm90IGEgc2lub24gc3B5J30pO1xuICB9XG4gIGxldCBtYXRjaGVkQ2FsbHMgPSB0ZXN0SGVscGVycy5nZXRDYWxsc1dpdGhNYXRjaChzcHksIC4uLmFyZ3MpO1xuICBpZiAobWF0Y2hlZENhbGxzLmxlbmd0aCAhPT0gY2FsbHMpIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBgU3B5IGV4cGVjdGVkIHRvIGJlIGNhbGxlZCAke2NhbGxzfSB0aW1lcyB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgYnV0IHdhcyBjYWxsZWQgYCArXG4gICAgICAgIGAke21hdGNoZWRDYWxscy5sZW5ndGh9IHRpbWVzIHdpdGggdGhlbSBvZiAke3NweS5jYWxsQ291bnR9IHRvdGFsIGNhbGxzYH0pLFxuICAgICAge2NhbGxBcmdzOiB1dGlsLmluc3BlY3Qoc3B5LmFyZ3MsIHtkZXB0aDogM30pfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSBzdHViIG9yIGFweSBjYWxsZWQgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcyB3aXRoIGFyZ3MgdGhhdCBkZWVwIGVxdWFsIHRvIHNwZWNpZmllZCBvbmVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzcHkgU2lub24gc3R1YiBvciBzcHlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjYWxscyBFeHBlY3RlZCBudW1iZXIgb2YgY2FsbHNcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgRXhwZWN0ZWQgY2FsbCBhcmd1bWVudHNcbiAqIEB0aHJvd3Mge0Fzc2VydGlvbkVycm9yfSBJZiBhc3NlcnRpb24gZmFpbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxsQ291bnRXaXRoRXhhY3RseTxTcHkgZXh0ZW5kcyBzaW5vbi5TaW5vblNweT4oc3B5OiBTcHksIGNhbGxzOiBudW1iZXIsIC4uLmFyZ3M6IFBhcmFtZXRlcnM8U3B5Pikge1xuICBpZiAoIShzcHkgYXMgYW55KS5pc1Npbm9uUHJveHkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6ICdHaXZlbiBmdW5jdGlvbiBpcyBub3QgYSBzaW5vbiBzcHknfSk7XG4gIH1cbiAgbGV0IG1hdGNoZWRDYWxscyA9IHRlc3RIZWxwZXJzLmdldENhbGxzV2l0aEV4YWN0bHkoc3B5LCAuLi5hcmdzIGFzIERlZXBQYXJ0aWFsPFBhcmFtZXRlcnM8U3B5Pj4pO1xuICBtYXRjaGVkQ2FsbHMubGVuZ3RoLnNob3VsZC5lcXVhbChjYWxscywgYFNweSBleHBlY3RlZCB0byBiZSBjYWxsZWQgJHtjYWxsc30gdGltZXMgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzIGAgK1xuICAgIGBidXQgd2FzIGNhbGxlZCAke21hdGNoZWRDYWxscy5sZW5ndGh9IHRpbWVzIHdpdGggdGhlbSBvZiAke3NweS5jYWxsQ291bnR9IHRvdGFsIGNhbGxzYCk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGFycmF5IG1hdGNoZXMgdG8gZXhwZWN0ZWQgb25lIHdpdGggYW5kIHRoZSBsZW5ndGhzIGFyZSBlcXVhbCBcbiAqIEBwYXJhbSB7QXJyYXl9IGFjdHVhbEFycmF5IEFjdHVhbCBhcnJheSB0byBtYXRjaFxuICogQHBhcmFtIHtBcnJheX0gZXhwZWN0ZWRBcnJheSBFeHBlY3RlZCBhcnJheSB0byBtYXRjaCB0b1xuICogQHRocm93cyB7QXNzZXJ0aW9uRXJyb3J9IElmIGFzc2VydGlvbiBmYWlsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5TWF0Y2hXaXRoRXF1YWxMZW5ndGgoYWN0dWFsQXJyYXksIGV4cGVjdGVkQXJyYXkpIHtcbiAgYWN0dWFsQXJyYXkuc2hvdWxkLm1hdGNoKGV4cGVjdGVkQXJyYXkpO1xuICBhY3R1YWxBcnJheS5sZW5ndGguc2hvdWxkLmVxdWFsKGV4cGVjdGVkQXJyYXkubGVuZ3RoKTtcbn1cblxuLyoqIFNweSBjYWxsIG9wdGlvbnMgKi9cbmV4cG9ydCB0eXBlIFNweUNhbGw8VEFyZ3MgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSB7XG4gIC8qKiBTaW5vbiBzcHkgKi9cbiAgc3B5OiBzaW5vbi5TaW5vblNweTxUQXJncz4sXG4gIC8qKiBDYWxsIGluZGV4ICovXG4gIGNhbGw6IG51bWJlcixcbiAgLyoqIElmIHNwZWNpZmllZCwgYXNzZXJ0cyBhcmdzIG1hdGNoICovXG4gIG1hdGNoQXJncz86IERlZXBQYXJ0aWFsPFRBcmdzPixcbiAgLyoqIExvZ2dpbmcgbGFiZWwuIERlZmF1bHRzIHRvIGBzcHlgIGZ1bmN0aW9uIG5hbWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBkZWZhdWx0YCAqL1xuICBsYWJlbD86IHN0cmluZ1xufTtcblxuLyoqXG4gKiBTaW5vbidzIGNhbGxPcmRlciBzZWVtcyB0byBoYXZlIHNvbWUgYnVnIGdpdmluZyBpbmNvcnJlY3QgYXNzZXJ0aW9uLCBzbyB0aGlzIGlzIGEgbWFudWFsIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gc3B5Q2FsbHMgc3B5IGNhbGxzXG4gKiBAdGhyb3dzIGFzc2VydGlvbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbE9yZGVyKHNweUNhbGxzOiBTcHlDYWxsPGFueT5bXSkge1xuICB0eXBlIENhbGxJZCA9IHtpZDogbnVtYmVyLCBsYWJlbDogc3RyaW5nfTtcbiAgbGV0IGNhbGxJZHM6IENhbGxJZFtdID0gc3B5Q2FsbHMubWFwKChjYWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID0gY2FsbC5sYWJlbCB8fCBjYWxsLnNweS5uYW1lIHx8ICdkZWZhdWx0JztcbiAgICBsZXQgc2lub25DYWxsID0gY2FsbC5zcHkuZ2V0Q2FsbChjYWxsLmNhbGwpO1xuICAgIGlmICghc2lub25DYWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6IGBDYWxsICR7aW5kZXh9ICgke2xhYmVsfSkgZG9lcyBub3QgZXhpc3RgfSk7XG4gICAgfVxuICAgIHJldHVybiB7aWQ6IChzaW5vbkNhbGwgYXMgYW55KS5jYWxsSWQsIGxhYmVsfTtcbiAgfSk7XG4gIGxldCBwcmV2aW91c0NhbGxJZDogQ2FsbElkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3B5Q2FsbHMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgaWYgKHByZXZpb3VzQ2FsbElkICE9PSB1bmRlZmluZWQgJiYgY2FsbElkc1tpbmRleF0uaWQgPCBwcmV2aW91c0NhbGxJZC5pZCkge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogYFdyb25nIGNhbGwgb3JkZXIgZGV0ZWN0ZWQgaW4gY2FsbCBpZHMgJHtjYWxsSWRzLm1hcChpZCA9PiBgXFxuJHtpZC5pZH0gKCR7aWQubGFiZWx9KWApfWAsXG4gICAgICAgIGV4cGVjdGVkOiBgQ2FsbCBpZCBsYXJnZXIgdGhhbiB0aGUgcHJldmlvdXMgY2FsbCAke3ByZXZpb3VzQ2FsbElkfWAsXG4gICAgICAgIGFjdHVhbDogY2FsbElkc1tpbmRleF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3B5Q2FsbHNbaW5kZXhdLm1hdGNoQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3B5Q2FsbHNbaW5kZXhdLnNweS5nZXRDYWxsKHNweUNhbGxzW2luZGV4XS5jYWxsKS5hcmdzLnNob3VsZC5tYXRjaChzcHlDYWxsc1tpbmRleF0ubWF0Y2hBcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYENhbGwgJHtpbmRleH0gKCR7Y2FsbElkc1tpbmRleF0ubGFiZWx9KSBhcmdzIGRvIG5vdCBtYXRjaGB9KSxcbiAgICAgICAgICB7aW5kZXgsIGxhYmVsOiBjYWxsSWRzW2luZGV4XS5sYWJlbCwgY2F1c2U6IGVycn1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJldmlvdXNDYWxsSWQgPSBjYWxsSWRzW2luZGV4XTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImFycmF5TWF0Y2hXaXRoRXF1YWxMZW5ndGgiLCJjYWxsQ291bnRXaXRoRXhhY3RseSIsImNhbGxDb3VudFdpdGhNYXRjaCIsImNhbGxPcmRlciIsInNweSIsImNhbGxzIiwiYXJncyIsImlzU2lub25Qcm94eSIsIkFzc2VydGlvbkVycm9yIiwibWVzc2FnZSIsIm1hdGNoZWRDYWxscyIsInRlc3RIZWxwZXJzIiwiZ2V0Q2FsbHNXaXRoTWF0Y2giLCJsZW5ndGgiLCJPYmplY3QiLCJhc3NpZ24iLCJjYWxsQ291bnQiLCJjYWxsQXJncyIsInV0aWwiLCJpbnNwZWN0IiwiZGVwdGgiLCJnZXRDYWxsc1dpdGhFeGFjdGx5Iiwic2hvdWxkIiwiZXF1YWwiLCJhY3R1YWxBcnJheSIsImV4cGVjdGVkQXJyYXkiLCJtYXRjaCIsInNweUNhbGxzIiwiY2FsbElkcyIsIm1hcCIsImNhbGwiLCJpbmRleCIsImxhYmVsIiwibmFtZSIsInNpbm9uQ2FsbCIsImdldENhbGwiLCJpZCIsImNhbGxJZCIsInByZXZpb3VzQ2FsbElkIiwidW5kZWZpbmVkIiwiZXhwZWN0ZWQiLCJhY3R1YWwiLCJtYXRjaEFyZ3MiLCJlcnIiLCJjYXVzZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0lBc0RnQkEseUJBQXlCO2VBQXpCQTs7SUFmQUMsb0JBQW9CO2VBQXBCQTs7SUF2QkFDLGtCQUFrQjtlQUFsQkE7O0lBNERBQyxTQUFTO2VBQVRBOzs7cUVBMUVhO3dCQUNBOzZEQUdaO1FBQ1Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsU0FBU0QsbUJBQ2RFLEdBQVEsRUFBRUMsS0FBYSxFQUFFLEdBQUdDLElBQWtDO0lBRTlELElBQUksQ0FBQyxBQUFDRixJQUFZRyxZQUFZLEVBQUU7UUFDOUIsTUFBTSxJQUFJQyxzQkFBYyxDQUFDO1lBQUNDLFNBQVM7UUFBbUM7SUFDeEU7SUFDQSxJQUFJQyxlQUFlQyxhQUFZQyxpQkFBaUIsQ0FBQ1IsUUFBUUU7SUFDekQsSUFBSUksYUFBYUcsTUFBTSxLQUFLUixPQUFPO1FBQ2pDLE1BQU1TLE9BQU9DLE1BQU0sQ0FDakIsSUFBSVAsc0JBQWMsQ0FBQztZQUFDQyxTQUFT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