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