You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
6.8 KiB
241 lines
6.8 KiB
/* |
|
Copyright (c) 2004-2006, The Dojo Foundation |
|
All Rights Reserved. |
|
|
|
Licensed under the Academic Free License version 2.1 or above OR the |
|
modified BSD license. For more information on Dojo licensing, see: |
|
|
|
http://dojotoolkit.org/community/licensing.shtml |
|
*/ |
|
|
|
dojo.provide("tests.MockXMLHttpRequest"); |
|
|
|
/* summary: |
|
* MockXMLHttpRequest implements the XMLHttpRequest interface to allow testing |
|
* without having to run a server. It can work with dojo.io.bind and |
|
* dojo.hostenv.getText by using the setMockXMLHttpRequest() function to |
|
* set dojo.hostenv.getXmlhttpObject use a MockXMLHTTPRequest. |
|
* tests.MockXMLHttpRequest.restore() restores the original one. |
|
*/ |
|
|
|
/* |
|
examples: |
|
var responseText = "this is a test!"; |
|
tests.MockXMLHttpRequest.set(responseText, 1000); //simulate a 1 sec response time |
|
dojo.hostenv.getText('urn:this_is_ignored', |
|
function(data) { |
|
jum.assertTrue(data == responseText); |
|
}); |
|
tests.MockXMLHttpRequest.restore(); |
|
|
|
tests.MockXMLHttpRequest.set(function(xhr) { return xhr.data; }, 100); |
|
var postData = "test post data"; |
|
dojo.io.bind({ |
|
url: "urn:ignore", |
|
method :"post", |
|
postContent : postData, |
|
mimetype: "text/plain" , |
|
handle: function(type, data, evt) { |
|
if(type == "load"){ |
|
jum.assertTrue(data == postData); |
|
} |
|
} |
|
}); |
|
tests.MockXMLHttpRequest.restore(); |
|
*/ |
|
|
|
dojo.require('dojo.event.*'); |
|
|
|
tests.MockXMLHttpRequest = function(responseText, /* milliseconds */ responseTime, responseXml) { |
|
if (typeof responseText == "function") { |
|
this._responseFunc = responseText; |
|
this.responseText= null; |
|
} else { |
|
this.responseText=responseText; |
|
this._responseFunc = null; |
|
} |
|
this._responseHeaders = ''; |
|
this.responseXml= responseXml; //note: this isn't used by BrowserIO |
|
this._delay = responseTime; |
|
this.readyState = 0; |
|
this.onreadystatechange = null; |
|
this._timeout = null; |
|
this._timeoutFunc = null; |
|
this._aborted = false; |
|
|
|
this.open = function(method, url, async) { |
|
this._async = async; |
|
this.readyState = 1; |
|
this.url = url; |
|
}; |
|
|
|
this._finish = function() { |
|
if (this._aborted) |
|
return; |
|
this.readyState = 4; |
|
this.status = 200; |
|
this.statusText = "OK"; |
|
if (this._responseFunc) |
|
this.responseText = this._responseFunc(this); |
|
if (this.onreadystatechange) |
|
this.onreadystatechange(this); |
|
}; |
|
|
|
this.send = function(data) { |
|
this._aborted = false; |
|
this.data = data; |
|
if (this._async !== undefined && !this._async) { |
|
this._finish(); |
|
} else { |
|
this.readyState = 2; |
|
var self = this; |
|
this._timeout = setTimeout( function() { |
|
self._timeout = null; self._finish(); |
|
}, this._delay); |
|
|
|
} |
|
}; |
|
|
|
this.abort = function() { |
|
this._aborted = true; |
|
this.readyState = 0; |
|
if (this._timeout) { |
|
clearTimeout(this._timeout); |
|
this._timeout = null; |
|
} |
|
}; |
|
|
|
this.getAllResponseHeaders = function() { return this._responseHeaders; } |
|
this.getResponseHeader = function(header) { return ""; } |
|
this.setRequestHeader = function(header, value) { } |
|
|
|
}; |
|
|
|
tests.MockXMLHttpRequest._originalXmlhttpObjectGetter = dojo.hostenv.getXmlhttpObject; |
|
|
|
tests.MockXMLHttpRequest.set = function(responseTextOrFunc, /* milliseconds */responseTime, |
|
responseXml) { |
|
var oldFunc = dojo.hostenv.getXmlhttpObject; |
|
dojo.hostenv.getXmlhttpObject = function() { |
|
return new tests.MockXMLHttpRequest(responseTextOrFunc, |
|
responseTime, responseXml); |
|
} |
|
return oldFunc; |
|
} |
|
|
|
tests.MockXMLHttpRequest.restore = function() { |
|
dojo.hostenv.getXmlhttpObject = tests.MockXMLHttpRequest._originalXmlhttpObjectGetter; |
|
} |
|
|
|
tests.MockXMLHttpRequest.wrap = function(scope, func, responseTextOrFunc, responseTime, responseXml) { |
|
var disconnectHack = false; |
|
//disconnect is broken!: hasAdvice is doesn't find the advice |
|
//because "__0" != "__0$joinpoint$method" |
|
var aroundFunc = function(invocation) { |
|
if (!disconnectHack) |
|
tests.MockXMLHttpRequest.set(responseTextOrFunc, responseTime, responseXml); |
|
try { |
|
var result = invocation.proceed(); |
|
} finally { |
|
var ret = dojo.event.disconnect("around", scope, func, aroundFunc); |
|
if (!disconnectHack) |
|
tests.MockXMLHttpRequest.restore(); |
|
disconnectHack = true; |
|
} |
|
return result; |
|
}; |
|
dojo.event.connect("around", scope, func, aroundFunc); |
|
} |
|
|
|
if (dojo.hostenv.name_ == 'rhino') { |
|
var _orginalRhinoIOBind = null; |
|
var _currentMockRequests = {}; |
|
|
|
function _rhinoIOBind(kwArgs) { |
|
var tid = java.lang.Thread.currentThread().toString(); |
|
if (!_currentMockRequests[tid]) |
|
return _orginalRhinoIOBind.call(this, kwArgs); |
|
|
|
var async = kwArgs["sync"] ? false : true; |
|
var http = dojo.hostenv.getXmlhttpObject(kwArgs); |
|
//dojo.debug('get mock ' + tid + ' ' + http.responseText); |
|
|
|
var query = ""; |
|
if (kwArgs.postContent) |
|
query = kwArgs.postContent |
|
query += dojo.io.argsFromMap(kwArgs["content"] || {}, |
|
kwArgs.encoding); |
|
|
|
http.onreadystatechange = function() { |
|
if (http.readyState != 4) |
|
return; |
|
|
|
var ret; |
|
if (kwArgs.method.toLowerCase() == "head"){ |
|
// TODO: return the headers |
|
}else{ |
|
var text = http.responseText; |
|
if(kwArgs.mimetype == "text/javascript"){ |
|
try{ |
|
ret = dj_eval(text); |
|
}catch(e){ |
|
dojo.debug(e); |
|
dojo.debug(text); |
|
ret = null; |
|
} |
|
}else if(kwArgs.mimetype == "text/json"){ |
|
try{ |
|
ret = dj_eval("("+text+")"); |
|
}catch(e){ |
|
dojo.debug(e); |
|
dojo.debug(text); |
|
ret = false; |
|
} |
|
}else{ |
|
ret = text; |
|
} |
|
(kwArgs.load || kwArgs.handle)("load", ret, kwArgs); |
|
} |
|
} |
|
http.open('ignored', 'ignored', async); |
|
http.send(query); |
|
kwArgs.abort = function() { http.abort(); }; |
|
} |
|
|
|
dojo.hostenv.getXmlhttpObject = function() { |
|
var tid = java.lang.Thread.currentThread().toString(); |
|
var mockRequest = _currentMockRequests[tid]; |
|
if (mockRequest) { |
|
return new MockXMLHTTPRequest(mockRequest[0],mockRequest[1], |
|
mockRequest[2]); |
|
}else{ |
|
return null; //hostenv doesn't define getXmlhttpObject |
|
} |
|
} |
|
|
|
var _setMockXMLHttpRequest = tests.MockXMLHttpRequest.set; |
|
tests.MockXMLHttpRequest.set = function(responseTextOrFunc, /* milliseconds */responseTime, |
|
responseXml) { |
|
if (!_orginalRhinoIOBind) { |
|
_orginalRhinoIOBind = dojo.io.RhinoHTTPTransport.bind; |
|
dojo.io.RhinoHTTPTransport.bind = _rhinoIOBind; |
|
} |
|
var tid = java.lang.Thread.currentThread().toString(); |
|
//dojo.debug( 'set mock ' + tid + ' ' + responseTextOrFunc); |
|
_currentMockRequests[tid] = arguments; |
|
_setMockXMLHttpRequest.apply(dj_global, arguments); |
|
} |
|
|
|
var _restoreXMLHttpRequest = tests.MockXMLHttpRequest.restore; |
|
tests.MockXMLHttpRequest.restore = function() { |
|
var tid = java.lang.Thread.currentThread().toString(); |
|
if (_currentMockRequests[tid]) { |
|
//dojo.debug( 'delete mock ' + tid); |
|
delete _currentMockRequests[tid]; |
|
} |
|
_restoreXMLHttpRequest(); |
|
} |
|
} |
|
|
|
|
|
|
|
|