Add unit tests for config.json and statistics.js
[WebKit.git] / Websites / perf.webkit.org / unit-tests / checkconfig.js
1 "use strict";
2
3 var assert = require('assert');
4 var fs = require('fs');
5 var pg = require('pg');
6
7 var Config = require('../tools/js/config.js');
8 var Database = require('../tools/js/database.js');
9
10 describe('config.json', function () {
11     it('should be a valid file', function () {
12         assert.doesNotThrow(function () {
13             fs.readFileSync(Config.configFilePath())
14         });
15     });
16
17     it('should be a valid JSON', function () {
18         assert.doesNotThrow(function () {
19             JSON.parse(fs.readFileSync(Config.configFilePath()));
20         });
21     });
22
23     it('should define `siteTitle`', function () {
24         assert.equal(typeof Config.value('siteTitle'), 'string');
25     });
26
27     it('should define `dataDirectory`', function () {
28         assert.ok(Config.value('dataDirectory'));
29         assert.ok(fs.existsSync(Config.path('dataDirectory')));
30         assert.ok(fs.statSync(Config.path('dataDirectory')).isDirectory());
31     });
32
33     it('should define `jsonCacheMaxAge`', function () {
34         assert.equal(typeof Config.value('jsonCacheMaxAge'), 'number');
35     });
36
37     it('should define `jsonCacheMaxAge`', function () {
38         assert.equal(typeof Config.value('jsonCacheMaxAge'), 'number');
39     });
40
41     it('should define `clusterStart`', function () {
42         var clusterStart = Config.value('clusterStart');
43         assert.ok(clusterStart instanceof Array);
44         assert.equal(clusterStart.length, [2000, 1, 1, 0, 0].length,
45             'Must specify year, month, date, hour, and minute');
46         var maxYear = (new Date).getFullYear() + 1;
47         assert.ok(clusterStart[0] >= 1970 && clusterStart[0] <= maxYear, `year must be between 1970 and ${maxYear}`);
48         assert.ok(clusterStart[1] >= 1 && clusterStart[1] <= 12, 'month must be between 1 and 12');
49         assert.ok(clusterStart[2] >= 1 && clusterStart[2] <= 31, 'date must be between 1 and 31');
50         assert.ok(clusterStart[3] >= 0 && clusterStart[3] <= 60, 'minute must be between 0 and 60');
51         assert.ok(clusterStart[4] >= 0 && clusterStart[4] <= 60, 'minute must be between 0 and 60');
52     });
53
54     it('should define `clusterSize`', function () {
55         var clusterSize = Config.value('clusterSize');
56         assert.ok(clusterSize instanceof Array);
57         assert.equal(clusterSize.length, [0, 2, 0].length,
58             'Must specify the number of years, months, and days');
59         assert.equal(typeof clusterSize[0], 'number', 'the number of year must be a number');
60         assert.equal(typeof clusterSize[1], 'number', 'the number of month must be a number');
61         assert.equal(typeof clusterSize[2], 'number', 'the number of days must be a number');
62     });
63
64     describe('`dashboards`', function () {
65         var dashboards = Config.value('dashboards');
66
67         it('should exist for v2 and v3 UI', function () {
68             assert.equal(typeof dashboards, 'object');
69         });
70
71         it('dashboard names that do not contain /', function () {
72             for (var name in dashboards)
73                 assert.ok(name.indexOf('/') < 0, 'Dashboard name "${name}" should not contain "/"');
74         });
75
76         it('each dashboard must be an array', function () {
77             for (var name in dashboards)
78                 assert.ok(dashboards[name] instanceof Array);
79         });
80
81         it('each row in a dashboard must be an array', function () {
82             for (var name in dashboards) {
83                 for (var row of dashboards[name]) {
84                     console.assert(row instanceof Array);
85                 }
86             }
87         });
88
89         it('each cell in a dashboard must be an array or a string', function () {
90             for (var name in dashboards) {
91                 for (var row of dashboards[name]) {
92                     for (var cell of row) {
93                         if (cell instanceof Array)
94                             assert.ok(cell.length == 0 || cell.length == 2,
95                                 'Each cell must be empty or specify [platform, metric] pair');
96                         else
97                             assert.equal(typeof cell, 'string');
98                     }
99                 }
100             }
101         });
102
103     });
104
105     describe('`database`', function () {
106         it('should exist', function () {
107             assert.ok(Config.value('database'));
108         });
109
110         it('should define `database.host`', function () {
111             assert.equal(typeof Config.value('database.host'), 'string');
112         });
113
114         it('should define `database.port`', function () {
115             assert.equal(typeof Config.value('database.port'), 'string');
116         });
117
118         it('should define `database.username`', function () {
119             assert.equal(typeof Config.value('database.username'), 'string');
120         });
121
122         it('should define `database.password`', function () {
123             assert.equal(typeof Config.value('database.password'), 'string');
124         });
125
126         it('should define `database.name`', function () {
127             assert.equal(typeof Config.value('database.name'), 'string');
128         });
129
130         it('should be able to connect to the database', function (done) {
131             let database = new Database;
132             return database.connect().then(function () {
133                 database.disconnect();
134                 done();
135             }, function (error) {
136                 database.disconnect();
137                 done(error);
138             });
139         });
140     });
141
142     describe('optional configurations', function () {
143         function assertNullOrType(value, type) {
144             if (value !== null)
145                 assert.equal(typeof value, type);
146         }
147
148         it('`debug` should be `null` or a boolean', function () {
149             assertNullOrType(Config.value('debug'), 'boolean');
150         });
151
152         it('`maintenanceMode` should be `null` or a boolean', function () {
153             assertNullOrType(Config.value('maintenanceMode'), 'boolean');
154         });
155
156         it('`maintenanceDirectory` should be `null` or a string', function () {
157             assertNullOrType(Config.value('maintenanceDirectory'), 'string');
158         });
159
160         it('`maintenanceDirectory` should be a string if `maintenanceMode` is true', function () {
161             if (Config.value('maintenanceMode'))
162                 assert.equal(Config.value('maintenanceDirectory'), 'string');
163         });
164
165         it('`universalSlavePassword` should be `null` or a string', function () {
166             assertNullOrType(Config.value('universalSlavePassword'), 'string');
167         });
168     });
169 });