You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
6.5 KiB
382 lines
6.5 KiB
3 years ago
|
'use strict'
|
||
|
|
||
|
const test = require('tap').test
|
||
|
const build = require('..')
|
||
|
|
||
|
test('object with allOf and multiple schema on the allOf', (t) => {
|
||
|
t.plan(4)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with allOf and multiple schema on the allOf',
|
||
|
type: 'object',
|
||
|
allOf: [
|
||
|
{
|
||
|
type: 'object',
|
||
|
required: [
|
||
|
'name'
|
||
|
],
|
||
|
properties: {
|
||
|
name: {
|
||
|
type: 'string'
|
||
|
},
|
||
|
tag: {
|
||
|
type: 'string'
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
required: [
|
||
|
'id'
|
||
|
],
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
const stringify = build(schema)
|
||
|
|
||
|
try {
|
||
|
stringify({
|
||
|
id: 1
|
||
|
})
|
||
|
} catch (e) {
|
||
|
t.equal(e.message, '"name" is required!')
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
stringify({
|
||
|
name: 'string'
|
||
|
})
|
||
|
} catch (e) {
|
||
|
t.equal(e.message, '"id" is required!')
|
||
|
}
|
||
|
|
||
|
t.equal(stringify({
|
||
|
id: 1,
|
||
|
name: 'string'
|
||
|
}), '{"name":"string","id":1}')
|
||
|
|
||
|
t.equal(stringify({
|
||
|
id: 1,
|
||
|
name: 'string',
|
||
|
tag: 'otherString'
|
||
|
}), '{"name":"string","tag":"otherString","id":1}')
|
||
|
})
|
||
|
|
||
|
test('object with allOf and one schema on the allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with allOf and one schema on the allOf',
|
||
|
type: 'object',
|
||
|
allOf: [
|
||
|
{
|
||
|
required: [
|
||
|
'id'
|
||
|
],
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
const stringify = build(schema)
|
||
|
|
||
|
const value = stringify({
|
||
|
id: 1
|
||
|
})
|
||
|
t.equal(value, '{"id":1}')
|
||
|
})
|
||
|
|
||
|
test('object with allOf and no schema on the allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with allOf and no schema on the allOf',
|
||
|
type: 'object',
|
||
|
allOf: []
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
build(schema)
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.equal(e.message, 'schema is invalid: data.allOf should NOT have fewer than 1 items')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('object with nested allOfs', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with nested allOfs',
|
||
|
type: 'object',
|
||
|
allOf: [
|
||
|
{
|
||
|
required: [
|
||
|
'id1'
|
||
|
],
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
allOf: [
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id2: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id3: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema)
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2,
|
||
|
id3: 3,
|
||
|
id4: 4 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1,"id2":2,"id3":3}')
|
||
|
})
|
||
|
|
||
|
test('object with $ref in allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with $ref in allOf',
|
||
|
type: 'object',
|
||
|
definitions: {
|
||
|
id1: {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
allOf: [
|
||
|
{
|
||
|
$ref: '#/definitions/id1'
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema)
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1}')
|
||
|
})
|
||
|
|
||
|
test('object with $ref and other object in allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with $ref in allOf',
|
||
|
type: 'object',
|
||
|
definitions: {
|
||
|
id1: {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
allOf: [
|
||
|
{
|
||
|
$ref: '#/definitions/id1'
|
||
|
},
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id2: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema)
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2,
|
||
|
id3: 3 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1,"id2":2}')
|
||
|
})
|
||
|
|
||
|
test('object with multiple $refs in allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with $ref in allOf',
|
||
|
type: 'object',
|
||
|
definitions: {
|
||
|
id1: {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
id2: {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id2: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
allOf: [
|
||
|
{
|
||
|
$ref: '#/definitions/id1'
|
||
|
},
|
||
|
{
|
||
|
$ref: '#/definitions/id2'
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema)
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2,
|
||
|
id3: 3 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1,"id2":2}')
|
||
|
})
|
||
|
|
||
|
test('allOf with nested allOf in $ref', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const schema = {
|
||
|
title: 'allOf with nested allOf in $ref',
|
||
|
type: 'object',
|
||
|
definitions: {
|
||
|
group: {
|
||
|
type: 'object',
|
||
|
allOf: [{
|
||
|
properties: {
|
||
|
id2: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
properties: {
|
||
|
id3: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}]
|
||
|
}
|
||
|
},
|
||
|
allOf: [
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
},
|
||
|
required: [
|
||
|
'id1'
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
$ref: '#/definitions/group'
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema)
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2,
|
||
|
id3: 3,
|
||
|
id4: 4 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1,"id2":2,"id3":3}')
|
||
|
})
|
||
|
|
||
|
test('object with external $refs in allOf', (t) => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const externalSchema = {
|
||
|
first: {
|
||
|
definitions: {
|
||
|
id1: {
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id1: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
second: {
|
||
|
id2: {
|
||
|
$id: '#id2',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
id2: {
|
||
|
type: 'integer'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const schema = {
|
||
|
title: 'object with $ref in allOf',
|
||
|
type: 'object',
|
||
|
allOf: [
|
||
|
{
|
||
|
$ref: 'first#/definitions/id1'
|
||
|
},
|
||
|
{
|
||
|
$ref: 'second#id2'
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const stringify = build(schema, { schema: externalSchema })
|
||
|
const value = stringify({
|
||
|
id1: 1,
|
||
|
id2: 2,
|
||
|
id3: 3 // extra prop shouldn't be in result
|
||
|
})
|
||
|
t.equal(value, '{"id1":1,"id2":2}')
|
||
|
})
|