All Projects → americanexpress → jest-json-schema

americanexpress / jest-json-schema

Licence: Apache-2.0 license
✨ JSON schema matcher for Jest

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to jest-json-schema

Full Stack Fastapi Couchbase
Full stack, modern web application generator. Using FastAPI, Couchbase as database, Docker, automatic HTTPS and more.
Stars: ✭ 243 (+59.87%)
Mutual labels:  json-schema
another-json-schema
Another JSON Schema validator, simple & flexible & intuitive.
Stars: ✭ 48 (-68.42%)
Mutual labels:  json-schema
one-service-worker
✨ Minimal, light-weight, Promise based library that unifies the service worker and browser threads under one API
Stars: ✭ 17 (-88.82%)
Mutual labels:  one-app
Rxdb
🔄 A client side, offline-first, reactive database for JavaScript Applications
Stars: ✭ 16,670 (+10867.11%)
Mutual labels:  json-schema
json matcher
Library for simplifying data verification in functional tests for your JSON-based APIs
Stars: ✭ 24 (-84.21%)
Mutual labels:  json-schema
restish
Restish is a CLI for interacting with REST-ish HTTP APIs with some nice features built-in
Stars: ✭ 453 (+198.03%)
Mutual labels:  json-schema
Kubernetes Json Schema
A set of JSON schemas for various Kubernetes versions, extracted from the OpenAPI definitions
Stars: ✭ 234 (+53.95%)
Mutual labels:  json-schema
jackson-json-reference
JSON Reference for Java with Jackson.
Stars: ✭ 21 (-86.18%)
Mutual labels:  json-schema
openshift-json-schema
A set of JSON schemas for various OpenShift versions, extracted from the OpenAPI definitions
Stars: ✭ 23 (-84.87%)
Mutual labels:  json-schema
magnet
A JSON/BSON schema generator
Stars: ✭ 16 (-89.47%)
Mutual labels:  json-schema
OpenAPI-Delphi
The Delphi-OpenAPI library is an OpenAPI 3.0 document generator and parser for Delphi
Stars: ✭ 79 (-48.03%)
Mutual labels:  json-schema
fetchye
✨ If you know how to use Fetch, you know how to use Fetchye [fetch-yae]. Simple React Hooks, Centralized Cache, Infinitely Extensible.
Stars: ✭ 36 (-76.32%)
Mutual labels:  one-app
json-schema
JSON schema validation
Stars: ✭ 20 (-86.84%)
Mutual labels:  json-schema
Vue Form Json Schema
Create forms using JSON schema. Bring your components!
Stars: ✭ 253 (+66.45%)
Mutual labels:  json-schema
as-typed
Ambient mapping from JSON schema to typescript
Stars: ✭ 97 (-36.18%)
Mutual labels:  json-schema
Form Render
🚴‍♀️ 阿里飞猪 - 很易用的中后台「表单 / 表格 / 图表」解决方案
Stars: ✭ 3,881 (+2453.29%)
Mutual labels:  json-schema
angular-schema-form-bootstrap
Bootstrap decorator for Angular Schema Form
Stars: ✭ 50 (-67.11%)
Mutual labels:  json-schema
libgltf
glTF 2.0 parser/loader for C++11, supports many extensions likes `KHR_draco_mesh_compression`, `KHR_lights_punctual`, `KHR_materials_clearcoat`, and more.
Stars: ✭ 55 (-63.82%)
Mutual labels:  json-schema
finspec-spec
Multi-protocol, machine-readable specifications for financial services
Stars: ✭ 18 (-88.16%)
Mutual labels:  json-schema
django-jsonform
A better, user-friendly JSON editing form field for Django admin. Also supports Postgres ArrayField.
Stars: ✭ 151 (-0.66%)
Mutual labels:  json-schema

jest-json-schema

npm version Build Status Mentioned in Awesome Jest

JSON schema matcher for jest

Want to get paid for your contributions to jest-json-schema? Send your resume to [email protected]

Matchers included

toMatchSchema(schema)

Validates that an object matches the given JSON schema

it('validates my json', () => {
  const schema = {
    properties: {
      hello: { type: 'string' },
    },
    required: ['hello'],
  };
  expect({ hello: 'world' }).toMatchSchema(schema);
});

Installation

$ npm install --save-dev jest-json-schema

Usage

In any test file:

import { matchers } from 'jest-json-schema';
expect.extend(matchers);

Or if you want it available for all test files then set it up the same way in a test framework script file

You can pass Ajv options using matchersWithOptions and passing it your options object. The only option passed by default is allErrors: true.

import { matchersWithOptions } from 'jest-json-schema';

const formats = {
  bcp47: /^[a-z]{2}-[A-Z]{2}$/,
}

expect.extend(matchersWithOptions({ formats }));

Additionally you can also use a callback to further configure and extend the Ajv instance used by the matchers:

import ajvKeywords from 'ajv-keywords';
import { matchersWithOptions } from 'jest-json-schema';

const formats = {
  bcp47: /^[a-z]{2}-[A-Z]{2}$/,
}

expect.extend(matchersWithOptions({ formats }, (ajv) => {
  // This uses the `ajv-keywords` library to add pre-made
  // custom keywords to the Ajv instance.
  ajvKeywords(ajv, ['typeof', 'instanceof']);
}));

You can also customize the Ajv class with the AjvClass option:

import Ajv2020 from 'ajv/dist/2020'
import { matchersWithOptions } from 'jest-json-schema';

expect.extend(matchersWithOptions({ AjvClass: Ajv2020 }));

Verbose errors

Ajv supports a verbose option flag which enables more information about individual errors. This extra information can mean that we can output to Jest more meaningful errors that can help the development process:

const { matchersWithOptions } = require('jest-json-schema');

expect.extend(matchersWithOptions({
  verbose: true
}));

test('check that property errors are outputted', () => {
  const schema = {
    $id: 'testSchema',
    type: 'object',
    properties: {
      name: {
        type: 'string',
      },
      dob: {
        type: 'string',
        format: 'date',
      },
    },
  };

  const invalidData = {
    name: null,
    dob: '02-29-2000',
  };

  expect(() => {
    expect(invalidData).toMatchSchema(schema)
  }).toThrowErrorMatchingInlineSnapshot(`
"expect(received).toMatchSchema(schema)

Received:
  .name should be string
    Received: <null>
    Path: testSchema#/properties/name/type
  .dob should match format \\"date\\"
    Received: <string> 02-29-2000
    Path: testSchema#/properties/dob/format
"
`);
});

Example using multiple schema files

If you organise your schemas into separate files and use refs which point to the various different schemas, it will be important to include those dependent schema files when extending Jest's expect handler, using the matchersWithOptions interface:

schemaA.json

{
  "$id": "schemaA",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "Example of a definition schema.",
  "definitions": {
    "testA": {
      "type": "number",
      "const": 1
    },
    "testB": {
      "type": ["null", "string"]
    }
  }
}

schemaB.json

{
  "$id": "schemaB",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "description": "Example of a schema that references another schema.",
  "$ref": "schemaA#/definitions/testB"
}

schemaA.test.js

const { matchersWithOptions } = require('jest-json-schema');

// Local schema files are imported like normal. If you use TypeScript you
// will need to ensure `--resolveJsonModule` is enabled.
const schemaA = require('./schemaA.json');
const schemaB = require('./schemaB.json');

expect.extend(matchersWithOptions({
  // Loading in a schema which is comprised only of definitions,
  // which means specific test schemas need to be created.
  // This is good for testing specific conditions for definition schemas.
  schemas: [schemaA]
});

test('schemaA is valid', () => {
  expect(schemaA).toBeValidSchema();
});

test('using schemaA to build a test schema to test a specific definition', () => {
  // This is a test schema which references a definition in one of the
  // pre-loaded schemas. This can allow us to write tests for specific
  // definitions.
  const testSchema = {
    $ref: 'schemaA#/definitions/testA'
  };

  expect(testSchema).toBeValidSchema();

  // Valid
  expect(1).toMatchSchema(testSchema);

  // This example runs through a number of values that we know don't match
  // the schema, ensuring that any future changes to the schema will require
  // the test to be updated.
  ['1', true, false, null, [], {}].forEach(value => {
     expect(value).not.toMatchSchema(testSchema);
  });
});

test('using schemaB which already references a definition in schemaA', () => {
  expect(schemaB).toBeValidSchema();

  // Valid
  ['', '1', null].forEach(value => {
    expect(value).toMatchSchema(schemaB);
  });

  // Invalid
  ['1', true, false, [], {}].forEach(value => {
     expect(value).not.toMatchSchema(schemaB);
  });
});

TypeScript support

If you would like to use jest-json-schema library in your TypeScript project, remember to install type definitions from @types/jest-json-schema package.

npm install --save-dev @types/jest-json-schema

Or if yarn is your package manager of choice:

yarn add @types/jest-json-schema --dev

Contributing

We welcome Your interest in the American Express Open Source Community on Github. Any Contributor to any Open Source Project managed by the American Express Open Source Community must accept and sign an Agreement indicating agreement to the terms below. Except for the rights granted in this Agreement to American Express and to recipients of software distributed by American Express, You reserve all right, title, and interest, if any, in and to Your Contributions. Please fill out the Agreement.

Please feel free to open pull requests and see CONTRIBUTING.md to learn how to get started contributing.

License

Any contributions made under this project will be governed by the Apache License 2.0.

Code of Conduct

This project adheres to the American Express Community Guidelines. By participating, you are expected to honor these guidelines.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].