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.
		
		
		
		
		
			
		
			
				
					181 lines
				
				4.2 KiB
			
		
		
			
		
	
	
					181 lines
				
				4.2 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const test = require('tap').test | ||
|  | const build = require('..') | ||
|  | 
 | ||
|  | test('can stringify recursive directory tree (issue #181)', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     definitions: { | ||
|  |       directory: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           name: { type: 'string' }, | ||
|  |           subDirectories: { | ||
|  |             type: 'array', | ||
|  |             items: { $ref: '#/definitions/directory' }, | ||
|  |             default: [] | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     type: 'array', | ||
|  |     items: { $ref: '#/definitions/directory' } | ||
|  |   } | ||
|  |   const stringify = build(schema) | ||
|  | 
 | ||
|  |   t.equal(stringify([ | ||
|  |     { name: 'directory 1', subDirectories: [] }, | ||
|  |     { | ||
|  |       name: 'directory 2', | ||
|  |       subDirectories: [ | ||
|  |         { name: 'directory 2.1', subDirectories: [] }, | ||
|  |         { name: 'directory 2.2', subDirectories: [] } | ||
|  |       ] | ||
|  |     } | ||
|  |   ]), '[{"name":"directory 1","subDirectories":[]},{"name":"directory 2","subDirectories":[{"name":"directory 2.1","subDirectories":[]},{"name":"directory 2.2","subDirectories":[]}]}]') | ||
|  | }) | ||
|  | 
 | ||
|  | test('can stringify when recursion in external schema', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const referenceSchema = { | ||
|  |     $id: 'person', | ||
|  |     type: 'object', | ||
|  |     properties: { | ||
|  |       name: { type: 'string' }, | ||
|  |       children: { | ||
|  |         type: 'array', | ||
|  |         items: { $ref: '#' } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     $id: 'mainSchema', | ||
|  |     type: 'object', | ||
|  |     properties: { | ||
|  |       people: { | ||
|  |         $ref: 'person' | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   const stringify = build(schema, { | ||
|  |     schema: { | ||
|  |       [referenceSchema.$id]: referenceSchema | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   const value = stringify({ people: { name: 'Elizabeth', children: [{ name: 'Charles' }] } }) | ||
|  |   t.equal(value, '{"people":{"name":"Elizabeth","children":[{"name":"Charles"}]}}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('use proper serialize function', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const personSchema = { | ||
|  |     $id: 'person', | ||
|  |     type: 'object', | ||
|  |     properties: { | ||
|  |       name: { type: 'string' }, | ||
|  |       children: { | ||
|  |         type: 'array', | ||
|  |         items: { $ref: '#' } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const directorySchema = { | ||
|  |     $id: 'directory', | ||
|  |     type: 'object', | ||
|  |     properties: { | ||
|  |       name: { type: 'string' }, | ||
|  |       subDirectories: { | ||
|  |         type: 'array', | ||
|  |         items: { $ref: '#' }, | ||
|  |         default: [] | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     $id: 'mainSchema', | ||
|  |     type: 'object', | ||
|  |     properties: { | ||
|  |       people: { $ref: 'person' }, | ||
|  |       directory: { $ref: 'directory' } | ||
|  |     } | ||
|  |   } | ||
|  |   const stringify = build(schema, { | ||
|  |     schema: { | ||
|  |       [personSchema.$id]: personSchema, | ||
|  |       [directorySchema.$id]: directorySchema | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   const value = stringify({ | ||
|  |     people: { | ||
|  |       name: 'Elizabeth', | ||
|  |       children: [{ | ||
|  |         name: 'Charles', | ||
|  |         children: [{ name: 'William', children: [{ name: 'George' }, { name: 'Charlotte' }] }, { name: 'Harry' }] | ||
|  |       }] | ||
|  |     }, | ||
|  |     directory: { | ||
|  |       name: 'directory 1', | ||
|  |       subDirectories: [ | ||
|  |         { name: 'directory 1.1', subDirectories: [] }, | ||
|  |         { | ||
|  |           name: 'directory 1.2', | ||
|  |           subDirectories: [{ name: 'directory 1.2.1' }, { name: 'directory 1.2.2' }] | ||
|  |         } | ||
|  |       ] | ||
|  |     } | ||
|  |   }) | ||
|  |   t.equal(value, '{"people":{"name":"Elizabeth","children":[{"name":"Charles","children":[{"name":"William","children":[{"name":"George"},{"name":"Charlotte"}]},{"name":"Harry"}]}]},"directory":{"name":"directory 1","subDirectories":[{"name":"directory 1.1","subDirectories":[]},{"name":"directory 1.2","subDirectories":[{"name":"directory 1.2.1","subDirectories":[]},{"name":"directory 1.2.2","subDirectories":[]}]}]}}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('can stringify recursive references in object types (issue #365)', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     type: 'object', | ||
|  |     definitions: { | ||
|  |       parentCategory: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           parent: { | ||
|  |             $ref: '#/definitions/parentCategory' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     properties: { | ||
|  |       category: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           parent: { | ||
|  |             $ref: '#/definitions/parentCategory' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const data = { | ||
|  |     category: { | ||
|  |       parent: { | ||
|  |         parent: { | ||
|  |           parent: { | ||
|  |             parent: {} | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   const value = stringify(data) | ||
|  |   t.equal(value, '{"category":{"parent":{"parent":{"parent":{"parent":{}}}}}}') | ||
|  | }) |