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.
		
		
		
		
		
			
		
			
				
					382 lines
				
				6.5 KiB
			
		
		
			
		
	
	
					382 lines
				
				6.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const test = require('tap').test | ||
|  | const build = require('..') | ||
|  | 
 | ||
|  | test('object with allOf and multiple schema on the allOf', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with allOf and multiple schema on the allOf', | ||
|  |     type: 'object', | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         type: 'object', | ||
|  |         required: [ | ||
|  |           'name' | ||
|  |         ], | ||
|  |         properties: { | ||
|  |           name: { | ||
|  |             type: 'string' | ||
|  |           }, | ||
|  |           tag: { | ||
|  |             type: 'string' | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       { | ||
|  |         required: [ | ||
|  |           'id' | ||
|  |         ], | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  |   const stringify = build(schema) | ||
|  | 
 | ||
|  |   try { | ||
|  |     stringify({ | ||
|  |       id: 1 | ||
|  |     }) | ||
|  |   } catch (e) { | ||
|  |     t.equal(e.message, '"name" is required!') | ||
|  |   } | ||
|  | 
 | ||
|  |   try { | ||
|  |     stringify({ | ||
|  |       name: 'string' | ||
|  |     }) | ||
|  |   } catch (e) { | ||
|  |     t.equal(e.message, '"id" is required!') | ||
|  |   } | ||
|  | 
 | ||
|  |   t.equal(stringify({ | ||
|  |     id: 1, | ||
|  |     name: 'string' | ||
|  |   }), '{"name":"string","id":1}') | ||
|  | 
 | ||
|  |   t.equal(stringify({ | ||
|  |     id: 1, | ||
|  |     name: 'string', | ||
|  |     tag: 'otherString' | ||
|  |   }), '{"name":"string","tag":"otherString","id":1}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with allOf and one schema on the allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with allOf and one schema on the allOf', | ||
|  |     type: 'object', | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         required: [ | ||
|  |           'id' | ||
|  |         ], | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  |   const stringify = build(schema) | ||
|  | 
 | ||
|  |   const value = stringify({ | ||
|  |     id: 1 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id":1}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with allOf and no schema on the allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with allOf and no schema on the allOf', | ||
|  |     type: 'object', | ||
|  |     allOf: [] | ||
|  |   } | ||
|  | 
 | ||
|  |   try { | ||
|  |     build(schema) | ||
|  |     t.fail() | ||
|  |   } catch (e) { | ||
|  |     t.equal(e.message, 'schema is invalid: data.allOf should NOT have fewer than 1 items') | ||
|  |   } | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with nested allOfs', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with nested allOfs', | ||
|  |     type: 'object', | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         required: [ | ||
|  |           'id1' | ||
|  |         ], | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id1: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       { | ||
|  |         allOf: [ | ||
|  |           { | ||
|  |             type: 'object', | ||
|  |             properties: { | ||
|  |               id2: { | ||
|  |                 type: 'integer' | ||
|  |               } | ||
|  |             } | ||
|  |           }, | ||
|  |           { | ||
|  |             type: 'object', | ||
|  |             properties: { | ||
|  |               id3: { | ||
|  |                 type: 'integer' | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         ] | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2, | ||
|  |     id3: 3, | ||
|  |     id4: 4 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1,"id2":2,"id3":3}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with $ref in allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with $ref in allOf', | ||
|  |     type: 'object', | ||
|  |     definitions: { | ||
|  |       id1: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id1: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         $ref: '#/definitions/id1' | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with $ref and other object in allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with $ref in allOf', | ||
|  |     type: 'object', | ||
|  |     definitions: { | ||
|  |       id1: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id1: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         $ref: '#/definitions/id1' | ||
|  |       }, | ||
|  |       { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id2: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2, | ||
|  |     id3: 3 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1,"id2":2}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with multiple $refs in allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with $ref in allOf', | ||
|  |     type: 'object', | ||
|  |     definitions: { | ||
|  |       id1: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id1: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       id2: { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id2: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         $ref: '#/definitions/id1' | ||
|  |       }, | ||
|  |       { | ||
|  |         $ref: '#/definitions/id2' | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2, | ||
|  |     id3: 3 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1,"id2":2}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('allOf with nested allOf in $ref', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'allOf with nested allOf in $ref', | ||
|  |     type: 'object', | ||
|  |     definitions: { | ||
|  |       group: { | ||
|  |         type: 'object', | ||
|  |         allOf: [{ | ||
|  |           properties: { | ||
|  |             id2: { | ||
|  |               type: 'integer' | ||
|  |             } | ||
|  |           } | ||
|  |         }, { | ||
|  |           properties: { | ||
|  |             id3: { | ||
|  |               type: 'integer' | ||
|  |             } | ||
|  |           } | ||
|  |         }] | ||
|  |       } | ||
|  |     }, | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id1: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         }, | ||
|  |         required: [ | ||
|  |           'id1' | ||
|  |         ] | ||
|  |       }, | ||
|  |       { | ||
|  |         $ref: '#/definitions/group' | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2, | ||
|  |     id3: 3, | ||
|  |     id4: 4 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1,"id2":2,"id3":3}') | ||
|  | }) | ||
|  | 
 | ||
|  | test('object with external $refs in allOf', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const externalSchema = { | ||
|  |     first: { | ||
|  |       definitions: { | ||
|  |         id1: { | ||
|  |           type: 'object', | ||
|  |           properties: { | ||
|  |             id1: { | ||
|  |               type: 'integer' | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     second: { | ||
|  |       id2: { | ||
|  |         $id: '#id2', | ||
|  |         type: 'object', | ||
|  |         properties: { | ||
|  |           id2: { | ||
|  |             type: 'integer' | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const schema = { | ||
|  |     title: 'object with $ref in allOf', | ||
|  |     type: 'object', | ||
|  |     allOf: [ | ||
|  |       { | ||
|  |         $ref: 'first#/definitions/id1' | ||
|  |       }, | ||
|  |       { | ||
|  |         $ref: 'second#id2' | ||
|  |       } | ||
|  |     ] | ||
|  |   } | ||
|  | 
 | ||
|  |   const stringify = build(schema, { schema: externalSchema }) | ||
|  |   const value = stringify({ | ||
|  |     id1: 1, | ||
|  |     id2: 2, | ||
|  |     id3: 3 // extra prop shouldn't be in result
 | ||
|  |   }) | ||
|  |   t.equal(value, '{"id1":1,"id2":2}') | ||
|  | }) |