You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.5 KiB
133 lines
4.5 KiB
'use strict'
|
|
|
|
const { test } = require('tap')
|
|
const Fastify = require('fastify')
|
|
const Swagger = require('swagger-parser')
|
|
const fastifySwagger = require('../../../index')
|
|
|
|
test('support $ref schema', async t => {
|
|
t.plan(1)
|
|
|
|
const fastify = Fastify()
|
|
fastify.addSchema({
|
|
$id: 'example',
|
|
type: 'object',
|
|
properties: {
|
|
hello: { type: 'string' }
|
|
}
|
|
})
|
|
|
|
fastify.register(fastifySwagger, {
|
|
routePrefix: '/docs',
|
|
exposeRoute: true
|
|
})
|
|
|
|
fastify.register((instance, opts, next) => {
|
|
instance.addSchema({
|
|
$id: 'subschema-two',
|
|
type: 'object',
|
|
properties: {
|
|
hello: { type: 'string' }
|
|
}
|
|
})
|
|
|
|
instance.register((subinstance, opts, next) => {
|
|
subinstance.addSchema({
|
|
$id: 'subschema-three',
|
|
type: 'object',
|
|
properties: {
|
|
hello: { type: 'string' }
|
|
}
|
|
})
|
|
|
|
subinstance.post('/:hello', {
|
|
handler () {},
|
|
schema: {
|
|
body: { $ref: 'example#/properties/hello' },
|
|
querystring: { $ref: 'subschema-two#/properties/hello' },
|
|
params: { $ref: 'subschema-two#/properties/hello' },
|
|
headers: { $ref: 'subschema-three#/properties/hello' },
|
|
response: {
|
|
200: { $ref: 'example#/properties/hello' }
|
|
}
|
|
}
|
|
})
|
|
|
|
next()
|
|
})
|
|
|
|
next()
|
|
})
|
|
|
|
const res = await fastify.inject('/docs/json')
|
|
|
|
await Swagger.validate(res.json())
|
|
t.pass('valid swagger object')
|
|
})
|
|
|
|
test('support nested $ref schema : complex case', async (t) => {
|
|
const options = {
|
|
swagger: {},
|
|
refResolver: {
|
|
buildLocalReference: (json, baseUri, fragment, i) => {
|
|
return json.$id || `def-${i}`
|
|
}
|
|
}
|
|
}
|
|
const fastify = Fastify()
|
|
fastify.register(fastifySwagger, options)
|
|
fastify.register(async (instance) => {
|
|
instance.addSchema({ $id: 'schemaA', type: 'object', properties: { id: { type: 'integer' } } })
|
|
instance.addSchema({ $id: 'schemaB', type: 'object', properties: { id: { type: 'string' } } })
|
|
instance.addSchema({ $id: 'schemaC', type: 'object', properties: { a: { type: 'array', items: { $ref: 'schemaA' } } } })
|
|
instance.addSchema({ $id: 'schemaD', type: 'object', properties: { b: { $ref: 'schemaB' }, c: { $ref: 'schemaC' } } })
|
|
instance.post('/url1', { schema: { body: { $ref: 'schemaD' }, response: { 200: { $ref: 'schemaB' } } } }, () => {})
|
|
instance.post('/url2', { schema: { body: { $ref: 'schemaC' }, response: { 200: { $ref: 'schemaA' } } } }, () => {})
|
|
})
|
|
|
|
await fastify.ready()
|
|
|
|
const swaggerObject = fastify.swagger()
|
|
t.equal(typeof swaggerObject, 'object')
|
|
const definitions = swaggerObject.definitions
|
|
t.match(Object.keys(definitions), ['schemaA', 'schemaB', 'schemaC', 'schemaD'])
|
|
|
|
// ref must be prefixed by '#/definitions/'
|
|
t.equal(definitions.schemaC.properties.a.items.$ref, '#/definitions/schemaA')
|
|
t.equal(definitions.schemaD.properties.b.$ref, '#/definitions/schemaB')
|
|
t.equal(definitions.schemaD.properties.c.$ref, '#/definitions/schemaC')
|
|
|
|
await Swagger.validate(swaggerObject)
|
|
})
|
|
|
|
test('support nested $ref schema : complex case without modifying buildLocalReference', async (t) => {
|
|
const fastify = Fastify()
|
|
fastify.register(fastifySwagger, {
|
|
routePrefix: '/docs',
|
|
exposeRoute: true
|
|
})
|
|
fastify.register(async (instance) => {
|
|
instance.addSchema({ $id: 'schemaA', type: 'object', properties: { id: { type: 'integer' } } })
|
|
instance.addSchema({ $id: 'schemaB', type: 'object', properties: { id: { type: 'string' } } })
|
|
instance.addSchema({ $id: 'schemaC', type: 'object', properties: { a: { type: 'array', items: { $ref: 'schemaA' } } } })
|
|
instance.addSchema({ $id: 'schemaD', type: 'object', properties: { b: { $ref: 'schemaB' }, c: { $ref: 'schemaC' } } })
|
|
instance.post('/url1', { schema: { body: { $ref: 'schemaD' }, response: { 200: { $ref: 'schemaB' } } } }, () => {})
|
|
instance.post('/url2', { schema: { body: { $ref: 'schemaC' }, response: { 200: { $ref: 'schemaA' } } } }, () => {})
|
|
})
|
|
|
|
await fastify.ready()
|
|
|
|
const swaggerObject = fastify.swagger()
|
|
t.equal(typeof swaggerObject, 'object')
|
|
|
|
const definitions = swaggerObject.definitions
|
|
t.match(Object.keys(definitions), ['def-0', 'def-1', 'def-2', 'def-3'])
|
|
|
|
// ref must be prefixed by '#/definitions/'
|
|
t.equal(definitions['def-2'].properties.a.items.$ref, '#/definitions/def-0')
|
|
t.equal(definitions['def-3'].properties.b.$ref, '#/definitions/def-1')
|
|
t.equal(definitions['def-3'].properties.c.$ref, '#/definitions/def-2')
|
|
|
|
await Swagger.validate(swaggerObject)
|
|
})
|