blob: 8fe87837983c193d5a66fe49c9765f7a0274e035 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
var gadgets = gadgets || {};
function IoTest(name) {
TestCase.call(this, name);
};
IoTest.inherits(TestCase);
IoTest.prototype.setUp = function() {
this.getUrlParameters = gadgets.util.getUrlParameters;
gadgets.util.getUrlParameters = function() {
return { "st" : "authtoken", "url" : "http://www.gadget.com/gadget.xml", "container" : "foo" };
};
if (!shindig.auth) {
shindig.auth = new shindig.Auth();
}
this.fakeXhrs = new fakeXhr.Factory(this);
this.oldXMLHttpRequest = window.XMLHTTPRequest;
this.oldXhrWrapper = shindig.xhrwrapper;
window.XMLHttpRequest = this.fakeXhrs.getXhrConstructor();
shindig.xhrwrapper = undefined;
document.scripts = [];
gadgets.config.init({ "core.io" : {
"proxyUrl" : "http://example.com/proxy?url=%url%&refresh=%refresh%&g=%gadget%&c=%container%",
"jsonProxyUrl" : "http://example.com/json",
"unparseableCruft" : "throw 1; < don't be evil' >"}});
gadgets.io.preloaded_ = [];
};
IoTest.prototype.tearDown = function() {
gadgets.util.getUrlParameters = this.getUrlParameters;
};
IoTest.prototype.setSchemaless = function() {
gadgets.config.init({ "core.io" : {
"proxyUrl" : "//example.com/proxy?url=%url%&refresh=%refresh%&g=%gadget%&c=%container%",
"jsonProxyUrl" : "http://example.com/json",
"unparseableCruft" : "throw 1; < don't be evil' >"}});
gadgets.io.preloaded_ = [];
};
IoTest.prototype.setWithFileName = function() {
gadgets.config.init({ "core.io" : {
"proxyUrl" : "http://example.com/proxy%filename%?url=%url%&refresh=%refresh%&g=%gadget%&c=%container%",
"jsonProxyUrl" : "http://example.com/json",
"unparseableCruft" : "throw 1; < don't be evil' >"}});
gadgets.io.preloaded_ = [];
};
IoTest.prototype.setOAuthSupportEnabled = function() {
gadgets.config.init({ "core.io" : {
"proxyUrl" : "http://example.com/proxy?url=%url%&refresh=%refresh%&g=%gadget%&c=%container%%authz%",
"jsonProxyUrl" : "http://example.com/json",
"unparseableCruft" : "throw 1; < don't be evil' >"}});
gadgets.io.preloaded_ = [];
};
IoTest.prototype.tearDown = function() {
window.XMLHttpRequest = this.oldXMLHTTPRequest;
shindig.xhrwrapper = this.oldXhrWrapper;
};
IoTest.prototype.testGetProxyUrl = function() {
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif");
this.assertEquals(
"http://example.com/proxy?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=3600" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo",
proxied);
};
IoTest.prototype.testGetProxyUrl_OAuthSupportEnabled = function() {
this.setOAuthSupportEnabled();
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif", { 'AUTHORIZATION': "OAUTH2", 'OAUTH_SERVICE_NAME' : "some-service"});
this.assertEquals(
"http://example.com/proxy?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=3600" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo&authz=oauth2&st=authtoken&OAUTH_SERVICE_NAME=some-service",
proxied);
};
IoTest.prototype.testGetProxyUrl_nondefaultRefresh = function() {
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif",
{ 'REFRESH_INTERVAL' : 30 });
this.assertEquals(
"http://example.com/proxy?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=30" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo",
proxied);
};
IoTest.prototype.testGetProxyUrl_disableCache = function() {
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif",
{ 'REFRESH_INTERVAL' : 0 });
this.assertEquals(
"http://example.com/proxy?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=0" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo",
proxied);
};
IoTest.prototype.testGetProxyUrl_schemaless = function() {
this.setSchemaless();
window.location = { protocol: "https:" };
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif");
this.assertEquals(
"https://example.com/proxy?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=3600" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo",
proxied);
};
IoTest.prototype.testGetProxyUrl_withFileName = function() {
this.setWithFileName();
var proxied = gadgets.io.getProxyUrl("http://target.example.com/image.gif");
this.assertEquals(
"http://example.com/proxy/image.gif?url=http%3a%2f%2ftarget.example.com%2fimage.gif" +
"&refresh=3600" +
"&g=http%3a%2f%2fwww.gadget.com%2fgadget.xml" +
"&c=foo",
proxied);
};
IoTest.prototype.testEncodeValues = function() {
var x = gadgets.io.encodeValues({ 'foo' : 'bar' });
this.assertEquals("foo=bar", x);
};
IoTest.prototype.setArg = function(req, inBody, name, value) {
if (inBody) {
req.setBodyArg(name, value);
} else {
req.setQueryArg(name, value);
}
};
IoTest.prototype.setStandardArgs = function(req, inBody) {
this.setArg(req, inBody, "st", "");
this.setArg(req, inBody, "contentType", "TEXT");
this.setArg(req, inBody, "authz", "");
this.setArg(req, inBody, "bypassSpecCache", "");
this.setArg(req, inBody, "signViewer", "true");
this.setArg(req, inBody, "signOwner", "true");
this.setArg(req, inBody, "getSummaries", "false");
this.setArg(req, inBody, "gadget", "http://www.gadget.com/gadget.xml");
this.setArg(req, inBody, "getFullHeaders", "false");
this.setArg(req, inBody, "container", "foo");
this.setArg(req, inBody, "headers", "");
this.setArg(req, inBody, "numEntries", "3");
this.setArg(req, inBody, "postData", "");
this.setArg(req, inBody, "httpMethod", "GET");
req.setHeader( 'X-Shindig-ST', shindig.auth.getSecurityToken() );
};
IoTest.prototype.makeFakeResponse = function(text, rc) {
return new fakeXhr.Response("throw 1; < don't be evil' >" + text, (rc ? rc : 200));
};
IoTest.prototype.testNoMethod = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testNoMethod_nonDefaultRefresh = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("refresh", "1800");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"REFRESH_INTERVAL" : 1800
});
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testNoMethod_disableRefresh = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("refresh", "0");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"REFRESH_INTERVAL" : 0
});
this.assertEquals('some data', resp.text);
};
// Make sure we don't accidentally include any cache-busting parameters
// in our GET requests
IoTest.prototype.testRepeatGet = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals('some data', resp.text);
resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPost = function() {
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "POST");
req.setBodyArg("postData", "foo=bar");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setBodyArg("headers", "Content-Type=application%2fx-www-form-urlencoded");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "POST";
params[gadgets.io.RequestParameters.POST_DATA] = "foo=bar";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPost_noBody = function() {
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "POST");
req.setBodyArg("postData", "");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setBodyArg("headers", "Content-Type=application%2fx-www-form-urlencoded");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "POST";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPost_emptyBody = function() {
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "POST");
req.setBodyArg("postData", "");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setBodyArg("headers", "Content-Type=application%2fx-www-form-urlencoded");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "POST";
params[gadgets.io.RequestParameters.POST_DATA] = "";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPut = function() {
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "PUT");
req.setBodyArg("postData", "abcd");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "PUT";
params[gadgets.io.RequestParameters.POST_DATA] = "abcd";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
/**
* Tests using makeRequest on IE with ActiveX disabled, which results in ActiveXObject throwing an
* exception. We should then fall back to XMLHttpRequest.
*
* See https://issues.apache.org/jira/browse/SHINDIG-1808 for details.
*/
IoTest.prototype.testPut_IEActiveXDisabled = function() {
ActiveXObject = function() {
throw "error";
}
try {
this.testPut();
} finally {
ActiveXObject = undefined;
}
};
/**
* Tests using makeRequest on IE with ActiveX enabled, which results in an ActiveXObject being
* created instead of XMLHttpRequest.
*/
IoTest.prototype.testPut_IEActiveXEnabled = function() {
ActiveXObject = function() {
var xhrConstructor = this.fakeXhrs.getXhrConstructor();
return new xhrConstructor();
}
try {
this.testPut();
} finally {
ActiveXObject = undefined;
}
};
/**
* Tests using makeRequest if there is no available mechanism for performing XML HTTP requests.
*/
IoTest.prototype.testPut_NoXhrAvailable = function() {
var error = null;
window.XMLHttpRequest = undefined;
try {
this.testPut();
} catch (e) {
error = e;
} finally {
window.XMLHttpRequest = this.fakeXhrs.getXhrConstructor();
}
this.assertEquals('no xhr available', error);
};
IoTest.prototype.testPut_noBody = function() {
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "PUT");
req.setBodyArg("postData", "");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "PUT";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testSignedGet = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("signOwner", "true");
req.setBodyArg("signViewer", "true");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testSignedPost = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("signOwner", "true");
req.setBodyArg("signViewer", "true");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "");
req.setBodyArg("refresh", null);
req.setBodyArg("httpMethod", "POST");
req.setBodyArg("headers", "Content-Type=application%2fx-www-form-urlencoded");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
params["METHOD"] = "POST";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testSignedGet_noViewerBoolean = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("signOwner", "true");
req.setBodyArg("signViewer", "false");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
params[gadgets.io.RequestParameters.SIGN_VIEWER] = false;
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testSignedGet_noViewerString = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("signOwner", "true");
req.setBodyArg("signViewer", "false");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
params[gadgets.io.RequestParameters.SIGN_VIEWER] = "false";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testSignedGet_withNoOwnerAndViewerString = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("signOwner", "false");
req.setBodyArg("signViewer", "true");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "");
req.setBodyArg("refresh", null);
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
params[gadgets.io.RequestParameters.SIGN_VIEWER] = "true";
params[gadgets.io.RequestParameters.SIGN_OWNER] = false;
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testOAuth = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'oauthApprovalUrl' : 'http://sp.example.com/authz?oauth_token=foo',
'oauthState' : 'newState'
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("http://sp.example.com/authz?oauth_token=foo",
resp.oauthApprovalUrl);
gadgets.io.oauthReceivedCallbackUrl_ = "http://shindig?oauth_verifier=12345";
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("oauthState", "newState");
req.setBodyArg("refresh", null);
req.setBodyArg("OAUTH_RECEIVED_CALLBACK",
"http://shindig?oauth_verifier=12345");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("personal data", resp.text);
this.assertEquals(null, gadgets.io.oauthReceivedCallbackUrl_);
};
IoTest.prototype.testSignedEquivalentToOAuth = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "signed");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "");
req.setBodyArg("OAUTH_USE_TOKEN", "always");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'oauthApprovalUrl' : 'http://sp.example.com/authz?oauth_token=foo',
'oauthState' : 'newState'
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "SIGNED";
params["OAUTH_USE_TOKEN"] = "always";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("http://sp.example.com/authz?oauth_token=foo",
resp.oauthApprovalUrl);
};
IoTest.prototype.testOAuth_error = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'oauthError' : 'SOME_ERROR_CODE',
'oauthErrorText' : 'Some helpful error message',
'oauthState' : 'newState'
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertUndefined(resp.oauthApprovalUrl);
this.assertEquals("SOME_ERROR_CODE", resp.oauthError);
this.assertEquals("Some helpful error message", resp.oauthErrorText);
};
IoTest.prototype.testOAuth_serviceAndToken = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "");
req.setBodyArg("OAUTH_SERVICE_NAME", "some-service");
req.setBodyArg("OAUTH_TOKEN_NAME", "some-token");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'oauthApprovalUrl' : 'http://sp.example.com/authz?oauth_token=foo',
'oauthState' : 'newState'
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "some-service";
params[gadgets.io.RequestParameters.OAUTH_TOKEN_NAME] = "some-token";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("http://sp.example.com/authz?oauth_token=foo",
resp.oauthApprovalUrl);
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "newState");
req.setBodyArg("OAUTH_SERVICE_NAME", "some-service");
req.setBodyArg("OAUTH_TOKEN_NAME", "some-token");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "some-service";
params[gadgets.io.RequestParameters.OAUTH_TOKEN_NAME] = "some-token";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("personal data", resp.text);
};
IoTest.prototype.testOAuth_preapprovedToken = function() {
gadgets.io.clearOAuthState();
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "");
req.setBodyArg("OAUTH_REQUEST_TOKEN", "reqtoken");
req.setBodyArg("OAUTH_REQUEST_TOKEN_SECRET", "abcd1234");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params["AUTHORIZATION"] = "OAUTH";
params[gadgets.io.RequestParameters.OAUTH_REQUEST_TOKEN] = "reqtoken";
params[gadgets.io.RequestParameters.OAUTH_REQUEST_TOKEN_SECRET] = "abcd1234";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("personal data", resp.text);
};
IoTest.prototype.testServerFailure = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "JSON");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : 'Internal Server Failure.',
'rc' : 500
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "JSON"
});
this.assertEquals(500, resp.rc);
this.assertEquals(gadgets.json.stringify(["500 Error"]), gadgets.json.stringify(resp.errors));
this.assertEquals("Internal Server Failure.", resp.text);
};
IoTest.prototype.testJsonNonAuthoritative = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "JSON");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : '{ "somejsonparam" : 3 }',
'rc' : 203
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "JSON"
});
this.assertEquals(3, resp.data.somejsonparam);
};
IoTest.prototype.testJson = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "JSON");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : '{ "somejsonparam" : 3 }',
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "JSON"
});
this.assertEquals(3, resp.data.somejsonparam);
};
IoTest.prototype.testJson_malformed = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "JSON");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : '{ bogus : 3 }',
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "JSON"
});
this.assertEquals("500 Failed to parse JSON", resp.errors[0]);
};
/**
* Tests parsing XML if the DOMParser class is defined.
*/
IoTest.prototype.testDom_DomParserDefined = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "DOM");
var body = '<data>some text</data>';
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : body,
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var test = this;
DOMParser = function() {
this.parseFromString = function(content, contentType) {
test.assertEquals(body, content);
test.assertEquals("text/xml", contentType);
return {documentElement: {nodeName: "data", text: "some text"}};
}
}
try {
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "DOM"
});
} finally {
DOMParser = undefined;
}
this.assertEquals(200, resp.rc);
this.assertEquals("some text", resp.data.documentElement.text);
};
/**
* Tests parsing XML if the DOMParser and ActiveXObject classes are both defined - DOMParser
* should be used.
*/
IoTest.prototype.testDom_DomParserAndActiveXObjectDefined = function() {
ActiveXObject = function() {
if (type === "Microsoft.XMLDOM") {
throw "should not be called";
} else {
return new window.XMLHttpRequest();
}
};
try {
this.testDom_DomParserDefined();
} finally {
ActiveXObject = undefined;
}
};
/**
* Tests parsing XML if the ActiveXObject class is defined.
*/
IoTest.prototype.testDom_ActiveXObjectDefined = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "DOM");
var body = '<data>some text</data>';
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : body,
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var test = this;
ActiveXObject = function(type) {
if (type === "Microsoft.XMLDOM") {
this.loadXML = function(content) {
test.assertEquals(body, content);
this.documentElement = {nodeName: "data", text: "some text"};
return true;
}
} else {
return new window.XMLHttpRequest();
}
}
try {
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "DOM"
});
} finally {
ActiveXObject = undefined;
}
this.assertEquals(200, resp.rc);
this.assertEquals("some text", resp.data.documentElement.text);
};
/**
* Tests parsing XML if there is no available mechanism for doing so.
*/
IoTest.prototype.testDom_NoParser = function() {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("contentType", "DOM");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : '<wrapper><text>some text</text></wrapper>',
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
{
"CONTENT_TYPE" : "DOM"
});
this.assertEquals(500, resp.rc);
this.assertEquals(["500 Failed to parse XML because no DOM parser was available"], resp.errors);
};
IoTest.prototype.testPreload = function() {
gadgets.io.preloaded_ = [
{
"id": "http://target.example.com/somepage",
"rc" : 200,
"body" : "preloadedbody",
"headers": {
"set-cookie": ["foo=bar","baz=quux"],
"location": ["somewhere"]
}
}
];
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals("preloadedbody", resp.text);
this.assertEquals("somewhere", resp.headers["location"][0]);
this.assertEquals("foo=bar", resp.headers["set-cookie"][0]);
this.assertEquals("baz=quux", resp.headers["set-cookie"][1]);
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : 'not preloaded',
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals("not preloaded", resp.text);
};
IoTest.prototype.testPreloadMiss_postRequest = function() {
gadgets.io.preloaded_ = [
{
"id": "http://target.example.com/somepage",
"rc" : 200,
"body" : "preloadedbody"
}
];
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("httpMethod", "POST");
req.setBodyArg("postData", "foo=bar");
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("refresh", null);
req.setBodyArg("headers", "Content-Type=application%2fx-www-form-urlencoded");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
params[gadgets.io.RequestParameters.METHOD] = "POST";
params[gadgets.io.RequestParameters.POST_DATA] = "foo=bar";
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPreloadMiss_wrongUrl = function() {
gadgets.io.preloaded_ = [
{
"id": "http://target.example.com/somepage2",
"rc" : 200,
"body" : "preloadedbody"
}
];
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
var params = {};
gadgets.io.makeRequest(
"http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testPreload_error404 = function() {
gadgets.io.preloaded_ = [
{
"id": "http://target.example.com/somepage",
"rc" : 404
}
];
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : 'not preloaded',
'rc' : 200
}
}));
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals("404 Error", resp.errors[0]);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
});
this.assertEquals("not preloaded", resp.text);
};
IoTest.prototype.testPreload_oauthApproval = function() {
gadgets.io.clearOAuthState();
gadgets.io.preloaded_ = [
{
"id": "http://target.example.com/somepage",
"rc" : 200,
"oauthState" : "stateinfo",
"oauthApprovalUrl" : "http://example.com/approve"
}
];
var req = new fakeXhr.Expectation("POST", "http://example.com/json");
this.setStandardArgs(req, true);
req.setBodyArg("url", "http://target.example.com/somepage");
req.setBodyArg("authz", "oauth");
req.setBodyArg("st", "authtoken");
req.setBodyArg("refresh", null);
req.setBodyArg("oauthState", "stateinfo");
req.setHeader("Content-Type", "application/x-www-form-urlencoded");
var resp = this.makeFakeResponse(gadgets.json.stringify(
{ 'http://target.example.com/somepage' : {
'body' : 'not preloaded',
'rc' : 200
}
}
));
this.fakeXhrs.expect(req, resp);
var params = {};
params["AUTHORIZATION"] = "OAUTH";
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("http://example.com/approve", resp.oauthApprovalUrl);
gadgets.io.makeRequest("http://target.example.com/somepage",
function(data) {
resp = data;
},
params);
this.assertEquals("not preloaded", resp.text);
};
IoTest.prototype.testNoCacheOnUrlParam = function () {
this.getUrlParameters = gadgets.util.getUrlParameters;
gadgets.util.getUrlParameters = function () {
return { "st": "authtoken", "url": "http://www.gadget.com/gadget.xml", "container": "foo",
"nocache": "1"};
};
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("bypassSpecCache", "1");
req.setQueryArg("nocache", "1");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
gadgets.io.makeRequest("http://target.example.com/somepage",
function (data) {
resp = data;
});
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testNoCacheOnRequestParam = function () {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
req.setQueryArg("nocache", "1");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
params = {};
params[gadgets.io.RequestParameters.NO_CACHE] = 1;
gadgets.io.makeRequest("http://target.example.com/somepage",
function (data) {
resp = data;
}, params);
this.assertEquals('some data', resp.text);
};
IoTest.prototype.testNoNoCache = function () {
var req = new fakeXhr.Expectation("GET", "http://example.com/json");
this.setStandardArgs(req, false);
req.setQueryArg("url", "http://target.example.com/somepage");
var resp = this.makeFakeResponse(
"{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}");
this.fakeXhrs.expect(req, resp);
var resp = null;
params = {};
gadgets.io.makeRequest("http://target.example.com/somepage",
function (data) {
resp = data;
}, params);
this.assertEquals('some data', resp.text);
this.assertUndefined(resp.nocache);
};