Change @purpose to @brief (Doxygen warning) and work on unit tests
[matches/MCTX3420.git] / testing / qunit / unit-tests.js
1 /**
2  * MCTX3420 2013 - Remote pressurised can experiment.
3  * Unit testing for the server API.
4  * These unit tests use the QUnit unit testing framework.
5  * @requires QUnit, jQuery, and base64.js
6  * @date 28/8/13
7  * @author Jeremy Tan
8  */
9
10 //Namespace ut
11
12 ut = {};
13 ut.api = location.protocol + "//" +  location.host + "/api/";
14 ut.ckey = undefined;
15 ut.controlcb = $.Callbacks();
16
17 /**
18  * Sends an AJAX query to the API
19  * @param {string} module The name of the module to be queried
20  * @param {Object} opts Object holding the parameters, username, password and
21  *                 callback. The parameters should be an object of key/value
22  *                 pairs.
23  * @returns jqXHR object (but calls callback with JSON data, or null on AJAX error)
24  */
25 function query(module, opts) {
26   var queryurl = ut.api + module;
27   
28   var authfunc;
29   if (opts.username) {
30     authfunc = function(xhr) {
31       xhr.setRequestHeader("Authorization",
32         "Basic " + base64.encode(opts.username + ":" + opts.password));
33     };
34   }
35   
36   return $.ajax({
37     url: queryurl,
38     type: 'GET',
39     dataType: 'json',
40     data: opts.params,
41     beforeSend: authfunc,
42     async: opts.async
43   }).done(opts.callback)
44     .fail(function(jqXHR) {
45       ok(false, "Request failed: " + jqXHR.status.toString() + " " + jqXHR.statusText);
46       opts.callback(null);
47     });
48 }
49
50 QUnit.module("API basics");
51 QUnit.asyncTest("API Existence (identify)", function () {
52   query("identify", {callback : function(data) {
53    start();
54    ok(data.status > 0, "Return status");
55    ok(data.description, data.description);
56    ok(data.build_date, data.build_date);
57   }});
58 });
59
60 QUnit.asyncTest("Invalid module", function () {
61   query("dontexist", {callback : function(data) {
62    start();
63    ok(data.status < 0);
64   }});
65 });
66
67 QUnit.module("Sensors");
68 QUnit.asyncTest("Existence", function() {
69   query("sensors", {params : {id : 0}, callback : function(data) {
70    start();
71    ok(data.status > 0, "Return status");
72    ok(data.data !== undefined, "Data field existence");
73    var result = "Data: ";
74    for (var i = 0; i < data.data.length; i++) {
75      result += data.data[i][0]  + ":" + data.data[i][1] + ", ";
76    }
77    ok(true, result);
78   }});  
79 });
80
81 QUnit.asyncTest("Invalid sensor id 1", function() {
82   query("sensors", {params : {id : 999}, callback : function(data) {
83    start();
84    ok(data.status < 0, "Return status");
85   }});  
86 });
87
88 QUnit.asyncTest("Invalid sensor id 2", function() {
89   query("sensors", {params : {id : ""}, callback : function(data) {
90    start();
91    ok(data.status < 0, "Return status");
92   }});  
93 });
94
95 QUnit.asyncTest("Out of bounds sensor id 1", function() {
96   query("sensors", {params : {id : "-1"}, callback : function(data) {
97    start();
98    ok(data.status < 0, "Return status");
99   }});  
100 });
101
102 QUnit.asyncTest("Out of bounds sensor id 2", function() {
103   query("sensors", {params : {id : "999"}, callback : function(data) {
104    start();
105    ok(data.status < 0, "Return status");
106   }});  
107 });
108
109 QUnit.module("Controls and access");
110 QUnit.asyncTest("Gaining access", function() {
111   ut.controlcb.add(function () {
112     query("control", {params : {action : "start", force : true}, 
113                     username : $("#username").val(), password : $("#password").val(),
114                     async : false, 
115                     callback : function(data) {
116      start();
117      ok(data.status > 0, "Return status");
118      ut.ckey = data.key;
119     }});
120   });
121 });
122
123 QUnit.asyncTest("Setting actuator value", function () {
124   ut.controlcb.add(function () {
125     query("control", {params : {action : "set", id : 0,
126           username : $("#username").val(), password : $("#password").val(),
127           value : 200, key : ut.ckey},
128         callback : function(data) {
129           start();
130           ok(data.status > 0, "Return status");
131           ok(true, data.description);
132     }});
133   });
134 });
135
136 $(document).ready(function(){
137   $("#control").submit(function () {
138     ut.controlcb.fire();
139     return false;
140   });
141 });

UCC git Repository :: git.ucc.asn.au