chai-json-schema-ajv

Build Status Coverage Status

json スキーマを検証するための chai プラグインです。

これは ajv という、JSON スキーマ検証ツールを基にしています。

バージョン ajv バージョン json スキーマ・バージョン
v1 4.11.8 JSON スキーマ draft 4
v2 5.5.2 JSON スキーマ draft-06
v3 ^6.7.0 JSON スキーマ draft-07
v4 >=4 <7  
v5 >=4 <7 v4 と同じですが、メッセージ形式が異なります。
v5.2 >=4  

インストール

npm i ajv --save-dev # Or any version you prefer `npm i ajv@4 --save-dev`
npm i chai-json-schema-ajv --save-dev

使用方法

データの検証 (jsonSchema)

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

const apple = {
  name: 'foo',
  color: ['red', 'green', 'yellow'],
  value: 10
}
const car = {
  name: 'bar',
  speed: 1.1
}
const 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, 'custom flag')
expect(car).to.not.be.jsonSchema(schema, 'custom flag')

assert.jsonSchema(apple, schema, 'custom flag')
assert.notJsonSchema(car, schema, 'custom flag')

スキーマの検証 (validJsonSchema)

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

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

expect(schema, 'custom flag').to.be.validJsonSchema
expect({ type: '__invalid__' }, 'custom flag').to.not.be.validJsonSchema

assert.validJsonSchema(schema, 'custom flag')
assert.notValidJsonSchema({ type: '__invalid__' }, 'custom flag')

カスタムオプション

オプションは ajv にも渡されます。

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

// Basically, it's same as `new Ajv(options)`

verbose オプション

デフォルトのエラーメッセージは、ajv.errorsText によって解析されます。

...
chai.use(
  require('chai-json-schema-ajv')
)
...
expected data to match json-schema
data should have required property 'color'

{verbose: true} オプションを使用すると、完全なエラーが出力されます。

...
chai.use(
  require('chai-json-schema-ajv').create({
    verbose: true
  })
)
...
expected { name: 'bar', speed: 1.1 } to match json-schema
[ { keyword: 'required',
    dataPath: '',
    schemaPath: '#/required',
    params: { missingProperty: 'color' },
    message: 'should have required property \'color\'',
    schema: 
     { name: { type: 'string', minLength: 3 },
       color: 
        { type: 'array',
          minItems: 1,
          uniqueItems: true,
          items: { type: 'string' } },
       value: { type: 'integer', minimum: 5 } },
    parentSchema: 
     { 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 } } },
    data: { name: 'bar', speed: 1.1 } } ]

ajv オプション

ajv インスタンスを再利用したい場合は、以下ができます。

const ajv = new Ajv
...
chai.use(
  require('chai-json-schema-ajv').create({
    ajv
  })
)
...

assert.ok(ajv === chai.ajv)

ajv インスタンスへのアクセス

...
chai.use(
  require('chai-json-schema-ajv')
)
...

assert.ok(chai.ajv instanceof Ajv)

TODO

  • ブラウザ側サポート
  • es2017 async/await に移行
  • リンターの追加
  • オプションを ajv に送信する (thanks @dimac)

ライセンス

MIT