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