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
						
					
					
				| '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":{}}}}}}')
 | |
| })
 |