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