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.
158 lines
3.3 KiB
158 lines
3.3 KiB
3 years ago
|
'use strict'
|
||
|
|
||
|
const { test } = require('tap')
|
||
|
const clone = require('rfdc/default')
|
||
|
const build = require('..')
|
||
|
|
||
|
test('oneOf with $ref should not change the input schema', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const referenceSchema = {
|
||
|
$id: 'externalId',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: { type: 'string' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const schema = {
|
||
|
$id: 'mainSchema',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
people: {
|
||
|
oneOf: [{ $ref: 'externalId' }]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
const clonedSchema = clone(schema)
|
||
|
const stringify = build(schema, {
|
||
|
schema: {
|
||
|
[referenceSchema.$id]: referenceSchema
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const value = stringify({ people: { name: 'hello', foo: 'bar' } })
|
||
|
t.equal(value, '{"people":{"name":"hello"}}')
|
||
|
t.same(schema, clonedSchema)
|
||
|
})
|
||
|
|
||
|
test('oneOf and anyOf with $ref should not change the input schema', t => {
|
||
|
t.plan(3)
|
||
|
|
||
|
const referenceSchema = {
|
||
|
$id: 'externalSchema',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: { type: 'string' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const schema = {
|
||
|
$id: 'rootSchema',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
people: {
|
||
|
oneOf: [{ $ref: 'externalSchema' }]
|
||
|
},
|
||
|
love: {
|
||
|
anyOf: [
|
||
|
{ $ref: '#/definitions/foo' },
|
||
|
{ type: 'boolean' }
|
||
|
]
|
||
|
}
|
||
|
},
|
||
|
definitions: {
|
||
|
foo: { type: 'string' }
|
||
|
}
|
||
|
}
|
||
|
const clonedSchema = clone(schema)
|
||
|
const stringify = build(schema, {
|
||
|
schema: {
|
||
|
[referenceSchema.$id]: referenceSchema
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const valueAny1 = stringify({ people: { name: 'hello', foo: 'bar' }, love: 'music' })
|
||
|
const valueAny2 = stringify({ people: { name: 'hello', foo: 'bar' }, love: true })
|
||
|
|
||
|
t.equal(valueAny1, '{"people":{"name":"hello"},"love":"music"}')
|
||
|
t.equal(valueAny2, '{"people":{"name":"hello"},"love":true}')
|
||
|
t.same(schema, clonedSchema)
|
||
|
})
|
||
|
|
||
|
test('multiple $ref tree', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const referenceDeepSchema = {
|
||
|
$id: 'deepId',
|
||
|
type: 'number'
|
||
|
}
|
||
|
|
||
|
const referenceSchema = {
|
||
|
$id: 'externalId',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: { $ref: '#/definitions/foo' },
|
||
|
age: { $ref: 'deepId' }
|
||
|
},
|
||
|
definitions: {
|
||
|
foo: { type: 'string' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const schema = {
|
||
|
$id: 'mainSchema',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
people: {
|
||
|
oneOf: [{ $ref: 'externalId' }]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
const clonedSchema = clone(schema)
|
||
|
const stringify = build(schema, {
|
||
|
schema: {
|
||
|
[referenceDeepSchema.$id]: referenceDeepSchema,
|
||
|
[referenceSchema.$id]: referenceSchema
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const value = stringify({ people: { name: 'hello', foo: 'bar', age: 42 } })
|
||
|
t.equal(value, '{"people":{"name":"hello","age":42}}')
|
||
|
t.same(schema, clonedSchema)
|
||
|
})
|
||
|
|
||
|
test('must not mutate items $ref', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const referenceSchema = {
|
||
|
$id: 'ShowSchema',
|
||
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: {
|
||
|
type: 'string'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const schema = {
|
||
|
$id: 'ListSchema',
|
||
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
||
|
type: 'array',
|
||
|
items: {
|
||
|
$ref: 'ShowSchema#'
|
||
|
}
|
||
|
}
|
||
|
const clonedSchema = clone(schema)
|
||
|
const stringify = build(schema, {
|
||
|
schema: {
|
||
|
[referenceSchema.$id]: referenceSchema
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const value = stringify([{ name: 'foo' }])
|
||
|
t.equal(value, '[{"name":"foo"}]')
|
||
|
t.same(schema, clonedSchema)
|
||
|
})
|