mirror of
https://github.com/Redocly/redoc.git
synced 2025-03-03 09:25:47 +03:00
Redesigned specs + finish schemaManager spec
This commit is contained in:
parent
ddbad9bfd3
commit
d2d856067b
67
tests/schemas/schema-mgr-methodparams.json
Normal file
67
tests/schemas/schema-mgr-methodparams.json
Normal file
|
@ -0,0 +1,67 @@
|
|||
{
|
||||
"swagger": "2.0",
|
||||
"info": {
|
||||
"version": "1.0.0",
|
||||
"title": "Test schema"
|
||||
},
|
||||
"host": "petstore.swagger.io",
|
||||
"basePath": "/v2/",
|
||||
"parameters": {
|
||||
"extparam": {
|
||||
"name": "extParam",
|
||||
"in": "query",
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"paths": {
|
||||
"test1": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "pathParam",
|
||||
"in": "path",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"get": {
|
||||
"summary": "test get",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "methodParam",
|
||||
"in": "path",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"test2": {
|
||||
"parameters": [
|
||||
{ "$ref": "#/parameters/extparam" }
|
||||
],
|
||||
"get": {
|
||||
"summary": "test get",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "methodParam",
|
||||
"in": "path",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"test3": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "pathParam",
|
||||
"in": "path",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"get": {
|
||||
"summary": "test get",
|
||||
"parameters": [
|
||||
{ "$ref": "#/parameters/extparam" }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,126 +1,202 @@
|
|||
'use strict';
|
||||
|
||||
import SchemaManager from 'lib/utils/SchemaManager';
|
||||
describe("Schema manager", () => {
|
||||
describe('Schema manager', () => {
|
||||
let schemaMgr;
|
||||
|
||||
beforeEach(() => {
|
||||
schemaMgr = new SchemaManager();
|
||||
});
|
||||
|
||||
it("Should initialize with empty schema", ()=> {
|
||||
it('Should initialize with empty schema', ()=> {
|
||||
schemaMgr.schema.should.be.empty;
|
||||
});
|
||||
|
||||
it("Should be a singleton", ()=> {
|
||||
it('Should be a singleton', ()=> {
|
||||
(new SchemaManager()).should.be.equal(schemaMgr);
|
||||
});
|
||||
|
||||
it("load should return a promise", ()=> {
|
||||
it('load should return a promise', ()=> {
|
||||
schemaMgr.load('/tests/schemas/extended-petstore.json').should.be.instanceof(Promise);
|
||||
});
|
||||
|
||||
it("load should resolve promise for valid url", (done)=> {
|
||||
it('load should resolve promise for valid url', (done)=> {
|
||||
schemaMgr.load('/tests/schemas/extended-petstore.json').then(() => {
|
||||
done();
|
||||
}, (err) => {
|
||||
throw new Error("Error handler should not be called")
|
||||
}, () => {
|
||||
throw new Error('Error handler should not be called');
|
||||
});
|
||||
});
|
||||
|
||||
describe("Schema manager with loaded schema", ()=> {
|
||||
describe('Schema manager basic functionality', ()=> {
|
||||
before(function (done) {
|
||||
schemaMgr.load('/tests/schemas/extended-petstore.json').then(() => {
|
||||
done();
|
||||
}, (err) => {
|
||||
throw new Error("Error handler should not be called")
|
||||
}, () => {
|
||||
throw new Error('Error handler should not be called');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it("should contain non-empty schema", ()=> {
|
||||
schemaMgr.schema.should.be.an("object");
|
||||
it('should contain non-empty schema', ()=> {
|
||||
schemaMgr.schema.should.be.an('object');
|
||||
schemaMgr.schema.should.be.not.empty;
|
||||
});
|
||||
|
||||
it("should correctly init api url", ()=> {
|
||||
schemaMgr.apiUrl.should.be.equal("http://petstore.swagger.io/v2");
|
||||
it('should correctly init api url', ()=> {
|
||||
schemaMgr.apiUrl.should.be.equal('http://petstore.swagger.io/v2');
|
||||
});
|
||||
|
||||
describe("byPointer method", () => {
|
||||
it("should return correct schema part", ()=> {
|
||||
describe('byPointer method', () => {
|
||||
it('should return correct schema part', ()=> {
|
||||
let part = schemaMgr.byPointer('/tags/3');
|
||||
part.should.be.deep.equal(schemaMgr.schema.tags[3]);
|
||||
part.should.be.equal(schemaMgr.schema.tags[3]);
|
||||
});
|
||||
|
||||
it("should return null for incorrect pointer", ()=> {
|
||||
it('should return null for incorrect pointer', ()=> {
|
||||
let part = schemaMgr.byPointer('/incorrect/pointer');
|
||||
should.not.exist(part);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("getTagsMap method", () => {
|
||||
it("should return correct tags map", () => {
|
||||
let tagsMap = schemaMgr.getTagsMap();
|
||||
let i = 0;
|
||||
let origTags = schemaMgr.schema.tags;
|
||||
|
||||
origTags.length.should.be.equal(Object.keys(tagsMap).length);
|
||||
for (let tagName of Object.keys(tagsMap)) {
|
||||
tagName.should.be.equal(origTags[i].name);
|
||||
tagsMap[tagName].description.should.be.equal(origTags[i].description);
|
||||
if (origTags[i]['x-traitTag']) {
|
||||
tagsMap[tagName]['x-traitTag'].should.be.equal(origTags[i]['x-traitTag']);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
});
|
||||
describe('getTagsMap method', () => {
|
||||
before(function () {
|
||||
schemaMgr._schema = {
|
||||
tags: [
|
||||
{name: 'tag1', description: 'info1'},
|
||||
{name: 'tag2', description: 'info2', 'x-traitTag': true}
|
||||
]
|
||||
};
|
||||
});
|
||||
|
||||
describe("buildMenuTree method", () => {
|
||||
var menuTree;
|
||||
let entries;
|
||||
|
||||
before(() => {
|
||||
menuTree = schemaMgr.buildMenuTree();
|
||||
entries = Array.from(menuTree.entries());
|
||||
});
|
||||
|
||||
it("should return instance of Map", () => {
|
||||
menuTree.should.be.instanceof(Map);
|
||||
});
|
||||
|
||||
it("should return Map with correct number of entries", () => {
|
||||
entries.length.should.be.at.least(schemaMgr.schema.tags.length);
|
||||
});
|
||||
|
||||
it("methods for tag should contain valid pointer and summary", () => {
|
||||
for (let entr of entries) {
|
||||
let [tag, info] = entr;
|
||||
info.should.be.an("object");
|
||||
info.methods.should.be.an("array");
|
||||
for (let methodInfo of info.methods) {
|
||||
methodInfo.should.include.keys('pointer', 'summary');
|
||||
let methSchema = schemaMgr.byPointer(methodInfo.pointer);
|
||||
should.exist(methSchema);
|
||||
if (methSchema.summary) {
|
||||
methSchema.summary.should.be.equal(methodInfo.summary)
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it("should map x-traitTag to empty methods list", () => {
|
||||
for (let entr of entries) {
|
||||
let [tag, info] = entr;
|
||||
info.should.be.an("object");
|
||||
if (info['x-traitTag']) {
|
||||
info.methods.should.be.empty;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('should return correct tags map', () => {
|
||||
let tagsMap = schemaMgr.getTagsMap();
|
||||
let expectedResult = {
|
||||
tag1: {description: 'info1', 'x-traitTag': false},
|
||||
tag2: {description: 'info2', 'x-traitTag': true}
|
||||
};
|
||||
tagsMap.should.be.deep.equal(expectedResult);
|
||||
});
|
||||
});
|
||||
|
||||
describe('buildMenuTree method', () => {
|
||||
let suitSchema = {
|
||||
tags: [
|
||||
{name: 'tag1', description: 'info1', 'x-traitTag': true},
|
||||
{name: 'tag2', description: 'info2'}
|
||||
],
|
||||
paths: {
|
||||
test: {
|
||||
put: {
|
||||
tags: ['tag1', 'tag3'],
|
||||
summary: 'test put'
|
||||
},
|
||||
get: {
|
||||
tags: ['tag1', 'tag2'],
|
||||
summary: 'test get'
|
||||
},
|
||||
// no tags
|
||||
post: {
|
||||
summary: 'test post'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let menuTree;
|
||||
let entries;
|
||||
|
||||
before(() => {
|
||||
schemaMgr._schema = suitSchema;
|
||||
menuTree = schemaMgr.buildMenuTree();
|
||||
entries = Array.from(menuTree.entries());
|
||||
});
|
||||
|
||||
it('should return instance of Map', () => {
|
||||
menuTree.should.be.instanceof(Map);
|
||||
});
|
||||
|
||||
it('should return Map with correct number of entries', () => {
|
||||
//2 - defined tags, 1 - tag3 and 1 [other] tag for no-tags method
|
||||
entries.length.should.be.equal(2 + 1 + 1);
|
||||
});
|
||||
|
||||
it('should append not defined tags to the end of list', () => {
|
||||
let [tag, info] = entries[2];
|
||||
tag.should.be.equal('tag3');
|
||||
info.methods.length.should.be.equal(1);
|
||||
info.methods[0].summary.should.be.equal('test put');
|
||||
});
|
||||
|
||||
it('should append methods without tags to [other] tag', () => {
|
||||
let [tag, info] = entries[3];
|
||||
tag.should.be.equal('[Other]');
|
||||
info.methods.length.should.be.equal(1);
|
||||
info.methods[0].summary.should.be.equal('test post');
|
||||
});
|
||||
|
||||
it('should map x-traitTag to empty methods list', () => {
|
||||
let [, info] = entries[0];
|
||||
info['x-traitTag'].should.be.true;
|
||||
info.methods.should.be.empty;
|
||||
});
|
||||
|
||||
it('methods for tag should contain valid pointer and summary', () => {
|
||||
for (let entr of entries) {
|
||||
let [, info] = entr;
|
||||
info.should.be.an('object');
|
||||
info.methods.should.be.an('array');
|
||||
for (let methodInfo of info.methods) {
|
||||
methodInfo.should.include.keys('pointer', 'summary');
|
||||
let methSchema = schemaMgr.byPointer(methodInfo.pointer);
|
||||
should.exist(methSchema);
|
||||
if (methSchema.summary) {
|
||||
methSchema.summary.should.be.equal(methodInfo.summary);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('getMethodParams method', () => {
|
||||
before((done) => {
|
||||
schemaMgr.load('/tests/schemas/schema-mgr-methodparams.json').then(() => {
|
||||
done();
|
||||
}, () => {
|
||||
done(new Error('Error handler should not be called'));
|
||||
});
|
||||
});
|
||||
|
||||
it('should merge path and method parameters', () => {
|
||||
let params = schemaMgr.getMethodParams('/paths/test1/get');
|
||||
params.length.should.be.equal(2);
|
||||
params[0].name.should.be.equal('methodParam');
|
||||
params[1].name.should.be.equal('pathParam');
|
||||
});
|
||||
|
||||
it('should inject correct pointers', () => {
|
||||
let params = schemaMgr.getMethodParams('/paths/test1/get');
|
||||
params[0]._pointer.should.be.equal('/paths/test1/get/parameters/0');
|
||||
params[1]._pointer.should.be.equal('/paths/test1/parameters/0');
|
||||
});
|
||||
|
||||
it('should resolve path params from Parameters Definitions Object', () => {
|
||||
let params = schemaMgr.getMethodParams('/paths/test2/get', true);
|
||||
params.length.should.be.equal(2);
|
||||
params[0].name.should.be.equal('methodParam');
|
||||
params[1].name.should.be.equal('extParam');
|
||||
params[1]._pointer.should.be.equal('#/parameters/extparam');
|
||||
});
|
||||
|
||||
it('should resolve method params from Parameters Definitions Object', () => {
|
||||
let params = schemaMgr.getMethodParams('/paths/test3/get', true);
|
||||
params.length.should.be.equal(2);
|
||||
params[0].name.should.be.equal('extParam');
|
||||
params[0]._pointer.should.be.equal('#/parameters/extparam');
|
||||
params[1].name.should.be.equal('pathParam');
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue
Block a user