routing-controllers-openapi
Version:
Runtime OpenAPI v3 spec generation for routing-controllers
123 lines (107 loc) • 3.07 kB
text/typescript
import {
Body,
getMetadataArgsStorage,
JsonController,
Post,
QueryParam,
} from 'routing-controllers'
import {
getPathParams,
getQueryParams,
getRequestBody,
IRoute,
parseRoutes,
} from '../src'
describe('options', () => {
let routes: IRoute[]
beforeEach(() => {
getMetadataArgsStorage().reset()
class CreateUserBody {}
class ParamType {}
('/users')
// @ts-ignore: not referenced
class UsersController {
('/:userId')
createUser(
'from') _from: number,
('to', { required: false }) _to: number,
({ type: CreateUserBody }) _body: CreateUserBody[]
) {
(return
}
('/:userId')
createManyUsers(
'param', { type: ParamType }) _param: string,
() _body: CreateUserBody[]
) {
(return
}
}
routes = parseRoutes(getMetadataArgsStorage())
})
it('sets path parameter always as required regardless of options', () => {
const route = routes[0]
expect(getPathParams(route)[0].required).toEqual(true)
route.options.defaults = { paramOptions: { required: false } }
expect(getPathParams(route)[0].required).toEqual(true)
})
it('sets query parameter optional by default', () => {
const route = routes[0]
expect(getQueryParams(route, {})[0].required).toEqual(false)
})
it('sets query parameter required as per global options', () => {
const route = routes[0]
route.options.defaults = { paramOptions: { required: true } }
expect(getQueryParams(route, {})[0].required).toEqual(true)
})
it('uses local required option over the global one', () => {
const route = routes[0]
route.options.defaults = { paramOptions: { required: true } }
expect(getQueryParams(route, {})[1].required).toEqual(false)
})
it('uses the explicit `type` parameter to override request query type', () => {
const route = routes[1]
expect(getQueryParams(route, {})[0]).toEqual({
in: 'query',
name: 'param',
required: false,
schema: {
$ref: '#/components/schemas/ParamType',
},
})
})
it('uses the explicit `type` parameter to override array request body item type', () => {
const route = routes[0]
expect(getRequestBody(route)).toEqual({
content: {
'application/json': {
schema: {
items: {
$ref: '#/components/schemas/CreateUserBody',
},
type: 'array',
},
},
},
description: 'CreateUserBody',
required: false,
})
})
it('set inner schema as {} if array request body item type is not explicitly defined', () => {
const route = routes[1]
expect(getRequestBody(route)).toEqual({
content: {
'application/json': {
schema: {
items: {
type: 'object',
},
type: 'array',
},
},
},
description: '',
required: false,
})
})
})