@bidvol/openrtb-schema-validator
Version:
OpenRTB parser and validator
120 lines (99 loc) • 3.19 kB
JavaScript
/* eslint-env node, mocha */
const { expect } = require('chai')
const { parser, schemas } = require('../src')
const basePayload = {
id: '1',
test: 0,
imp: [
{
id: '7'
}
]
}
const invalidPayload = {
id: '1',
imp: [
{
id: '7',
banner: {
pos: [101, 102]
}
}
]
}
function duplicate (obj) {
return JSON.parse(JSON.stringify(obj))
}
function baseCompare (requestParser, origin, done) {
const payload = requestParser.open(origin)
if (!payload.validate()) {
return done(payload.error)
}
expect(payload.root).to.deep.equal(basePayload)
done()
}
describe('2.5 request', function () {
it('should validate correct payload', function (done) {
baseCompare(parser(schemas.request['2.5']), duplicate(basePayload), done)
})
it('should coerce payload correctly', function (done) {
const origin = duplicate(basePayload)
origin.test = '0'
baseCompare(parser(schemas.request['2.5'], {
coerceTypes: true
}), origin, done)
})
it('should reject additional properties', function (done) {
const origin = duplicate(basePayload)
origin.foo = 'bar'
baseCompare(parser(schemas.request['2.5'], {
removeAdditional: false,
coerceTypes: true
}), origin, err => {
expect(err._errors[0].params.additionalProperty).to.equal('foo')
done()
})
})
it('should remove additional properties', function (done) {
const origin = duplicate(basePayload)
origin.foo = 'bar'
baseCompare(parser(schemas.request['2.5'], {
removeAdditional: true
}), origin, done)
})
it('should allow registering schema modifications', function (done) {
const schema = schemas.request['2.5'].clone()
schema.root.properties.foo = { type: 'string' }
const requestParser = parser(schema)
const origin = duplicate(basePayload)
origin.foo = 'bar'
const { error, data } = requestParser.validate(origin)
if (error) return done(error)
expect(data).to.deep.equal(origin)
done()
})
it('should pass validation with blacklist', function (done) {
const schema = schemas.request['2.5'].clone()
const requestParser = parser(schema, { blacklist: ['.imp.banner.pos'] })
const origin = duplicate(invalidPayload)
const { error } = requestParser.validate(origin)
if (error) return done(error)
done()
})
it('should pass validation with whitelist', function (done) {
const schema = schemas.request['2.5'].clone()
const requestParser = parser(schema, { whitelist: ['.id', '.imp.id'] })
const origin = duplicate(invalidPayload)
const { error } = requestParser.validate(origin)
if (error) return done(error)
done()
})
it('should fail validation without blacklist or whitelist', function (done) {
const schema = schemas.request['2.5'].clone()
const requestParser = parser(schema)
const origin = duplicate(invalidPayload)
const { error } = requestParser.validate(origin)
if (error) return done()
done(new Error('validation passed'))
})
})