blob: f0c168fcc103de88fdb7953cd4e7132824ae13b9 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<script>
'use strict';
var testing_common = (function() {
var originalXMLHttpRequest = window.XMLHttpRequest;
var fixture = null;
var xhrMock = null;
var XMLHttpRequestMock = function() {
this.responseMap_ = {};
window.XMLHttpRequest = this.getMock();
};
XMLHttpRequestMock.prototype.getMock = function() {
// TODO(chrisphan): Add support for error state.
var self = this;
return function() {
this.status = 200;
this.onerror = function() {};
this.open = function(method, url, async) {
this.url = url;
};
this.abort = function() {};
this.setRequestHeader = function() {};
this.onload = function() {};
this.send = function(param) {
var requestStr = this.url + '?' + sortQueryPart(param);
if (requestStr in self.responseMap_) {
this.responseText = self.responseMap_[requestStr];
this.onload();
} else if ('*' in self.responseMap_) {
this.responseText = self.responseMap_['*'];
this.onload();
} else {
console.warn('XMLHttpRequest sent without a handler: ' + requestStr);
}
};
};
};
XMLHttpRequestMock.prototype.add = function(param, response) {
if (param != '*') {
param = sortQueryPart(param);
}
this.responseMap_[param] = response;
};
function addXhrMock(param, response) {
if (!xhrMock) {
xhrMock = new XMLHttpRequestMock();
}
xhrMock.add(param, response);
};
function clearXhrMock() {
window.XMLHttpRequest = originalXMLHttpRequest;
xhrMock = null;
};
/**
* Does a deep copy of the object.
* @param {*} obj Object to copy.
* @return {*} A copy of the object.
*/
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
};
function addToFixture(node) {
if (!fixture) {
fixture = document.createElement('div');
document.body.appendChild(fixture);
}
fixture.appendChild(node);
};
function clearFixture() {
if (fixture) {
fixture.innerHTML = '';
}
};
var paramString = function(params) {
var keys = Object.keys(params).sort();
return keys.map(function(key) {
return key + '=' + encodeURIComponent(params[key]);
}).join('&');
};
var sortQueryPart = function(paramStr) {
var params = {};
var path = paramStr.substring(0, paramStr.indexOf('?') + 1);
var query = paramStr.substring(paramStr.indexOf('?') + 1);
var queryParts = query.split('&');
for (var i = 0; i < queryParts.length; i++) {
var pair = queryParts[i].split('=');
params[pair[0]] = pair.length == 1 ? '' : pair[1];
}
var keys = Object.keys(params).sort();
query = keys.map(function(key) {
return key + '=' + params[key];
}).join('&');
return path + query;
};
return {
addXhrMock: addXhrMock,
clearXhrMock: clearXhrMock,
deepCopy: deepCopy,
addToFixture: addToFixture,
clearFixture: clearFixture,
paramString: paramString,
sortQueryPart: sortQueryPart
};
})();
</script>