chai-json-schema-ajv

Build Status Coverage Status

A chai plugin for validate json schema.

This is based on ajv, a JSON schema Validator.

version ajv version json schema version
v1 4.11.8 JSON Schema draft 4
v2 5.5.2 JSON Schema draft-06
v3 6.1.1 JSON Schema draft-07

Usage

npm install chai-json-schema-ajv

Basic (jsonSchema)

const chai = require('chai')
chai.use(require('chai-json-schema-ajv'))
const expect = chai.expect

let apple = {
  name: 'foo',
  color: ['red', 'green', 'yellow'],
  value: 10
}
let schema = {
  title: 'fruit schema v0.1',
  type: 'object',
  required: ['name', 'color', 'value'],
  properties: {
    name: {
      type: 'string',
      minLength: 3
    },
    color: {
      type: 'array',
      minItems: 1,
      uniqueItems: true,
      items: {
        type: 'string'
      }
    },
    value: {
      type: 'integer',
      minimum: 5
    }
  }
}

expect(apple).to.be.jsonSchema(schema)

Basic (validJsonSchema)

const chai = require('chai')
chai.use(require('chai-json-schema-ajv'))
const expect = chai.expect

let schema = {
  title: 'valid schema',
  type: 'object',
  required: ['name'],
  properties: {
    name: {
      type: 'string',
      minLength: 3
    }
  }
}

expect(schema).to.be.validJsonSchema

With custom ajv options

const options = { ... }
chai.use(require('chai-json-schema-ajv').withOptions(options))

...
  • options will be send to ajv

Verbose

Default error message is parsed by ajv.errorsText.

...
chai.use(require('chai-json-schema-ajv')
...
expected value not match the json-schema
data.value should be integer

It will print full errors with the option {verbose: true}

...
chai.use(require('chai-json-schema-ajv').withOptions({ verbose: true }))
...
expected value not match the json-schema
[
 {
   "keyword": "type",
   "dataPath": ".value",
   "schemaPath": "#/properties/value/type",
   "params": {
     "type": "integer"
   },
   "message": "should be integer",
   "schema": "integer",
   "parentSchema": {
     "type": "integer"
   },
   "data": 1.1
 }
]

TODO

  • support browser side
  • move to es2017 async/await
  • add lint
  • send option to ajv (thanks @dimac)

License

MIT