@4c/fetch-mock
Version:
Mock http requests made using fetch (or isomorphic-fetch)
190 lines (156 loc) • 6.39 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
var _every = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/every"));
var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
var _glob = require('glob-to-regexp');
var pathToRegexp = require('path-to-regexp');
var querystring = require('querystring');
var _require = require('./request-utils'),
headerUtils = _require.headers,
getPath = _require.getPath,
getQuery = _require.getQuery,
normalizeUrl = _require.normalizeUrl;
var stringMatchers = {
begin: function begin(targetString) {
return function (url) {
return (0, _indexOf["default"])(url).call(url, targetString) === 0;
};
},
end: function end(targetString) {
return function (url) {
return url.substr(-targetString.length) === targetString;
};
},
glob: function glob(targetString) {
var urlRX = _glob(targetString);
return function (url) {
return urlRX.test(url);
};
},
express: function express(targetString) {
var urlRX = pathToRegexp(targetString);
return function (url) {
return urlRX.test(getPath(url));
};
},
path: function path(targetString) {
return function (url) {
return getPath(url) === targetString;
};
}
};
var getHeaderMatcher = function getHeaderMatcher(_ref) {
var expectedHeaders = _ref.headers;
var expectation = headerUtils.toLowerCase(expectedHeaders);
return function (url, _ref2) {
var _context;
var _ref2$headers = _ref2.headers,
headers = _ref2$headers === void 0 ? {} : _ref2$headers;
var lowerCaseHeaders = headerUtils.toLowerCase(headerUtils.normalize(headers));
return (0, _every["default"])(_context = (0, _keys["default"])(expectation)).call(_context, function (headerName) {
return headerUtils.equal(lowerCaseHeaders[headerName], expectation[headerName]);
});
};
};
var getMethodMatcher = function getMethodMatcher(_ref3) {
var expectedMethod = _ref3.method;
return function (url, _ref4) {
var method = _ref4.method;
return expectedMethod === (method ? method.toLowerCase() : 'get');
};
};
var getQueryStringMatcher = function getQueryStringMatcher(_ref5) {
var expectedQuery = _ref5.query;
var keys = (0, _keys["default"])(expectedQuery);
return function (url) {
var query = querystring.parse(getQuery(url));
return (0, _every["default"])(keys).call(keys, function (key) {
return query[key] === expectedQuery[key];
});
};
};
var getParamsMatcher = function getParamsMatcher(_ref6) {
var expectedParams = _ref6.params,
matcher = _ref6.matcher;
if (!/express:/.test(matcher)) {
throw new Error('fetch-mock: matching on params is only possible when using an express: matcher');
}
var expectedKeys = (0, _keys["default"])(expectedParams);
var keys = [];
var re = pathToRegexp(matcher.replace(/^express:/, ''), keys);
return function (url) {
var vals = re.exec(getPath(url)) || [];
vals.shift();
var params = (0, _reduce["default"])(keys).call(keys, function (map, _ref7, i) {
var name = _ref7.name;
return vals[i] ? (0, _assign["default"])(map, (0, _defineProperty2["default"])({}, name, vals[i])) : map;
}, {});
return (0, _every["default"])(expectedKeys).call(expectedKeys, function (key) {
return params[key] === expectedParams[key];
});
};
};
var getFunctionMatcher = function getFunctionMatcher(_ref8) {
var matcher = _ref8.matcher,
_ref8$functionMatcher = _ref8.functionMatcher,
functionMatcher = _ref8$functionMatcher === void 0 ? function () {
return true;
} : _ref8$functionMatcher;
return typeof matcher === 'function' ? matcher : functionMatcher;
};
var getUrlMatcher = function getUrlMatcher(route) {
var matcher = route.matcher,
query = route.query;
if (typeof matcher === 'function') {
return function () {
return true;
};
}
if (matcher instanceof RegExp) {
return function (url) {
return matcher.test(url);
};
}
if (matcher === '*') {
return function () {
return true;
};
}
for (var shorthand in stringMatchers) {
if ((0, _indexOf["default"])(matcher).call(matcher, shorthand + ':') === 0) {
var url = matcher.replace(new RegExp("^".concat(shorthand, ":")), '');
return stringMatchers[shorthand](url);
}
} // if none of the special syntaxes apply, it's just a simple string match
// but we have to be careful to normalize the url we check and the name
// of the route to allow for e.g. http://it.at.there being indistinguishable
// from http://it.at.there/ once we start generating Request/Url objects
var expectedUrl = normalizeUrl(matcher);
if (route.identifier === matcher) {
route.identifier = expectedUrl;
}
return function (url) {
if (query && (0, _indexOf["default"])(expectedUrl).call(expectedUrl, '?')) {
return (0, _indexOf["default"])(url).call(url, expectedUrl) === 0;
}
return normalizeUrl(url) === expectedUrl;
};
};
module.exports = function (route) {
var _context2;
var matchers = (0, _filter["default"])(_context2 = [route.query && getQueryStringMatcher(route), route.method && getMethodMatcher(route), route.headers && getHeaderMatcher(route), route.params && getParamsMatcher(route), getFunctionMatcher(route), getUrlMatcher(route)]).call(_context2, function (matcher) {
return !!matcher;
});
return function (url) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var request = arguments.length > 2 ? arguments[2] : undefined;
return (0, _every["default"])(matchers).call(matchers, function (matcher) {
return matcher(url, options, request);
});
};
};