'use strict' const test = require('tap').test const build = require('..') test('use toJSON method on object types', (t) => { t.plan(1) const stringify = build({ title: 'simple object', type: 'object', properties: { productName: { type: 'string' } } }) const object = { product: { name: 'cola' }, toJSON: function () { return { productName: this.product.name } } } t.equal('{"productName":"cola"}', stringify(object)) }) test('use toJSON method on nested object types', (t) => { t.plan(1) const stringify = build({ title: 'simple array', type: 'array', items: { type: 'object', properties: { productName: { type: 'string' } } } }) const array = [ { product: { name: 'cola' }, toJSON: function () { return { productName: this.product.name } } }, { product: { name: 'sprite' }, toJSON: function () { return { productName: this.product.name } } } ] t.equal('[{"productName":"cola"},{"productName":"sprite"}]', stringify(array)) }) test('not use toJSON if does not exist', (t) => { t.plan(1) const stringify = build({ title: 'simple object', type: 'object', properties: { product: { type: 'object', properties: { name: { type: 'string' } } } } }) const object = { product: { name: 'cola' } } t.equal('{"product":{"name":"cola"}}', stringify(object)) }) test('not fail on null object declared nullable', (t) => { t.plan(1) const stringify = build({ title: 'simple object', type: 'object', nullable: true, properties: { product: { type: 'object', properties: { name: { type: 'string' } } } } }) t.equal('null', stringify(null)) }) test('not fail on null sub-object declared nullable', (t) => { t.plan(1) const stringify = build({ title: 'simple object', type: 'object', properties: { product: { nullable: true, type: 'object', properties: { name: { type: 'string' } } } } }) const object = { product: null } t.equal('{"product":null}', stringify(object)) }) test('throw an error on non nullable null sub-object', (t) => { t.plan(1) const stringify = build({ title: 'simple object', type: 'object', properties: { product: { nullable: false, type: 'object', properties: { name: { type: 'string' } } } } }) const object = { product: null } t.throws(() => { stringify(object) }) }) test('throw an error on non nullable null object', (t) => { t.plan(1) const stringify = build({ title: 'simple object', nullable: false, type: 'object', properties: { product: { nullable: false, type: 'object', properties: { name: { type: 'string' } } } } }) t.throws(() => { stringify(null) }) })