- Notifications
You must be signed in to change notification settings - Fork14
✨ JSON schema matcher for Jest
License
americanexpress/jest-json-schema
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
JSON schema matcher forjest
Want to get paid for your contributions to
jest-json-schema?Send your resume tooneamex.careers@aexp.com
Validates that an object matches the givenJSON schema
it('validates my json',()=>{constschema={properties:{hello:{type:'string'},},required:['hello'],};expect({hello:'world'}).toMatchSchema(schema);});
$ npm install --save-dev jest-json-schema
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 atest framework script file
You can passAjv options usingmatchersWithOptions and passing it your options object. The only option passedby default isallErrors: true.
import{matchersWithOptions}from'jest-json-schema';constformats={bcp47:/^[a-z]{2}-[A-Z]{2}$/,}expect.extend(matchersWithOptions({ formats}));
Additionally you can also use a callback to further configure and extendthe Ajv instance used by the matchers:
importajvKeywordsfrom'ajv-keywords';import{matchersWithOptions}from'jest-json-schema';constformats={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 theAjv class with theAjvClass option:
importAjv2020from'ajv/dist/2020'import{matchersWithOptions}from'jest-json-schema';expect.extend(matchersWithOptions({AjvClass:Ajv2020}));
Ajv supports a verbose option flag which enables more information about individualerrors. This extra information can mean that we can output to Jest more meaningfulerrors that can help the development process:
const{ matchersWithOptions}=require('jest-json-schema');expect.extend(matchersWithOptions({verbose:true}));test('check that property errors are outputted',()=>{constschema={$id:'testSchema',type:'object',properties:{name:{type:'string',},dob:{type:'string',format:'date',},},};constinvalidData={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"`);});
If you organise your schemas into separate files and use refs which point to thevarious different schemas, it will be important to include those dependentschema files when extending Jest'sexpect handler, using thematchersWithOptionsinterface:
{"$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"] } }}{"$id":"schemaB","$schema":"http://json-schema.org/draft-07/schema#","description":"Example of a schema that references another schema.","$ref":"schemaA#/definitions/testB"}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.constschemaA=require('./schemaA.json');constschemaB=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.consttestSchema={$ref:'schemaA#/definitions/testA'};expect(testSchema).toBeValidSchema();// Validexpect(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);});});
If you would like to usejest-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-schemaOr ifyarn is your package manager of choice:
yarn add @types/jest-json-schema --devWe welcome Your interest in the American Express Open Source Community on Github.Any Contributor to any Open Source Project managed by the American Express OpenSource Community must accept and sign an Agreement indicating agreement to theterms below. Except for the rights granted in this Agreement to American Expressand to recipients of software distributed by American Express, You reserve allright, title, and interest, if any, in and to Your Contributions. Pleasefillout the Agreement.
Please feel free to open pull requests and seeCONTRIBUTING.md to learn how to get started contributing.
Any contributions made under this project will be governed by theApache License2.0.
This project adheres to theAmerican Express Community Guidelines.By participating, you are expected to honor these guidelines.
About
✨ JSON schema matcher for Jest
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.