Skip to content

Commit

Permalink
Better validation error messages for headers
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam Kliment committed May 21, 2015
1 parent 457dd69 commit 4420ef6
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 7 deletions.
21 changes: 21 additions & 0 deletions src/utils/tv4-to-headers-message.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module.exports = (message) ->
if message.indexOf("Missing required property:") > 1
headerName = message.split("Missing required property: ")[1]
newMessage = "Header '#{headerName}' is missing"

else if message.indexOf("No enum match for: ") > 1
splitted = message.split '\' No enum match for: "'

headerName = splitted[0]
headerName = headerName.replace(/^At '\//, '')

headerValue = splitted[1]
headerValue = headerValue.replace(/"$/, '')


newMessage = "Header '#{headerName}' doesn't have value '#{headerValue}'"

else
throw new Error 'Unknown tv4 error message can\'t convert to headers message.'

return newMessage
15 changes: 13 additions & 2 deletions src/validators/headers-json-example.coffee
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
errors = require '../errors'
{JsonSchema} = require './json-schema'
{SchemaV4Generator, SchemaV4Properties} = require('../utils/schema-v4-generator')
{SchemaV4Generator, SchemaV4Properties} = require '../utils/schema-v4-generator'
tv4ToHeadersMessage = require '../utils/tv4-to-headers-message'

jsonPointer = require 'json-pointer'
type = require 'is-type'
type = require 'is-type'


# Checks data, prepares validator and validates request or response headers against given expected headers or json schema
# @author Peter Grilli <tully@apiary.io>
Expand Down Expand Up @@ -34,6 +37,14 @@ class HeadersJsonExample extends JsonSchema

super @real, @schema

validate: ->

result = super()
if result.length > 0
for i in [0..(result.length - 1)]
result[i]['message'] = tv4ToHeadersMessage result[i]['message']

result
#@private
prepareHeaders: (headers) ->
if not type.object(headers)
Expand Down
1 change: 0 additions & 1 deletion src/validators/json-schema.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ class JsonSchema

unless dataIsTheSame and schemaIsTheSame
@output = @validatePrivate()

return @output

evaluateOutputToResults: (data) ->
Expand Down
23 changes: 23 additions & 0 deletions test/unit/utils/tv4-to-headers-message-test.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{assert} = require 'chai'
tv4ToHeadersMessage = require '../../../src/utils/tv4-to-headers-message'

describe 'tv4ToHeadersMessages()', ->

describe 'when message for missing header', ->
it 'should return message with right text', ->
tv4Message = 'At \'/header2\' Missing required property: header2'
message = tv4ToHeadersMessage(tv4Message)
assert.equal message, "Header 'header2' is missing"

describe 'when message for different value', ->
it 'should return message with right text', ->
tv4Message = 'At \'/content-type\' No enum match for: "application/fancy-madiatype"'
message = tv4ToHeadersMessage(tv4Message)
assert.equal message, "Header 'content-type' doesn't have value 'application/fancy-madiatype'"

describe 'when unknonw message', ->
it 'should throw an error', ->
fn = () ->
tv4ToHeadersMessage("String does not match pattern: {pattern}")
assert.throws fn

21 changes: 17 additions & 4 deletions test/unit/validators/headers-json-example-validator-test.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{assert} = require('chai')
{HeadersJsonExample} = require('../../../src/validators/headers-json-example')
{HeadersJsonExample} = require '../../../src/validators/headers-json-example'
fixtures = require '../../fixtures'
shared = require '../support/amanda-to-gavel-shared'

Expand Down Expand Up @@ -53,24 +53,35 @@ describe 'HeadersJsonExample', ->
assert.lengthOf result, 0

describe 'when key is missing in provided headers', ->
before ->
beforeEach ->
headersValidator = new HeadersJsonExample fixtures.sampleHeadersMissing , fixtures.sampleHeaders
describe 'and i run validate()', ->
it "should return 1 error", ->
result = headersValidator.validate()
assert.equal result.length, 1

it 'should have beautiful error message', ->
result = headersValidator.validate()
assert.equal result[0].message, "Header 'header2' is missing"

describe 'when value of content negotiation header in provided headers differs', ->
before ->
beforeEach ->
headersValidator = new HeadersJsonExample fixtures.sampleHeadersDiffers , fixtures.sampleHeaders

describe 'and i run validate()', ->
it "should return 1 errors", ->
result = headersValidator.validate()
assert.equal result.length, 1

it 'should have beautiful error message', ->
result = headersValidator.validate()
console.log result
assert.equal result[0].message, "Header 'content-type' doesn't have value 'application/fancy-madiatype'"

describe 'when key is added to provided headers', ->
before ->
headersValidator = new HeadersJsonExample fixtures.sampleHeadersAdded , fixtures.sampleHeaders

describe 'and i run validate()', ->
it "shouldn't return any errors", ->
result = headersValidator.validate()
Expand All @@ -84,14 +95,16 @@ describe 'HeadersJsonExample', ->
result = headersValidator.validate()
assert.equal result.length, 2

describe 'when non content negotiation header heeader values differs', ->
describe 'when non content negotiation header header values differs', ->
before ->
headersValidator = new HeadersJsonExample fixtures.sampleHeadersWithNonContentNegotiationChanged, fixtures.sampleHeadersNonContentNegotiation

describe 'and i run validate()', ->
it "shouldn't return any errors", ->
result = headersValidator.validate()
assert.equal result.length, 0


describe '#validate()', () ->
output = null
before () ->
Expand Down

0 comments on commit 4420ef6

Please sign in to comment.