From d2d856067b4c5be003be6350287f75bc7e75bb90 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Sat, 12 Dec 2015 17:28:46 +0200 Subject: [PATCH] Redesigned specs + finish schemaManager spec --- tests/schemas/schema-mgr-methodparams.json | 67 ++++++ tests/unit/schema-manager.spec.js | 228 ++++++++++++++------- 2 files changed, 219 insertions(+), 76 deletions(-) create mode 100644 tests/schemas/schema-mgr-methodparams.json diff --git a/tests/schemas/schema-mgr-methodparams.json b/tests/schemas/schema-mgr-methodparams.json new file mode 100644 index 00000000..527b66c1 --- /dev/null +++ b/tests/schemas/schema-mgr-methodparams.json @@ -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" } + ] + } + } + } +} diff --git a/tests/unit/schema-manager.spec.js b/tests/unit/schema-manager.spec.js index 1caad5b6..e3c56721 100644 --- a/tests/unit/schema-manager.spec.js +++ b/tests/unit/schema-manager.spec.js @@ -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'); + }); + }); + });