UNPKG

mocked-xhr

Version:

A backend mocking solution for npm based web applications (fork of https://github.com/callmehiphop/backend).

95 lines (81 loc) 2.54 kB
'use strict'; var _ = require('./lodash.custom'); var globToRegExp = require('glob-to-regexp'); /** * Creates a new Mock object, used to return the desired response * for supplied request information * @param {string} method * @param {string|regexp} url * @param {object} data (optional) * @param {object} headers (optional) */ var Mock = module.exports = function Mock (method, url, data, headers, randomValueQueryStringParamters) { this.method = method.toUpperCase(); this.url = url instanceof RegExp ? url : globToRegExp(url); this.data = data; this.headers = headers; this.randomValueQueryStringParamters = randomValueQueryStringParamters || []; }; /** * Checks to see if the current Mock matches the supplied * request information * @param {string} method * @param {string} url * @param {object} data * @param {object} headers * @return {boolean} */ Mock.prototype.match = function match (method, url, data, headers) { url = this.removeRandomValueQueryStringParamters(url); if (this.url.test(url)) { if (this.method === method.toUpperCase()) { if (this.matchHeaders(headers)) { if (typeof data === 'string') { data = JSON.parse(data); } if (!this.data || _.isEqual(this.data, data)) { return true; } } } } return false; }; /** * Make sure that whatever header are expected are present * @param {object} headers * @return {boolean} */ Mock.prototype.matchHeaders = function matchHeader (headers) { if(!this.headers) { return true; } headers = headers || {}; var match = true; var keys = Object.keys(this.headers || {}); if (keys.length > 0) { keys.forEach(function(key) { if (match && this.headers && this.headers[key] !== headers[key]) { match = false; } }.bind(this)); } return match; }; Mock.prototype.removeRandomValueQueryStringParamters = function removeRandomValueQueryStringParamters (url) { if (this.randomValueQueryStringParamters.length > 0) { this.randomValueQueryStringParamters.forEach(function(parameter) { var regex1 = new RegExp(parameter + '=(\\d*)&'); var regex2 = new RegExp('&' + parameter + '=(\\d*)'); var regex3 = new RegExp('\\?' + parameter + '=(\\d*)'); if (url.match(regex1)) { url = url.replace(regex1, ''); } else if (url.match(regex2)) { url = url.replace(regex2, ''); } else if (url.match(regex3)) { url = url.replace(regex3, ''); } }); } return url; };