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)
							 | 
						||
| 
								 | 
							
								})
							 |