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