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.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							140 lines
						
					
					
						
							3.3 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const t = require('tap')
 | |
| const AjvCompiler = require('../index')
 | |
| 
 | |
| const sampleSchema = Object.freeze({
 | |
|   $id: 'example1',
 | |
|   type: 'object',
 | |
|   properties: {
 | |
|     name: { type: 'string' }
 | |
|   }
 | |
| })
 | |
| 
 | |
| const externalSchemas1 = Object.freeze({})
 | |
| const externalSchemas2 = Object.freeze({
 | |
|   foo: {
 | |
|     $id: 'foo',
 | |
|     type: 'object',
 | |
|     properties: {
 | |
|       name: { type: 'string' }
 | |
|     }
 | |
|   }
 | |
| })
 | |
| 
 | |
| const fastifyAjvOptionsDefault = Object.freeze({
 | |
|   customOptions: {}
 | |
| })
 | |
| 
 | |
| const fastifyAjvOptionsCustom = Object.freeze({
 | |
|   customOptions: {
 | |
|     allErrors: true,
 | |
|     removeAdditional: false
 | |
|   },
 | |
|   plugins: [
 | |
|     require('ajv-merge-patch'),
 | |
|     [require('ajv-errors'), { singleError: false }]
 | |
|   ]
 | |
| })
 | |
| 
 | |
| t.test('basic usage', t => {
 | |
|   t.plan(1)
 | |
|   const factory = AjvCompiler()
 | |
|   const compiler = factory(externalSchemas1, fastifyAjvOptionsDefault)
 | |
|   const validatorFunc = compiler({ schema: sampleSchema })
 | |
|   const result = validatorFunc({ name: 'hello' })
 | |
|   t.equal(result, true)
 | |
| })
 | |
| 
 | |
| t.test('plugin loading', t => {
 | |
|   t.plan(3)
 | |
|   const factory = AjvCompiler()
 | |
|   const compiler = factory(externalSchemas1, fastifyAjvOptionsCustom)
 | |
|   const validatorFunc = compiler({
 | |
|     schema: {
 | |
|       $merge: {
 | |
|         source: {
 | |
|           type: 'object',
 | |
|           properties: {
 | |
|             q: {
 | |
|               type: 'string'
 | |
|             }
 | |
|           },
 | |
|           errorMessage: 'hello world'
 | |
|         },
 | |
|         with: {
 | |
|           required: ['q']
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   })
 | |
|   const result = validatorFunc({ q: 'hello' })
 | |
|   t.equal(result, true)
 | |
| 
 | |
|   const resultFail = validatorFunc({ })
 | |
|   t.equal(resultFail, false)
 | |
|   t.equal(validatorFunc.errors[0].message, 'hello world')
 | |
| })
 | |
| 
 | |
| t.test('optimization - cache ajv instance', t => {
 | |
|   t.plan(5)
 | |
|   const factory = AjvCompiler()
 | |
|   const compiler1 = factory(externalSchemas1, fastifyAjvOptionsDefault)
 | |
|   const compiler2 = factory(externalSchemas1, fastifyAjvOptionsDefault)
 | |
|   t.equal(compiler1, compiler2, 'same instance')
 | |
|   t.same(compiler1, compiler2, 'same instance')
 | |
| 
 | |
|   const compiler3 = factory(externalSchemas2, fastifyAjvOptionsDefault)
 | |
|   t.not(compiler3, compiler1, 'new ajv instance when externa schema change')
 | |
| 
 | |
|   const compiler4 = factory(externalSchemas1, fastifyAjvOptionsCustom)
 | |
|   t.not(compiler4, compiler1, 'new ajv instance when externa schema change')
 | |
|   t.not(compiler4, compiler3, 'new ajv instance when externa schema change')
 | |
| })
 | |
| 
 | |
| // https://github.com/fastify/fastify/pull/2969
 | |
| t.test('compile same $id when in external schema', t => {
 | |
|   t.plan(2)
 | |
|   const factory = AjvCompiler()
 | |
| 
 | |
|   const base = {
 | |
|     $id: 'urn:schema:base',
 | |
|     definitions: {
 | |
|       hello: { type: 'string' }
 | |
|     },
 | |
|     type: 'object',
 | |
|     properties: {
 | |
|       hello: { $ref: '#/definitions/hello' }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   const refSchema = {
 | |
|     $id: 'urn:schema:ref',
 | |
|     type: 'object',
 | |
|     properties: {
 | |
|       hello: { $ref: 'urn:schema:base#/definitions/hello' }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   const compiler = factory({
 | |
|     [base.$id]: base,
 | |
|     [refSchema.$id]: refSchema
 | |
| 
 | |
|   }, fastifyAjvOptionsDefault)
 | |
| 
 | |
|   const validatorFunc1 = compiler({
 | |
|     schema: {
 | |
|       $id: 'urn:schema:ref'
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   const validatorFunc2 = compiler({
 | |
|     schema: {
 | |
|       $id: 'urn:schema:ref'
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   t.pass('the compile does not fail if the schema compiled is already in the external schemas')
 | |
|   t.equal(validatorFunc1, validatorFunc2, 'the returned function is the same')
 | |
| })
 |