From 3639983fd160a3b5b1e22f9935ef0e1bc135e935 Mon Sep 17 00:00:00 2001 From: bitebit Date: Mon, 5 Feb 2018 15:23:18 +0800 Subject: [PATCH] refactor: parse and mount route when routes was called. to avoid plugin not mount finish, but the route was mounted. --- package.json | 2 +- src/router.js | 13 +++++- test/plugin/plugin.multi.test.js | 71 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 test/plugin/plugin.multi.test.js diff --git a/package.json b/package.json index 0692ce8..a73c8c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "koa-oai-router", - "version": "2.0.0-alpha.3", + "version": "2.0.0-alpha.4", "main": "lib", "scripts": { "clean": "rm -rf coverage lib", diff --git a/src/router.js b/src/router.js index b6ef212..5fda14e 100644 --- a/src/router.js +++ b/src/router.js @@ -28,7 +28,16 @@ class OAIRouter extends Router { this.api = null; this.pluginRegister = new PluginRegister(this.options); - spec(apiDoc) + this.apiDoc = apiDoc; + } + + /** + * Start to parse apiDoc and mount routes. Must called after all mount action is finished. + * @public + * @returns route dispatcher, koa middleware + */ + routes() { + spec(this.apiDoc) .then(async (api) => { this.api = api; @@ -43,6 +52,8 @@ class OAIRouter extends Router { this.emit('error', error); }); + + return super.routes(); } /** diff --git a/test/plugin/plugin.multi.test.js b/test/plugin/plugin.multi.test.js new file mode 100644 index 0000000..48a0ecc --- /dev/null +++ b/test/plugin/plugin.multi.test.js @@ -0,0 +1,71 @@ +import { init, Plugin } from '../helpers'; + +describe('Plugin multi', () => { + it('multi plugin, should success', async () => { + class PluginX extends Plugin { + constructor() { + super(); + + this.field = 'parameters'; + } + handler() { + const { args } = this; + + return (ctx, next) => { + ctx.value = args; + + return next(); + }; + } + } + + class PluginY extends Plugin { + constructor() { + super(); + + this.field = 'parameters'; + } + handler() { + const { args } = this; + + return (ctx, next) => { + ctx.value += args; + + return next(); + }; + } + } + + class PluginZ extends Plugin { + constructor() { + super(); + + this.field = 'parameters'; + } + handler() { + const { args } = this; + + return (ctx, next) => { + ctx.value += args; + + ctx.response.body = ctx.value; + }; + } + } + + const { request } = await init({ + apiDoc: './test/plugin/api', + plugins: [PluginX, PluginY, PluginZ], + options: { + PluginX: 'x', + PluginY: 'y', + PluginZ: 'z', + }, + }); + + await request + .get('/api/pets') + .expect(200) + .expect('xyz'); + }); +});