UNPKG

swagger-parser-mock

Version:

一个简单的 Swagger 文档解析器,支持生成演示数据与数据实体类

180 lines (164 loc) 4.49 kB
const path = require('path') const StaticServer = require('static-server') const swaggerParserMock = require('../lib') const server = new StaticServer({ rootPath: path.join(__dirname, 'specs'), port: 3333 }) describe('index.test.js', () => { let specs let getAPI let getMock const petSchema = { id: '@integer(60, 100)', category: { id: '@integer(60, 100)', name: '@string' }, name: expect.any(String), photoUrls: ['@string'], tags: [{ id: '@integer(60, 100)', name: '@string' }], status: 'available' } const orderSchema = { complete: '@boolean', id: '@integer(60, 100)', petId: '@integer(60, 100)', quantity: '@integer(60, 100)', shipDate: '@datetime', status: 'placed' } const userSchema = { email: '@string', firstName: '@string', id: '@integer(60, 100)', lastName: '@string', password: '@string', phone: '@string', userStatus: '@integer(60, 100)', username: '@string' } beforeAll(() => { server.start() specs = Promise.all([ swaggerParserMock('http://localhost:3333/v1.2/api-docs.json'), swaggerParserMock('http://localhost:3333/v2/petstore.yml') ]) getMock = (api) => { const res = api.responses['200'] || api.responses['default'] if (!res) return return res.example && JSON.parse(res.example) } getAPI = (url, method) => { return specs.then(result => { const apis = [] result.forEach(res => { for (let _url in res.paths) { if (url === _url) { for (let _method in res.paths[_url]) { if (method === _method) { apis.push(res.paths[url][method]) return } } } } }) return apis }) } }) afterAll(() => { server.stop() }) describe('v1.2 & v2', () => { test('/pet/findByStatus', done => { getAPI('/pet/findByStatus', 'get').then(result => { result.forEach((res, index) => { const mock = getMock(res) expect(mock).toHaveLength(1) expect(mock[0]).toEqual(petSchema) if (index === 0) expect(mock[0].name).toEqual('@string') if (index === 1) expect(mock[0].name).toEqual('doggie') }) done() }) }) test('/pet/{petId}', done => { getAPI('/pet/{petId}', 'get').then(result => { result.forEach((res, index) => { const mock = getMock(res) expect(mock).toEqual(petSchema) if (index === 0) expect(mock.name).toEqual('@string') if (index === 1) expect(mock.name).toEqual('doggie') }) done() }) }) test('/pet/{petId}/uploadImage', done => { getAPI('/pet/{petId}/uploadImage', 'post').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toEqual({ code: '@integer(60, 100)', message: '@string', type: '@string' }) }) done() }) }) test('/store/inventory', done => { getAPI('/store/inventory', 'get').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toEqual({ additionalProp1: '@integer(60, 100)', additionalProp2: '@integer(60, 100)', additionalProp3: '@integer(60, 100)' }) }) done() }) }) test('/store/order', done => { getAPI('/store/order', 'post').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toEqual(orderSchema) }) done() }) }) test('/user', done => { getAPI('/user', 'post').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toBeUndefined() }) done() }) }) test('/user/login', done => { getAPI('/user/login', 'get').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toBe('@string') }) done() }) }) test('/user/{username}', done => { getAPI('/user/{username}', 'get').then(result => { result.forEach(res => { const mock = getMock(res) expect(mock).toEqual(userSchema) }) done() }) }) }) })