|
1 | 1 | require('./index.js');
|
2 | 2 | const express = require('express');
|
3 | 3 | const supertest = require('supertest');
|
| 4 | +const assert = require('assert'); |
4 | 5 |
|
5 | 6 | describe('express-async-errors', () => {
|
6 | 7 | it('propagates routes errors to error handler', () => {
|
@@ -31,7 +32,6 @@ describe('express-async-errors', () => {
|
31 | 32 | throw new Error('error');
|
32 | 33 | });
|
33 | 34 |
|
34 |
| - |
35 | 35 | app.use((err, req, res, next) => {
|
36 | 36 | res.status(495);
|
37 | 37 | res.end();
|
@@ -62,4 +62,48 @@ describe('express-async-errors', () => {
|
62 | 62 | .get('/test')
|
63 | 63 | .expect(495);
|
64 | 64 | });
|
| 65 | + |
| 66 | + it('should preserve the router stack for external routes', () => { |
| 67 | + const app = express(); |
| 68 | + |
| 69 | + function swaggerize(item) { |
| 70 | + function describeRouterRoute(router, metaData) { |
| 71 | + const lastRoute = router.stack[router.stack.length - 1]; |
| 72 | + const verb = Object.keys(lastRoute.route.methods)[0]; |
| 73 | + metaData.path = lastRoute.route.path; |
| 74 | + metaData.verb = verb; |
| 75 | + lastRoute.route.swaggerData = metaData; |
| 76 | + metaData.described = true; |
| 77 | + } |
| 78 | + |
| 79 | + function describe(metaData) { |
| 80 | + if (item.stack) { |
| 81 | + describeRouterRoute(item, metaData); |
| 82 | + return item; |
| 83 | + } |
| 84 | + describeRouterRoute(item._router, metaData); |
| 85 | + return item; |
| 86 | + } |
| 87 | + |
| 88 | + item.describe = describe; |
| 89 | + } |
| 90 | + |
| 91 | + const router = express.Router(); |
| 92 | + swaggerize(router); |
| 93 | + |
| 94 | + router |
| 95 | + .get('/test', (req, res) => { |
| 96 | + res.status(200).send('Ok'); |
| 97 | + }) |
| 98 | + .describe({ hasDescription: true }); |
| 99 | + app.use('/', router); |
| 100 | + |
| 101 | + const appRouteStack = app._router.stack; |
| 102 | + const someMiddlewareFunctionStack = appRouteStack[appRouteStack.length - 1]; |
| 103 | + const innerStack = someMiddlewareFunctionStack.handle.stack; |
| 104 | + const routeData = innerStack[0].route.swaggerData; |
| 105 | + assert.ok(routeData); |
| 106 | + assert.equal(routeData.verb, 'get'); |
| 107 | + assert.equal(routeData.hasDescription, true); |
| 108 | + }); |
65 | 109 | });
|
0 commit comments