From: Jeremy Tan Date: Thu, 29 Aug 2013 01:32:35 +0000 (+0800) Subject: Switch back to HTTP status codes for fastcgi + update unit tests X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=e1c7bd0681eb69d01d189889b4a0f8e4efd43f1f;p=matches%2FMCTX3420.git Switch back to HTTP status codes for fastcgi + update unit tests --- diff --git a/nginx-configs/sites-enabled/mctxconfig b/nginx-configs/sites-enabled/mctxconfig index 541f6d1..dfdf2b9 100644 --- a/nginx-configs/sites-enabled/mctxconfig +++ b/nginx-configs/sites-enabled/mctxconfig @@ -70,18 +70,17 @@ server { deny all; } - #Login area - location ^~ /api/login { - auth_basic "Restricted Access"; - auth_basic_user_file /usr/share/nginx/access/.htpasswd; - - fastcgi_pass 127.0.0.1:9005; - fastcgi_param DOCUMENT_URI_LOCAL login; - include fastcgi_params; - } - #MCTX API location /api { + #Login area + location ^~ /api/login { + auth_basic "Restricted Access"; + auth_basic_user_file /usr/share/nginx/access/.htpasswd; + + fastcgi_pass 127.0.0.1:9005; + fastcgi_param DOCUMENT_URI_LOCAL login; + include fastcgi_params; + } location ~ ^/api/?([^?]*) { fastcgi_pass 127.0.0.1:9005; fastcgi_param DOCUMENT_URI_LOCAL $1; diff --git a/server/fastcgi.h b/server/fastcgi.h index 1efdef7..3030b75 100644 --- a/server/fastcgi.h +++ b/server/fastcgi.h @@ -6,11 +6,11 @@ #ifndef _FASTCGI_H #define _FASTCGI_H -/**Status codes that fcgi module handlers can return**/ +/**(HTTP) Status codes that fcgi module handlers can return**/ typedef enum StatusCodes { - STATUS_OK = 0, - STATUS_ERROR = -1, - STATUS_UNAUTHORIZED = -2 + STATUS_OK = 200, + STATUS_ERROR = 400, + STATUS_UNAUTHORIZED = 401 } StatusCodes; typedef struct FCGIContext FCGIContext; diff --git a/testing/qunit/index.html b/testing/qunit/index.html index 4f4dcfe..e666fce 100644 --- a/testing/qunit/index.html +++ b/testing/qunit/index.html @@ -4,12 +4,12 @@ MCTX3420 2013 Server API unit tests - + + +
- - \ No newline at end of file diff --git a/testing/qunit/unit-tests.js b/testing/qunit/unit-tests.js index c16b8c9..8aec28f 100644 --- a/testing/qunit/unit-tests.js +++ b/testing/qunit/unit-tests.js @@ -11,14 +11,31 @@ var api = location.protocol + "//" + location.host + "/api/"; /** * Sends an AJAX query to the API + * query(module, username, password, callback); + * query(module, callback); + * query(module, opts, callback); + * query(module, opts, username, password, callback); * @param {string} module The name of the module to be queried * @param {Object} opts Object containing parameters to pass to module - * @param {function} callback Function that receives JSON data * @param {string} username Optional * @param {string} password Required if username specified + * @param {function} callback Function that receives JSON data * @returns JSON data */ -function query(module, opts, callback, username, password) { +function query(module, opts, username, password, callback) { + if (typeof opts === 'string') { + callback = password; + password = username; + username = opts; + opts = undefined; + } else if (typeof opts === 'function') { + callback = opts; + opts = undefined; + } else if (typeof username === 'function') { + callback = username; + username = undefined; + } + function buildQuery(opts) { var result = "?"; var first = true; @@ -38,34 +55,58 @@ function query(module, opts, callback, username, password) { if (opts) queryurl += buildQuery(opts); + var authfunc; + if (username) { + authfunc = function(xhr) { + xhr.setRequestHeader("Authorization", + "Basic " + btoa(username + ":" + password)); + }; + } + $.ajax({ url: queryurl, type: 'GET', dataType: 'json', - beforeSend: !username ? undefined : function (xhr) { - xhr.setRequestHeader("Authorization", - "Basic " + btoa(username + ":" + password)); - } + beforeSend: authfunc }).done(callback) .fail(function(jqXHR) { - if (jqXHR.status === 400) { - callback($.parseJSON(jqXHR.responseText)); + //Note:Callback must be called so the QUnit test can run. + if (jqXHR.status !== 400) { + callback({"status" : jqXHR.status, "description" : jqXHR.statusText}); } else { - callback({status:-999, - description: jqXHR.status.toString() + " " + jqXHR.responseText}); + try { + callback($.parseJSON(jqXHR.responseText)); + } catch (err) { + callback({"status" : jqXHR.status, "description" : jqXHR.statusText}); + } } }); } -QUnit.test("API Existence", function () { - stop(); //????? - query("test", undefined, function(data) { - equal(parseInt(data.status, 10), -1, "Nonexistent module"); //Magic numbers! + +QUnit.asyncTest("API Existence", function () { + query("test", function(data) { + start(); + //TODO:Change fastcgi error codes + equal(parseInt(data.status, 10), 400, "Nonexistent module"); //Magic numbers! + }); +}); + +QUnit.asyncTest("Login test", function() { + query("login", {"force" : true}, "mctxadmin", "admin", function(data) { start(); - }); + equal(parseInt(data.status, 10), 200, "Login ok"); //Magic numbers! + }); +}); + +QUnit.test("Sensors module", function() { + +}); + +/*QUnit.test("Login module", function () { + +});*/ - /*query("version", undefined, function (data) { - assert.equal(data.status, 0); - });*/ +QUnit.test("Access control", function () { }); \ No newline at end of file