blob: 9aa64af2b0a4f21996859ad0c00c8de7cfcf2728 [file] [log] [blame]
/*
* Copyright 2010-2011 Research In Motion Limited.
*
* Licensed 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 ROOT = "../../../";
describe("server", function () {
var server = require(ROOT + "lib/server"),
plugin = require(ROOT + "lib/plugins/default"),
applicationAPIServer,
utils,
DEFAULT_SERVICE = "default",
DEFAULT_ACTION = "exec",
config = {};
beforeEach(function () {
applicationAPIServer = {
getReadOnlyFields: function () {}
};
delete require.cache[require.resolve(ROOT + "lib/utils")];
utils = require("../../../lib/utils");
spyOn(utils, "loadModule").andCallFake(function (module) {
if (module.indexOf("plugin/") >= 0) {
// on device, "plugin/blackberry.app/index.js" would exist
return applicationAPIServer;
} else {
return require("../../../lib/" + module);
}
});
});
describe("when handling requests", function () {
var req, res;
beforeEach(function () {
req = {
params: {
service: "",
action: ""
},
body: "",
origin: ""
};
res = {
send: jasmine.createSpy()
};
GLOBAL.frameworkModules = ['plugin/blackberry.app/index.js', 'lib/plugins/default.js'];
});
afterEach(function () {
delete GLOBAL.frameworkModules;
});
it("calls the default plugin if the service doesn't exist", function () {
var rebuiltRequest = {
params: {
service: DEFAULT_SERVICE,
action: DEFAULT_ACTION,
ext: "not",
method: "here",
args: null
},
body: "",
origin: ""
},
webview = {};
spyOn(plugin, DEFAULT_ACTION);
req.params.service = "not";
req.params.action = "here";
server.handle(req, res, webview, config);
expect(plugin[DEFAULT_ACTION]).toHaveBeenCalledWith(
rebuiltRequest, jasmine.any(Function),
jasmine.any(Function),
rebuiltRequest.params.args,
{
request: rebuiltRequest,
response: res,
webview: webview,
config: config
}
);
});
it("returns 404 if the action doesn't exist", function () {
req.params.service = "default";
req.params.action = "ThisActionDoesNotExist";
spyOn(console, "error");
server.handle(req, res);
expect(res.send).toHaveBeenCalledWith(404, jasmine.any(String));
expect(console.error).toHaveBeenCalled();
});
it("calls the action method on the plugin", function () {
var webview = "BLAHBLAHBLAH";
spyOn(plugin, "exec");
req.params.service = "default";
req.params.action = "exec";
expect(function () {
return server.handle(req, res, webview, config);
}).not.toThrow();
expect(plugin.exec).toHaveBeenCalledWith(
req,
jasmine.any(Function),
jasmine.any(Function),
req.params.args,
{
request: req,
response: res,
webview: webview,
config: config
});
});
it("parses url encoded args", function () {
var webview = "BLAHBLAHBLAH";
spyOn(plugin, "exec");
expect(function () {
req.params.service = "default";
req.params.action = "exec";
req.params.args = "a=1&b=2&c=3";
return server.handle(req, res, webview);
}).not.toThrow();
expect(plugin.exec).toHaveBeenCalledWith(
jasmine.any(Object),
jasmine.any(Function),
jasmine.any(Function),
{
a: '1',
b: '2',
c: '3'
},
jasmine.any(Object)
);
});
it("parses url encoded args", function () {
var webview = "BLAHBLAHBLAH";
spyOn(plugin, "exec");
expect(function () {
req.params.service = "default";
req.params.action = "exec";
req.body = JSON.stringify({a: '1', b: '2', c: '3'});
return server.handle(req, res, webview);
}).not.toThrow();
expect(plugin.exec).toHaveBeenCalledWith(
jasmine.any(Object),
jasmine.any(Function),
jasmine.any(Function),
{
a: '1',
b: '2',
c: '3'
},
jasmine.any(Object)
);
});
it("returns the result and code 1 when success callback called", function () {
spyOn(plugin, "exec").andCallFake(function (request, succ, fail, body) {
succ(["MyFeatureId"]);
});
req.params.service = "default";
req.params.action = "exec";
server.handle(req, res);
expect(res.send).toHaveBeenCalledWith(200, encodeURIComponent(JSON.stringify({
code: 1,
data: ["MyFeatureId"],
keepCallback: false
})));
});
it("returns the result and code 9 when fail callback called", function () {
spyOn(plugin, "exec").andCallFake(function (request, succ, fail, body) {
fail("ErrorMessage");
});
req.params.service = "default";
req.params.action = "exec";
server.handle(req, res);
expect(res.send).toHaveBeenCalledWith(200, encodeURIComponent(JSON.stringify({
code: 9,
data: "ErrorMessage",
keepCallback: false
})));
});
});
describe("when handling feature requests", function () {
var req, res;
beforeEach(function () {
req = {
params: {
service: "default",
action: "exec",
ext: "blackberry.app",
method: "getReadOnlyFields",
args: null
},
headers: {
host: ""
},
url: "",
body: "",
origin: ""
};
res = {
send: jasmine.createSpy()
};
GLOBAL.frameworkModules = ['plugin/blackberry.app/index.js', 'lib/plugins/default.js'];
});
afterEach(function () {
delete GLOBAL.frameworkModules;
});
it("calls the action method on the feature", function () {
var webview = {};
spyOn(applicationAPIServer, "getReadOnlyFields");
server.handle(req, res, webview, config);
expect(applicationAPIServer.getReadOnlyFields).toHaveBeenCalledWith(
jasmine.any(Function),
jasmine.any(Function),
req.params.args,
{
request: req,
response: res,
webview: webview,
config: config
}
);
});
it("returns the result and code 1 when success callback called", function () {
var expectedResult = {"getReadOnlyFields": "Yogi bear"};
spyOn(applicationAPIServer, "getReadOnlyFields").andCallFake(function (success, fail) {
success(expectedResult);
});
server.handle(req, res);
expect(res.send).toHaveBeenCalledWith(200, encodeURIComponent(JSON.stringify({
code: 1,
data: expectedResult,
keepCallback: false
})));
});
it("returns the result and code 9 when fail callback called", function () {
var expectedResult = "omg";
spyOn(applicationAPIServer, "getReadOnlyFields").andCallFake(function (success, fail) {
fail(expectedResult);
});
server.handle(req, res);
expect(res.send).toHaveBeenCalledWith(200, encodeURIComponent(JSON.stringify({
code: 9,
data: expectedResult,
keepCallback: false
})));
});
});
});