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
JavaScript
'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;
};