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)
 | |
| })
 |