The discovery endpoint provides basic information about accessing the wiki's APIs, as well as a directory of available modules. Bug: T365753 Change-Id: I161aa68566da91867b650e13c8aadc87cd0c428c
101 lines
3.1 KiB
JavaScript
101 lines
3.1 KiB
JavaScript
'use strict';
|
|
|
|
const { assert, REST } = require( 'api-testing' );
|
|
const SwaggerParser = require( '@apidevtools/swagger-parser' );
|
|
const request = require( 'superagent' );
|
|
|
|
describe( 'Self-Documentation', () => {
|
|
const client = new REST( 'rest.php/specs/v0' );
|
|
|
|
describe( 'OpenAPI module specs', () => {
|
|
it( 'Conforms to the OpenAPI schema', async () => {
|
|
// NOTE: the module prefix "-" can be used to get a spec for the empty prefix
|
|
const { status, body, text } = await client.get( '/module/-' );
|
|
assert.deepEqual( status, 200, text );
|
|
|
|
try {
|
|
await SwaggerParser.validate( body, {
|
|
continueOnError: false,
|
|
parse: {
|
|
json: false,
|
|
yaml: false,
|
|
text: false
|
|
},
|
|
resolve: {
|
|
file: false,
|
|
http: false
|
|
},
|
|
dereference: {
|
|
circular: false
|
|
},
|
|
validate: {
|
|
spec: true
|
|
}
|
|
} );
|
|
} catch ( err ) {
|
|
assert.fail( err.message );
|
|
}
|
|
} );
|
|
|
|
it( 'Returns sensible meta-data', async () => {
|
|
const { body: spec } = await client.get( '/module/-' );
|
|
assert.nestedProperty( spec, 'info' );
|
|
assert.nestedProperty( spec, 'servers' );
|
|
assert.isDefined( spec.servers[ 0 ], 'first server' );
|
|
assert.nestedProperty( spec.servers[ 0 ], 'url' );
|
|
|
|
// Ensure that the server URL points to the same API root again, so we can load
|
|
// the same swagger spec from it.
|
|
const url = spec.servers[ 0 ].url + '/specs/v0/module/-';
|
|
const { status, body: spec2, text } = await request( url );
|
|
assert.deepEqual( status, 200, text );
|
|
|
|
assert.nestedProperty( spec2, 'openapi' );
|
|
assert.nestedProperty( spec2, 'info' );
|
|
assert.deepEqual( spec2.info, spec.info );
|
|
assert.deepEqual( spec2.servers, spec.servers );
|
|
} );
|
|
} );
|
|
|
|
describe( 'discovery document', () => {
|
|
it( 'contains basic info', async () => {
|
|
const { body: ddoc } = await client.get( '/discovery' );
|
|
assert.nestedProperty( ddoc, 'info' );
|
|
|
|
const { info } = ddoc;
|
|
assert.nestedProperty( info, 'title' );
|
|
assert.nestedProperty( info, 'license' );
|
|
assert.nestedProperty( info.license, 'url' );
|
|
assert.nestedProperty( info, 'contact' );
|
|
assert.nestedProperty( info.contact, 'email' );
|
|
} );
|
|
|
|
it( 'contains module list', async () => {
|
|
const { body: ddoc } = await client.get( '/discovery' );
|
|
assert.nestedProperty( ddoc, 'modules' );
|
|
|
|
const { modules: dir } = ddoc;
|
|
for ( const id in dir ) {
|
|
const module = dir[ id ];
|
|
assert.nestedProperty( module, 'base' );
|
|
assert.nestedProperty( module, 'spec' );
|
|
}
|
|
} );
|
|
|
|
it( 'contains usable servers', async () => {
|
|
const { body: ddoc } = await client.get( '/discovery' );
|
|
assert.nestedProperty( ddoc, 'servers' );
|
|
assert.isDefined( ddoc.servers[ 0 ], 'first server' );
|
|
|
|
const server = ddoc.servers[ 0 ];
|
|
assert.nestedProperty( server, 'url' );
|
|
|
|
// Ensure that the server URL points to the same API root again,
|
|
// so we can load the same discovery document from it.
|
|
const url = server.url + '/specs/v0/discovery';
|
|
const { status, body: ddoc2, text } = await request( url );
|
|
assert.deepEqual( status, 200, url + '\n' + text );
|
|
assert.deepEqual( ddoc2, ddoc );
|
|
} );
|
|
} );
|
|
} );
|