44186edbc5
The old loadSettings.js was a way of customizing settings upon load, because the Settings module did not offer this functionality. But it did not work well, since all the default settings were not loaded. Let's get rid of loadSettings.js for the bulk of the tests (the "backend" specs). For the "container" specs, we'll keep it in place until/if we rewrite Settings.js making it less brittle.
79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
/**
|
|
* API specs
|
|
*
|
|
* Tests for generic overarching HTTP API related features not related to any
|
|
* specific part of the data model or domain. For example: tests for versioning
|
|
* and openapi definitions.
|
|
*/
|
|
|
|
const assert = require('assert');
|
|
const supertest = require(__dirname + '/../../../../src/node_modules/supertest');
|
|
const fs = require('fs');
|
|
const settings = require(__dirname + '/../../../../src/node/utils/Settings');
|
|
const api = supertest('http://' + settings.ip + ':' + settings.port);
|
|
const path = require('path');
|
|
|
|
var validateOpenAPI = require(__dirname + '/../../../../src/node_modules/openapi-schema-validation').validate;
|
|
|
|
var filePath = path.join(__dirname, '../../../../APIKEY.txt');
|
|
|
|
var apiKey = fs.readFileSync(filePath, { encoding: 'utf-8' });
|
|
apiKey = apiKey.replace(/\n$/, '');
|
|
var apiVersion = 1;
|
|
|
|
var testPadId = makeid();
|
|
|
|
describe('API Versioning', function() {
|
|
it('errors if can not connect', function(done) {
|
|
api
|
|
.get('/api/')
|
|
.expect(function(res) {
|
|
apiVersion = res.body.currentVersion;
|
|
if (!res.body.currentVersion) throw new Error('No version set in API');
|
|
return;
|
|
})
|
|
.expect(200, done);
|
|
});
|
|
});
|
|
|
|
describe('OpenAPI definition', function() {
|
|
it('generates valid openapi definition document', function(done) {
|
|
api
|
|
.get('/api/openapi.json')
|
|
.expect(function(res) {
|
|
const { valid, errors } = validateOpenAPI(res.body, 3);
|
|
if (!valid) {
|
|
const prettyErrors = JSON.stringify(errors, null, 2);
|
|
throw new Error(`Document is not valid OpenAPI. ${errors.length} validation errors:\n${prettyErrors}`);
|
|
}
|
|
return;
|
|
})
|
|
.expect(200, done);
|
|
});
|
|
});
|
|
|
|
describe('jsonp support', function() {
|
|
it('supports jsonp calls', function(done) {
|
|
api
|
|
.get(endPoint('createPad') + '&jsonp=jsonp_1&padID=' + testPadId)
|
|
.expect(function(res) {
|
|
if (!res.text.match('jsonp_1')) throw new Error('no jsonp call seen');
|
|
})
|
|
.expect('Content-Type', /javascript/)
|
|
.expect(200, done);
|
|
});
|
|
});
|
|
|
|
var endPoint = function(point) {
|
|
return '/api/' + apiVersion + '/' + point + '?apikey=' + apiKey;
|
|
};
|
|
|
|
function makeid() {
|
|
var text = '';
|
|
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
|
|
for (var i = 0; i < 5; i++) {
|
|
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
}
|
|
return text;
|
|
}
|