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.
		
		
		
		
		
			
		
			
				
					183 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					183 lines
				
				4.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const t = require('tap')
							 | 
						||
| 
								 | 
							
								const test = t.test
							 | 
						||
| 
								 | 
							
								const semver = require('semver')
							 | 
						||
| 
								 | 
							
								const validator = require('is-my-json-valid')
							 | 
						||
| 
								 | 
							
								const proxyquire = require('proxyquire')
							 | 
						||
| 
								 | 
							
								const build = proxyquire('..', { long: null })
							 | 
						||
| 
								 | 
							
								const ROUNDING_TYPES = ['ceil', 'floor', 'round']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render an integer as JSON', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = {
							 | 
						||
| 
								 | 
							
								    title: 'integer',
							 | 
						||
| 
								 | 
							
								    type: 'integer'
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema)
							 | 
						||
| 
								 | 
							
								  const output = stringify(1615)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '1615')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render a float as an integer', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    build({
							 | 
						||
| 
								 | 
							
								      title: 'float as integer',
							 | 
						||
| 
								 | 
							
								      type: 'integer'
							 | 
						||
| 
								 | 
							
								    }, { rounding: 'foobar' })
							 | 
						||
| 
								 | 
							
								  } catch (error) {
							 | 
						||
| 
								 | 
							
								    t.ok(error)
							 | 
						||
| 
								 | 
							
								    t.equal(error.message, 'Unsupported integer rounding method foobar')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render a float as an integer', (t) => {
							 | 
						||
| 
								 | 
							
								  const cases = [
							 | 
						||
| 
								 | 
							
								    { input: Math.PI, output: '3' },
							 | 
						||
| 
								 | 
							
								    { input: 5.0, output: '5' },
							 | 
						||
| 
								 | 
							
								    { input: null, output: '0' },
							 | 
						||
| 
								 | 
							
								    { input: 0, output: '0' },
							 | 
						||
| 
								 | 
							
								    { input: 0.0, output: '0' },
							 | 
						||
| 
								 | 
							
								    { input: 42, output: '42' },
							 | 
						||
| 
								 | 
							
								    { input: 1.99999, output: '1' },
							 | 
						||
| 
								 | 
							
								    { input: -45.05, output: '-45' },
							 | 
						||
| 
								 | 
							
								    { input: 0.95, output: '1', rounding: 'ceil' },
							 | 
						||
| 
								 | 
							
								    { input: 0.2, output: '1', rounding: 'ceil' },
							 | 
						||
| 
								 | 
							
								    { input: 45.95, output: '45', rounding: 'floor' },
							 | 
						||
| 
								 | 
							
								    { input: -45.05, output: '-46', rounding: 'floor' },
							 | 
						||
| 
								 | 
							
								    { input: 45.44, output: '45', rounding: 'round' },
							 | 
						||
| 
								 | 
							
								    { input: 45.95, output: '46', rounding: 'round' }
							 | 
						||
| 
								 | 
							
								  ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.plan(cases.length * 2)
							 | 
						||
| 
								 | 
							
								  cases.forEach(checkInteger)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function checkInteger ({ input, output, rounding }) {
							 | 
						||
| 
								 | 
							
								    const schema = {
							 | 
						||
| 
								 | 
							
								      title: 'float as integer',
							 | 
						||
| 
								 | 
							
								      type: 'integer'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								    const stringify = build(schema, { rounding })
							 | 
						||
| 
								 | 
							
								    const str = stringify(input)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    t.equal(str, output)
							 | 
						||
| 
								 | 
							
								    t.ok(validate(JSON.parse(str)), 'valid schema')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render an object with an integer as JSON', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = {
							 | 
						||
| 
								 | 
							
								    title: 'object with integer',
							 | 
						||
| 
								 | 
							
								    type: 'object',
							 | 
						||
| 
								 | 
							
								    properties: {
							 | 
						||
| 
								 | 
							
								      id: {
							 | 
						||
| 
								 | 
							
								        type: 'integer'
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema)
							 | 
						||
| 
								 | 
							
								  const output = stringify({
							 | 
						||
| 
								 | 
							
								    id: 1615
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '{"id":1615}')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render an array with an integer as JSON', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = {
							 | 
						||
| 
								 | 
							
								    title: 'array with integer',
							 | 
						||
| 
								 | 
							
								    type: 'array',
							 | 
						||
| 
								 | 
							
								    items: {
							 | 
						||
| 
								 | 
							
								      type: 'integer'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema)
							 | 
						||
| 
								 | 
							
								  const output = stringify([1615])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '[1615]')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('render an object with an additionalProperty of type integer as JSON', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = {
							 | 
						||
| 
								 | 
							
								    title: 'object with integer',
							 | 
						||
| 
								 | 
							
								    type: 'object',
							 | 
						||
| 
								 | 
							
								    additionalProperties: {
							 | 
						||
| 
								 | 
							
								      type: 'integer'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema)
							 | 
						||
| 
								 | 
							
								  const output = stringify({
							 | 
						||
| 
								 | 
							
								    num: 1615
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '{"num":1615}')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (semver.gt(process.versions.node, '10.3.0')) {
							 | 
						||
| 
								 | 
							
								  require('./bigint')(t.test, build)
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
								  t.pass('Skip because Node version < 10.4')
							 | 
						||
| 
								 | 
							
								  t.end()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('should round integer object parameter', t => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = { type: 'object', properties: { magic: { type: 'integer' } } }
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema, { rounding: 'ceil' })
							 | 
						||
| 
								 | 
							
								  const output = stringify({ magic: 4.2 })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '{"magic":5}')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('should not stringify a property if it does not exist', t => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const schema = { title: 'Example Schema', type: 'object', properties: { age: { type: 'integer' } } }
							 | 
						||
| 
								 | 
							
								  const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								  const stringify = build(schema)
							 | 
						||
| 
								 | 
							
								  const output = stringify({})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.equal(output, '{}')
							 | 
						||
| 
								 | 
							
								  t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ROUNDING_TYPES.forEach((rounding) => {
							 | 
						||
| 
								 | 
							
								  test(`should not stringify a property if it does not exist (rounding: ${rounding})`, t => {
							 | 
						||
| 
								 | 
							
								    t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const schema = { type: 'object', properties: { magic: { type: 'integer' } } }
							 | 
						||
| 
								 | 
							
								    const validate = validator(schema)
							 | 
						||
| 
								 | 
							
								    const stringify = build(schema, { rounding })
							 | 
						||
| 
								 | 
							
								    const output = stringify({})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    t.equal(output, '{}')
							 | 
						||
| 
								 | 
							
								    t.ok(validate(JSON.parse(output)), 'valid schema')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |