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.
		
		
		
		
		
			
		
			
				
					109 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					109 lines
				
				3.0 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { test } = require('tap') | ||
|  | const Fastify = require('fastify') | ||
|  | const yaml = require('js-yaml') | ||
|  | 
 | ||
|  | const fastifySwagger = require('../index') | ||
|  | const { swaggerOption, schemaBody } = require('../examples/options') | ||
|  | 
 | ||
|  | const authOptions = { | ||
|  |   validate (username, password, req, reply, done) { | ||
|  |     if (username === 'admin' && password === 'admin') { | ||
|  |       done() | ||
|  |     } else { | ||
|  |       done(new Error('Winter is coming')) | ||
|  |     } | ||
|  |   }, | ||
|  |   authenticate: true | ||
|  | } | ||
|  | 
 | ||
|  | function basicAuthEncode (username, password) { | ||
|  |   return 'Basic ' + Buffer.from(username + ':' + password).toString('base64') | ||
|  | } | ||
|  | 
 | ||
|  | test('hooks on static swagger', async t => { | ||
|  |   const fastify = Fastify() | ||
|  |   await fastify.register(require('fastify-basic-auth'), authOptions) | ||
|  |   fastify.register(fastifySwagger, { | ||
|  |     mode: 'static', | ||
|  |     specification: { | ||
|  |       path: './examples/example-static-specification.yaml' | ||
|  |     }, | ||
|  |     exposeRoute: true, | ||
|  |     uiHooks: { | ||
|  |       onRequest: fastify.basicAuth | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   let res = await fastify.inject('/documentation') | ||
|  |   t.equal(res.statusCode, 401, 'root auth required') | ||
|  | 
 | ||
|  |   res = await fastify.inject('/documentation/yaml') | ||
|  |   t.equal(res.statusCode, 401, 'auth required yaml') | ||
|  |   res = await fastify.inject({ | ||
|  |     method: 'GET', | ||
|  |     url: '/documentation/yaml', | ||
|  |     headers: { authorization: basicAuthEncode('admin', 'admin') } | ||
|  |   }) | ||
|  |   t.equal(res.statusCode, 200) | ||
|  |   t.equal(res.headers['content-type'], 'application/x-yaml') | ||
|  |   try { | ||
|  |     yaml.load(res.payload) | ||
|  |     t.pass('valid swagger yaml') | ||
|  |   } catch (err) { | ||
|  |     t.fail(err) | ||
|  |   } | ||
|  | 
 | ||
|  |   res = await fastify.inject('/documentation/json') | ||
|  |   t.equal(res.statusCode, 401, 'auth required json') | ||
|  |   res = await fastify.inject({ | ||
|  |     method: 'GET', | ||
|  |     url: '/documentation/json', | ||
|  |     headers: { authorization: basicAuthEncode('admin', 'admin') } | ||
|  |   }) | ||
|  |   t.equal(typeof res.payload, 'string') | ||
|  |   t.equal(res.headers['content-type'], 'application/json; charset=utf-8') | ||
|  |   try { | ||
|  |     yaml.load(res.payload) | ||
|  |     t.pass('valid swagger json') | ||
|  |   } catch (err) { | ||
|  |     t.fail(err) | ||
|  |   } | ||
|  | }) | ||
|  | 
 | ||
|  | test('hooks on dynamic swagger', async t => { | ||
|  |   const fastify = Fastify() | ||
|  |   await fastify.register(require('fastify-basic-auth'), authOptions) | ||
|  | 
 | ||
|  |   fastify.register(fastifySwagger, { | ||
|  |     ...swaggerOption, | ||
|  |     exposeRoute: true, | ||
|  |     uiHooks: { | ||
|  |       onRequest: fastify.basicAuth | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   fastify.get('/fooBar123', schemaBody, () => {}) | ||
|  | 
 | ||
|  |   let res = await fastify.inject('/documentation') | ||
|  |   t.equal(res.statusCode, 401, 'root auth required') | ||
|  | 
 | ||
|  |   res = await fastify.inject('/documentation/yaml') | ||
|  |   t.equal(res.statusCode, 401, 'auth required yaml') | ||
|  | 
 | ||
|  |   res = await fastify.inject('/documentation/json') | ||
|  |   t.equal(res.statusCode, 401, 'auth required json') | ||
|  |   res = await fastify.inject({ | ||
|  |     method: 'GET', | ||
|  |     url: '/documentation/json', | ||
|  |     headers: { authorization: basicAuthEncode('admin', 'admin') } | ||
|  |   }) | ||
|  |   t.equal(typeof res.payload, 'string') | ||
|  |   t.equal(res.headers['content-type'], 'application/json; charset=utf-8') | ||
|  | 
 | ||
|  |   const swaggerObject = res.json() | ||
|  |   t.ok(swaggerObject.paths) | ||
|  |   t.ok(swaggerObject.paths['/fooBar123']) | ||
|  | }) |