Add `yarn validate` for JSON testing
[incubator-annotator.git] / test / data-model.mjs
1 /* global require, process, describe, before, it, assert */
2
3 import fs from 'fs';
4 import URL from 'url';
5
6 import Ajv from 'ajv';
7 const ajv = new Ajv({ schemaId: 'auto' });
8 ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json'));
9
10 // add defintion files to available schemas
11 const defs = fs.readdirSync('node_modules/web-annotation-tests/definitions/');
12 defs.forEach(def => {
13   if (def.substr(-4) === 'json')
14     ajv.addSchema(require('web-annotation-tests/definitions/' + def));
15 });
16
17 // file or URL location
18 let url = '';
19 // find the URL parameter (which might be a relative path to a file)
20 let found_url = false;
21 process.argv.forEach((val, index) => {
22   if (val.startsWith('--url')) {
23     found_url = true;
24     if (val[5] === '=') {
25       url = val.split('=')[1];
26     } else {
27       // assume the next parameter is a URL
28       url = process.argv[index + 1];
29     }
30   }
31 });
32
33 // load the annotationMusts test list
34 const musts = JSON.parse(
35   fs.readFileSync(
36     'node_modules/web-annotation-tests/annotations/annotationMusts.test'
37   )
38 );
39
40 describe('Test JSON against Schemas', () => {
41   let data = '';
42
43   before(function() {
44     if (!found_url) {
45       this.skip();
46     } else {
47       // load the data from the file or URL
48       let url_parsed = URL.parse(url);
49       if (url_parsed.path !== url_parsed.href) {
50         // TODO: GET the URL's JSON and use that
51       } else {
52         // assume we have a local file and use that
53         data = JSON.parse(fs.readFileSync(url_parsed.path, 'utf8'));
54       }
55       if (data === '') {
56         this.skip();
57       }
58     }
59   });
60
61   musts.assertions.forEach(path => {
62     const schema = require('web-annotation-tests/' + path);
63     it(schema.title, () => {
64       let valid = ajv.validate(schema, data);
65       assert.isOk(valid, ajv.errorsText());
66     });
67   });
68 });