diff --git a/README.md b/README.md index 86caed5..f57b5d4 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,19 @@ npm install gavel2html ## Usage ```javascript -Gavel2Html = require('gavel2html'); +const gavel = require('gavel'); +const Gavel2Html = require('gavel2html'); + +// Perform Gavel validation +const gavelResult = gavel(expected, actual); const gavel2html = new Gavel2Html({ + // Pass the name of the field you wish to render + fieldName: 'body', + // ...and the validation result chunk for that field + fieldResult: gavelResult.fields.body, + + // ...not sure values are even needed dataReal: '{"name": "hell"}', dataExpected: '{"name": "hello"}', }); diff --git a/package-lock.json b/package-lock.json index 1c6c023..b638ada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gavel2html", - "version": "1.0.2", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a26556b..67c5450 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gavel2html", - "version": "1.0.2", + "version": "2.0.0", "description": "Convert output from Gavel to HTML", "main": "lib/index.js", "scripts": { diff --git a/src/converter.coffee b/src/converter.coffee index 4ff6af2..913a3ab 100644 --- a/src/converter.coffee +++ b/src/converter.coffee @@ -21,7 +21,7 @@ escapeBasicHtml = (val) -> class Converter - constructor: ({@dataReal, @dataExpected, @gavelResult, @usePointers}) -> + constructor: ({@dataReal, @dataExpected, @fieldResult, @usePointers}) -> @usedErrors = [] getHtml: (options = {}) -> @@ -118,72 +118,38 @@ class Converter compiledPointersKey = 'lowercased' return [transformKeysFn, compiledPointersKey] - #@private - # aggregate all errors for given path and mark them with state missing, added, changed etc.. - getStateAndMessageFromAmandaResult: ({pathArray, lowerCasedKeys}) -> - resultsCount = @gavelResult?.rawData?.length or 0 - state = 0 - message = '' - - if resultsCount - [transformKeysFn, compiledPointersKey] = @getPointerTransformKeys lowerCasedKeys - @buildDataRealPointers {transformKeysFn, compiledPointersKey} - - pathArrayTransformed = pathArray.map transformKeysFn - - for i in [0..resultsCount-1] - if @areArraysIdentical pathArrayTransformed, @gavelResult.rawData[i]?['property'] or [] - errorPointer = jsonPointer.compile(@gavelResult.rawData[i]?['property'] or []) - # key is missing in real and is present in expected, so it's missing - if errorPointer not in @dataRealPointers[compiledPointersKey] - if message - message = ' | ' + message - message = @gavelResult.rawData[i]['message'] + message - state = -1 - - else - - # key is present in both real and expected, so its changed (different value primitive type probably) - if not state - state = 2 - if message - message += " | " - message += @gavelResult.rawData[i]['message'] - - return {pathArray: pathArray, 'state': state, 'message': message} - #@private # aggregate all errors for given path and mark them with state missing, added, changed etc.. getStateAndMessageFromResults: ({pathArray, lowerCasedKeys}) -> - resultsCount = @gavelResult?.results?.length + errorsCount = @fieldResult?.errors?.length state = 0 message = '' - if resultsCount + if errorsCount [transformKeysFn, compiledPointersKey] = @getPointerTransformKeys lowerCasedKeys @buildDataRealPointers {transformKeysFn, compiledPointersKey} pathArrayTransformed = pathArray.map(transformKeysFn) - for result in @gavelResult.results - if result['pointer']? # filter out non json related errors - if @areArraysIdentical pathArrayTransformed, jsonPointer.parse(result['pointer']) - errorPointer = result['pointer'] + for error in @fieldResult.errors + errorPointer = error.location?.pointer + + if errorPointer? # filter out non json related errors + if @areArraysIdentical pathArrayTransformed, jsonPointer.parse(errorPointer) # key is missing in real and is present in expected, so it's missing if errorPointer not in @dataRealPointers[compiledPointersKey] if message message = ' | ' + message - message = result['message'] + message + message = error['message'] + message state = -1 else - # key is present in both real and expected, so its changed (different value primitive typeprobably) if not state state = 2 if message message += " | " - message += result['message'] + message += error['message'] return {pathArray: pathArray, 'state': state, 'message': message} diff --git a/src/gavel2html.coffee b/src/gavel2html.coffee index 6ce4b89..323e85d 100644 --- a/src/gavel2html.coffee +++ b/src/gavel2html.coffee @@ -14,14 +14,17 @@ transformJsonData = (real, expected) -> return {real: realTransformed, expected: expectedTransformed} class Gavel2Html - constructor: ({dataReal, dataExpected, gavelResult, usePointers}) -> - @dataReal = dataReal - @dataExpected = dataExpected - @gavelResult = gavelResult + constructor: ({ fieldName, fieldResult, usePointers }) -> + @fieldName = fieldName + # Real and expected data are stored only to preserve + # previously existing references. Remove this and use "fieldResult" + # referenced directly when refactoring. + @dataReal = fieldResult.values.actual + @dataExpected = fieldResult.values.expected + @fieldResult = fieldResult @usePointers = usePointers @usedErrors = [] - getHtml: (givenOptions = {}) -> { wrapWith @@ -60,6 +63,7 @@ class Gavel2Html @usedErrors = converter.usedErrors return result catch e + console.error('gavelhtml: Internal error.\n', e) html = missingStartTag + "Internal validator error\n\n" + endTag try if typeof(@dataReal) != 'string' @@ -77,26 +81,23 @@ class Gavel2Html #@private getConverter: -> options = { + @fieldName @dataReal @dataExpected - @gavelResult + @fieldResult @usePointers } - switch @gavelResult?.validator - when 'TextDiff' - return new TextResultConverter options + if @fieldResult?.kind == 'json' + if @fieldName == 'headers' + return new HeadersResultConverter options - when 'JsonSchema', 'JsonExample' - transformedData = transformJsonData(options.dataReal, options.dataExpected) - if transformedData - options.dataReal = transformedData.real - options.dataExpected = transformedData.expected - return new JsonResultConverter options - return new TextResultConverter options + transformedData = transformJsonData(options.dataReal, options.dataExpected) - when 'HeadersJsonSchema', 'HeadersJsonExample' - return new HeadersResultConverter options + if transformedData + options.dataReal = transformedData.real + options.dataExpected = transformedData.expected + return new JsonResultConverter options return new TextResultConverter options diff --git a/src/headers-result-converter.coffee b/src/headers-result-converter.coffee index cf42535..3ff0b9e 100644 --- a/src/headers-result-converter.coffee +++ b/src/headers-result-converter.coffee @@ -2,20 +2,13 @@ clone = require 'clone' Converter = require './converter' class HeadersResultConverter extends Converter - #@protected - getLinesFromAmandaResults: -> - @_getLines() - #@protected getLinesFromResults: -> @_getLines() #@private _getLines: -> - if @usePointers - lineResultGetter = @getStateAndMessageFromResults - else - lineResultGetter = @getStateAndMessageFromAmandaResult + lineResultGetter = @getStateAndMessageFromResults @dataReal = @getFromString @dataReal @dataExpected = @getFromString @dataExpected diff --git a/src/json-result-converter.coffee b/src/json-result-converter.coffee index 5057ebb..1ec881c 100644 --- a/src/json-result-converter.coffee +++ b/src/json-result-converter.coffee @@ -11,10 +11,7 @@ class JsonResultConverter extends Converter prevLevel = 0 prevNode = null errorsPaths = [] - if @usePointers - errors = @getErrorsFromResults() - else - errors = @getErrors() + errors = @getErrorsFromResults() closingBrackets = [] typesOnLevels = {} @@ -185,47 +182,9 @@ class JsonResultConverter extends Converter return '' - #@private - getErrors: ()-> - if not (@gavelResult.rawData and @gavelResult.rawData.length) - return [] # not sure about this, added keys will not be marked as addeds - - amandaErrorsPaths = {} - errors = [] - dataExpectedPointers = [] - - # get all pointers in expected data - traverse(@dataExpected).forEach (nodeValue) -> - dataExpectedPointers.push jsonPointer.compile this.path - return - - # path from real does not exits in expected data so it's addded - traverse(@dataReal).forEach (nodeValue) -> - if not (jsonPointer.compile(this.path) in dataExpectedPointers) - errors.push {pathArray: this.path, value: nodeValue, 'state': 1, 'message': undefined} - return - - # get unique paths in errors - for i in [0..@gavelResult.rawData.length - 1] - - # get pointer from array and sanitize 'null' path array meant as root - if @gavelResult.rawData[i]['property'] - pointer = jsonPointer.compile @gavelResult.rawData[i]['property'] - else - pointer = '' - - if not amandaErrorsPaths[pointer] - amandaErrorsPaths[pointer] = @gavelResult.rawData[i]['property'] or [] - - # get aggregated message and state for each error pointer/pathArray - for pointer, pathArray of amandaErrorsPaths - errors.push @getStateAndMessageFromAmandaResult pathArray: pathArray, lowerCasedKeys: false - - return errors - #@private getErrorsFromResults: () -> - if @gavelResult.results.length == 0 + if @fieldResult.errors.length == 0 return [] # not sure about this, added keys will not be marked as added errorsPaths = {} @@ -244,9 +203,9 @@ class JsonResultConverter extends Converter return # get unique paths in errors - for result in @gavelResult.results - if result['pointer']? # filter out non JSON related errors - errorsPaths[result['pointer']] = jsonPointer.parse result['pointer'] + for error in @fieldResult.errors + if error.location?.pointer? # drop non JSON related errors + errorsPaths[error.location.pointer] = jsonPointer.parse error.location.pointer # get aggregated message and state for each error pointer/pathArray for pointer, pathArray of errorsPaths diff --git a/test/fixtures/gavel2html-legacy.coffee b/test/fixtures/gavel2html-legacy.coffee deleted file mode 100644 index 1d51563..0000000 --- a/test/fixtures/gavel2html-legacy.coffee +++ /dev/null @@ -1,533 +0,0 @@ -h = {} - -gavel2htmlOutputOptions = - wrapWith: '##data', - startTag: '', - endTag: '', - missingStartTag: '', - addedStartTag: "", - changedStartTag: '', - comments: true, - commentStartTag: '', - commentEndTag: '' - -headersExpected = - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - -headersExpectedEmpty = {} - -h.headersRealOK = - testDesc: 'when expected headers are non empty and real data are the same in real headers' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: headersExpected - gavelResult: - rawData: - length: 0 - expectedOutput: '{"testHeader1":"testHeader1Val","testHeader2":"testHeader2Val"}' - usedErrors: [] - - -h.headersRealOKMore = - testDesc: 'when expected headers are non empty and real data extends it' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - testHeader3: 'testHEader3Val' - dataExpected: headersExpected - gavelResult:{"rawData":{"length":0},"validator":"HeadersJsonExample"} - expectedOutput: 'testHeader1: testHeader1ValtestHeader2: testHeader2ValtestHeader3: testHEader3Val' - usedErrors: [] - -h.headersRealOKKeyCase = - testDesc: 'when expected headers are non empty and real data are the same except cAsE of key' - dataReal: - testHEAder1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: headersExpected - gavelResult:{"rawData":{"length":0},"validator":"HeadersJsonExample"} - expectedOutput: 'testHEAder1: testHeader1ValtestHeader2: testHeader2Val' - usedErrors: [] - -h.headersRealFailValueCase = - testDesc: 'when expected headers are non empty and real data are the same except cAsE of value' - dataReal: - testHeader1: 'tEstHeader1Val' - testHeader2: 'testHEader2Val' - dataExpected: headersExpected - gavelResult:{ - "rawData":{ - "0":{"property":["testheader2"],"propertyValue":"'testHEader2Val'","attributeName":"enum","attributeValue":["'testHeader2Val'"],"message":"Value of the ‘testheader2’ must be 'testHeader2Val'.","validator":"enum","validatorName":"enum","validatorValue":["'testHeader2Val'"]}, - "1":{"property":["testheader1"],"propertyValue":"'tEstHeader1Val'","attributeName":"enum","attributeValue":["'testHeader1Val'"],"message":"Value of the ‘testheader1’ must be 'testHeader1Val'.","validator":"enum","validatorName":"enum","validatorValue":["'testHeader1Val'"]}, - "length":2 - },"validator":"HeadersJsonExample"} - expectedOutput: "testHeader1: tEstHeader1ValtestHeader2: testHEader2Val" - usedErrors: [] - -h.headersRealFailMiss = - testDesc: 'when expected headers are non empty and key missing in real data' - dataReal: - testHeader1: 'testHeader1Val' - dataExpected: headersExpected - gavelResult: { - "rawData":{ - "0":{"property":["testheader2"],"propertyValue":null,"attributeName":"enum","attributeValue":["'testHeader2Val'"],"message":"Value of the ‘testheader2’ must be 'testHeader2Val'.","validator":"enum","validatorName":"enum","validatorValue":["'testHeader2Val'"]}, - "1":{"property":["testheader2"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘testheader2’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "length":2 - },"validator":"HeadersJsonExample"} - expectedOutput: "testHeader1: testHeader1ValtestHeader2: testHeader2Val" - usedErrors: [] - -h.headersRealFailChanged = - testDesc: 'when expected headers are non empty and data changed in real data' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHEader2ValChanged' - dataExpected: headersExpected - gavelResult: { - "rawData":{ - "0":{"property":["testheader2"],"propertyValue":"'testHEader2ValChanged'","attributeName":"enum","attributeValue":["'testHeader2Val'"],"message":"Value of the ‘testheader2’ must be 'testHeader2Val'.","validator":"enum","validatorName":"enum","validatorValue":["'testHeader2Val'"]}, - "length":1 - },"validator":"HeadersJsonExample"} - expectedOutput: "testHeader1: testHeader1ValtestHeader2: testHEader2ValChanged" - - usedErrors: [] - -h.headersRealFailEmpty = - testDesc: 'when expected headers are non empty and real data are empty' - dataReal: {} - dataExpected: - testHeader2: 'testHeader2Val' - gavelResult: { - "rawData":{ - "0":{"property":["testheader2"],"propertyValue":null,"attributeName":"enum","attributeValue":["'testHeader2Val'"],"message":"Value of the ‘testheader2’ must be 'testHeader2Val'.","validator":"enum","validatorName":"enum","validatorValue":["'testHeader2Val'"]}, - "1":{"property":["testheader2"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘testheader2’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "length":2 - },"validator":"HeadersJsonExample"} - expectedOutput: "testHeader2: testHeader2Val" - usedErrors: [] - -h.headersRealOKNoEmpty = - testDesc: 'when expected headers are empty and real data are not empty' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: {} - gavelResult: {"rawData":{"length":0},"validator":"HeadersJsonExample"} - expectedOutput: 'testHeader1: testHeader1ValtestHeader2: testHeader2Val' - usedErrors: [] - - -headersWrapHeaderKeys = - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - -h.headersWrapKeys = - outputOptions: - wrapWith: '##data' - startTag: '' - endTag: '' - jsonKeyStartTag: '' - jsonKeyEndTag: '' - missingStartTag: '' - addedStartTag: "" - changedStartTag: '' - comments: false - - testDesc: 'when expected headers are non empty and real data are the same in real headers and I want to wrap header keys' - dataReal: headersWrapHeaderKeys - dataExpected: headersWrapHeaderKeys - gavelResult: { - "results": [] - 'validator': 'HeadersJsonExample' - } - expectedOutput: """ - \ - testHeader1: <b>testHeader1Val</b>\ - testHeader2: <i>testHeader2Val</i>\ - """ - usedErrors: [] - -# -# Body -# - -b = {} - -b.bodyTypeFailFailIntVsStringRoot = - testDesc: 'when expected body is integer and real is string' - dataReal: '1' - dataExpected: 1 - schema: { - "type":"number", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: { - "rawData":{ - "0":{"property":null,"propertyValue":"1","attributeName":"type","attributeValue":"number","message":"The undefined property must be a number (current value is \"1\").","validator":"type","validatorName":"type","validatorValue":"number"}, - "length":1 - },"validator":"JsonSchema"} - expectedOutput: '1 The property must be a number (current value is "1").' - usedErrors: [''] - - -b.bodyTypeFailStringVsIntRoot = - testDesc: 'when expected body is string and real is integer' - dataReal: 1 - dataExpected: "1" - schema: { - "type":"string", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: { - "rawData":{ - "0":{"property":null,"propertyValue":1,"attributeName":"type","attributeValue":"string","message":"The undefined property must be a string (current value is 1).","validator":"type","validatorName":"type","validatorValue":"string"}, - "length":1 - },"validator":"JsonSchema"} - expectedOutput: '1 The property must be a string (current value is 1).' - usedErrors: [''] - - -b.bodyTypeFailPrimitiveVsObjRoot = - testDesc: 'when expected body is primitive and real is object' - dataReal: JSON.stringify {'key': 'val'} - dataExpected: "1" - schema: { - "type":"string", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: { - "rawData":{ - "0":{"property":null,"propertyValue":{"key":"val"},"attributeName":"type","attributeValue":"string","message":"The undefined property must be a string (current value is {\"key\":\"val\"}).","validator":"type","validatorName":"type","validatorValue":"string"}, - "length":1 - },"validator":"JsonSchema"} - expectedOutput: ''' - { - "key": "val" - } - ''' - usedErrors: [] - - -b.bodyTypeFailObjVsPrimitiveRoot = - testDesc: 'when expected body is object and real is primitive' - dataReal: "1" - dataExpected: JSON.stringify {"key": "val"} - schema: { - "type":"object", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: { - "rawData":{ - "0":{"property":[],"propertyValue":1,"attributeName":"type","attributeValue":"object","message":"The property must be an object (current value is 1).","validator":"type","validatorName":"type","validatorValue":"object"}, - "length":1 - },"validator":"JsonSchema"} - expectedOutput: ''' - 1 The property must be an object (current value is 1).''' - usedErrors: [""] - - - -b.bodyTypeFailObjVsArrayRoot = - testDesc: 'when expected body is object and real is array' - dataReal: JSON.stringify [1,2,3] - dataExpected: JSON.stringify {"key": "val"} - schema: { - "type":"object", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: {"rawData":{"0":{"property":[],"propertyValue":[1,2,3],"attributeName":"type","attributeValue":"object","message":"The property must be an object (current value is [1,2,3]).","validator":"type","validatorName":"type","validatorValue":"object"},"length":1},"validator":"JsonSchema"} - expectedOutput: ''' - [ - 1, - 2, - 3 - ] - ''' - usedErrors: [] - -b.bodyTypeFailObjVsArrayRootNoSchema = - testDesc: 'when expected body is object and real is array (no schema)' - dataReal: JSON.stringify [1,2,3] - dataExpected: JSON.stringify {"key": "val"} - gavelResult: { - "rawData":{ - "0":{"property":[],"propertyValue":[1,2,3],"attributeName":"type","attributeValue":"object","message":"The property must be an object (current value is [1,2,3]).","validator":"type","validatorName":"type","validatorValue":"object"}, - "1":{"property":["key"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘key’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "length":2 - },"validator":"JsonExample","expectedType":"application/json","realType":"application/json","results":[{"message":"The property must be an object (current value is [1,2,3]).","severity":"error","pointer":"/"},{"message":"The ‘key’ property is required.","severity":"error","pointer":"/key"}]} - expectedOutput: ''' - [ - 1, - 2, - 3 - ] - ''' - usedErrors: [] - -b.bodyTypeFailArrayVsObjRoot = - testDesc: 'when expected body is array and real is object' - dataReal: JSON.stringify {"key": "val"} - dataExpected: JSON.stringify [1,2,3] - schema: { - "type":"array", - "$schema": "http://json-schema.org/draft-03/schema", - "required":true - } - gavelResult: {"rawData":{"0":{"property":[],"propertyValue":{"key":"val"},"attributeName":"type","attributeValue":"array","message":"The property must be an array (current value is {\"key\":\"val\"}).","validator":"type","validatorName":"type","validatorValue":"array"},"length":1},"validator":"JsonSchema"} - expectedOutput: ''' - { - "key": "val" - } - ''' - usedErrors: [] - -b.bodyTypeFailArrayVsObjRootNoSchema = - testDesc: 'when expected body is array and real is object (no schema)' - dataReal: JSON.stringify {"key": "val"} - dataExpected: JSON.stringify [1,2,3] - gavelResult: { - "rawData":{ - "0":{"property":[],"propertyValue":{"key":"val"},"attributeName":"type","attributeValue":"array","message":"The property must be an array (current value is {\"key\":\"val\"}).","validator":"type","validatorName":"type","validatorValue":"array"}, - "1":{"property":["0"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘0’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "2":{"property":["1"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘1’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "3":{"property":["2"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘2’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "length":4 - },"validator":"JsonExample","expectedType":"application/json","realType":"application/json","results":[{"message":"The property must be an array (current value is {\"key\":\"val\"}).","severity":"error","pointer":"/"},{"message":"The ‘0’ property is required.","severity":"error","pointer":"/0"},{"message":"The ‘1’ property is required.","severity":"error","pointer":"/1"},{"message":"The ‘2’ property is required.","severity":"error","pointer":"/2"}]} - expectedOutput: ''' - { - "key": "val" - } - ''' - usedErrors: [] - -bodyComplexExpected = { - "simpleKeyValueOK": "simpleKeyValueOK", - "simpleKeyValueNumberOK": 1, - "simpleKeyValueOKmiss": "simpleKeyValueOKmiss", - "keyWithObjectValueOK": { - "keyWithObjectValueOKnestedKey": "keyWithObjectValueOKnestedKey", - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithObjectValueFail": { - "keyWithObjectValueOKnestedKeyMiss": "keyWithObjectValueOKnestedKeyMiss", - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithObjectValueWrongTypeFail": { - "keyWithObjectValueOKnestedKeyMiss": "keyWithObjectValueOKnestedKeyMiss", - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithArrayValueOK": [1,2,3], - "keyWithArrayValueOK2": [1,2,3], - "keyWithArrayValueTypeFail": [1,2,3] -} - - -bodyComplexReal = { - "simpleKeyValueOK": "simpleKeyValueOK", - "simpleKeyValueNumberOK": 1, - "keyWithObjectValueOK": { - "keyWithObjectValueOKnestedKey": "keyWithObjectValueOKnestedKey", - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2", - }, - "keyWithObjectValueFail": { - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithObjectValueWrongTypeFail": [1,2,3], - "keyWithArrayValueOK": [1,2,3], - "keyWithArrayValueOK2": [4,5,6], - "keyWithArrayValueTypeFail": {"key": "val"} -} - -b.bodyComplex = - testDesc: 'complex body test' - dataReal: JSON.stringify bodyComplexReal - dataExpected: JSON.stringify bodyComplexExpected - gavelResult:{ - "rawData":{ - "0":{"property":["simpleKeyValueOKmiss"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘simpleKeyValueOKmiss’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "1":{"property":["keyWithObjectValueFail","keyWithObjectValueOKnestedKeyMiss"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithObjectValueFail,keyWithObjectValueOKnestedKeyMiss’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "2":{"property":["keyWithObjectValueWrongTypeFail"],"propertyValue":[1,2,3],"attributeName":"type","attributeValue":"object","message":"The keyWithObjectValueWrongTypeFail property must be an object (current value is [1,2,3]).","validator":"type","validatorName":"type","validatorValue":"object"}, - "3":{"property":["keyWithObjectValueWrongTypeFail","keyWithObjectValueOKnestedKeyMiss"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKeyMiss’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "4":{"property":["keyWithObjectValueWrongTypeFail","keyWithObjectValueOKnestedKey2"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKey2’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "5":{"property":["keyWithArrayValueTypeFail"],"propertyValue":{"key":"val"},"attributeName":"type","attributeValue":"array","message":"The keyWithArrayValueTypeFail property must be an array (current value is {\"key\":\"val\"}).","validator":"type","validatorName":"type","validatorValue":"array"}, - "6":{"property":["keyWithArrayValueTypeFail","0"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithArrayValueTypeFail,0’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "7":{"property":["keyWithArrayValueTypeFail","1"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithArrayValueTypeFail,1’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "8":{"property":["keyWithArrayValueTypeFail","2"],"propertyValue":null,"attributeName":"required","attributeValue":true,"message":"The ‘keyWithArrayValueTypeFail,2’ property is required.","validator":"required","validatorName":"required","validatorValue":true}, - "length":9 - },"validator":"JsonExample"} - expectedOutput: ''' - { - "simpleKeyValueOK": "simpleKeyValueOK", - "simpleKeyValueNumberOK": 1, - "keyWithObjectValueOK": { - "keyWithObjectValueOKnestedKey": "keyWithObjectValueOKnestedKey", - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithObjectValueFail": { - "keyWithObjectValueOKnestedKey2": "keyWithObjectValueOKnestedKey2" - }, - "keyWithObjectValueWrongTypeFail": [ The keyWithObjectValueWrongTypeFail property must be an object (current value is [1,2,3]). - 1, - 2, - 3 - ], - "keyWithArrayValueOK": [ - 1, - 2, - 3 - ], - "keyWithArrayValueOK2": [ - 4, - 5, - 6 - ], - "keyWithArrayValueTypeFail": { The keyWithArrayValueTypeFail property must be an array (current value is {"key":"val"}). - "key": "val" - } - } - ''' - usedErrors: [ - "/keyWithObjectValueWrongTypeFail", - "/keyWithArrayValueTypeFail" - ] - -b.bodyOkWithNestedObjectsInArrays = - testDesc: 'when expected and real body are the same and contains array of objects' - dataReal: JSON.stringify { - "login": "true" - "results": [ - {"otrkey": "20_jahre_feste", "key2": "value2"} - {"otrkey": "30_jahre_feste", "key2": "value2"} - {"otrkey": "40_jahre_feste", "key2": "value2"} - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - {"otrkey": "20_jahre_feste", "key2": "value2"} - {"otrkey": "30_jahre_feste", "key2": "value2"} - {"otrkey": "40_jahre_feste", "key2": "value2"} - ] - } - gavelResult: { - "rawData":{ - "length":0 - },"validator":"JsonExample"} - expectedOutput: """ -{ - "login": "true", - "results": [ - { - "otrkey": "20_jahre_feste", - "key2": "value2" - }, - { - "otrkey": "30_jahre_feste", - "key2": "value2" - }, - { - "otrkey": "40_jahre_feste", - "key2": "value2" - } - ] -} - """ - usedErrors: [] - -b.bodyOkWithNestedStringsInArrays = - testDesc: 'when expected and real body are the same and contains array of strings' - dataReal: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - "MrauMrau" - "BauBau" - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - "MrauMrau" - "BauBau" - ] - } - gavelResult: { - "rawData":{ - "length":0 - },"validator":"JsonExample"} - expectedOutput: """ - { - "login": "true", - "results": [ - "BooBoo", - "MrauMrau", - "BauBau" - ] - } - """ - usedErrors: [] - -b.bodyOkWithNestedArraysInArrays = - testDesc: 'when expected and real body are the same and contains array of arrays' - dataReal: JSON.stringify { - "login": "true" - "results": [ - [1,2,3] - [1,2,3] - [1,2,3] - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - [1,2,3] - [1,2,3] - [1,2,3] - ] - } - gavelResult: { - "rawData":{ - "length":0 - },"validator":"JsonExample"} - expectedOutput: """ -{ - "login": "true", - "results": [ - [ - 1, - 2, - 3 - ], - [ - 1, - 2, - 3 - ], - [ - 1, - 2, - 3 - ] - ] -} - """ - usedErrors: [] - -module.exports = { - gavel2htmlOutputOptions - testsHeaders: h - testsBody: b -} - - - - diff --git a/test/fixtures/gavel2html-pointers.coffee b/test/fixtures/gavel2html-pointers.coffee index 27e4e8d..38bb691 100644 --- a/test/fixtures/gavel2html-pointers.coffee +++ b/test/fixtures/gavel2html-pointers.coffee @@ -19,12 +19,21 @@ headersExpectedEmpty = {} h.headersRealOK = testDesc: 'when expected headers are non empty and real data are the same in real headers' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: headersExpected - gavelResult: { - "results": [] + # dataReal: + # testHeader1: 'testHeader1Val' + # testHeader2: 'testHeader2Val' + # dataExpected: headersExpected + # fieldName: 'headers' + fieldResult: { + "kind": "json" + "values": { + "expected": headersExpected + "actual": { + testHeader1: 'testHeader1Val' + testHeader2: 'testHeader2Val' + } + } + "errors": [] } expectedOutput: '{"testHeader1":"testHeader1Val","testHeader2":"testHeader2Val"}' usedErrors: [] @@ -32,93 +41,136 @@ h.headersRealOK = h.headersRealOKMore = testDesc: 'when expected headers are non empty and real data extends it' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - testHeader3: 'testHEader3Val' - dataExpected: headersExpected - gavelResult:{ - "results": [], - "validator": "HeadersJsonExample" + # dataReal: + # testHeader1: 'testHeader1Val' + # testHeader2: 'testHeader2Val' + # testHeader3: 'testHEader3Val' + # dataExpected: headersExpected + fieldName: 'headers' + fieldResult:{ + "kind": "json", + "values": { + "expected": headersExpected + "actual": { + "testHeader1": 'testHeader1Val' + "testHeader2": 'testHeader2Val' + "testHeader3": 'testHEader3Val' + } + } + "errors": [], } expectedOutput: 'testHeader1: testHeader1ValtestHeader2: testHeader2ValtestHeader3: testHEader3Val' usedErrors: [] h.headersRealOKKeyCase = testDesc: 'when expected headers are non empty and real data are the same except cAsE of key' - dataReal: - testHEAder1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: headersExpected - gavelResult: { - "results": [], - "validator": "HeadersJsonExample" + # dataReal: + # testHEAder1: 'testHeader1Val' + # testHeader2: 'testHeader2Val' + # dataExpected: headersExpected + fieldName: 'headers', + fieldResult: { + "kind": "json", + "values": { + "expected": headersExpected + "actual": { + "testHEAder1": 'testHeader1Val' + "testHeader2": 'testHeader2Val' + }, + }, + "errors": [], } expectedOutput: 'testHEAder1: testHeader1ValtestHeader2: testHeader2Val' usedErrors: [] h.headersRealFailValueCase = testDesc: 'when expected headers are non empty and real data are the same except cAsE of value' - dataReal: - testHeader1: 'tEstHeader1Val' - testHeader2: 'testHEader2Val' - dataExpected: headersExpected - gavelResult: { - "results": [ + # dataReal: + # dataExpected: headersExpected + fieldName: 'headers' + fieldResult: { + "values": { + "expected": headersExpected + "actual": { + "testHeader1": 'tEstHeader1Val' + "testHeader2": 'testHEader2Val' + } + }, + "errors": [ { "message": "Value of the ‘testheader2’ must be 'testHeader2Val'.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } }, { "message": "Value of the ‘testheader1’ must be 'testHeader1Val'.", - "severity": "error", - "pointer": "/testheader1" + "location": { + "pointer": "/testheader1" + } } ], - "validator": "HeadersJsonExample" + "kind": "json" } expectedOutput: "testHeader1: tEstHeader1ValtestHeader2: testHEader2Val" usedErrors: [] h.headersRealFailMiss = testDesc: 'when expected headers are non empty and key missing in real data' - dataReal: - testHeader1: 'testHeader1Val' - dataExpected: headersExpected - gavelResult: { - "results": [ + # dataReal: + # testHeader1: 'testHeader1Val' + # dataExpected: headersExpected + fieldName: 'headers' + fieldResult: { + "values": { + "expected": headersExpected + "actual": { + "testHeader1": 'testHeader1Val' + } + } + "errors": [ { "message": "Value of the ‘testheader2’ must be 'testHeader2Val'.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } }, { "message": "The ‘testheader2’ property is required.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } } ], - "validator": "HeadersJsonExample" + "kind": "json" } expectedOutput: "testHeader1: testHeader1ValtestHeader2: testHeader2Val" usedErrors: [] h.headersRealFailChanged = testDesc: 'when expected headers are non empty and data changed in real data' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHEader2ValChanged' - dataExpected: headersExpected - gavelResult: { - "results": [ + # dataReal: + # testHeader1: 'testHeader1Val' + # testHeader2: 'testHEader2ValChanged' + # dataExpected: headersExpected + fieldName: 'headers' + fieldResult: { + "values": { + "expected": headersExpected + "actual": { + "testHeader1": 'testHeader1Val' + "testHeader2": 'testHEader2ValChanged' + } + } + "errors": [ { "message": "Value of the ‘testheader2’ must be 'testHeader2Val'.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } } ], - "validator": "HeadersJsonExample" + "kind": "json" } expectedOutput: "testHeader1: testHeader1ValtestHeader2: testHEader2ValChanged" @@ -126,36 +178,53 @@ h.headersRealFailChanged = h.headersRealFailEmpty = testDesc: 'when expected headers are non empty and real data are empty' - dataReal: {} - dataExpected: - testHeader2: 'testHeader2Val' - gavelResult: { - "results": [ + # dataReal: {} + # dataExpected: + # testHeader2: 'testHeader2Val' + fieldName: 'headers' + fieldResult: { + "values": { + "expected": { + "testHeader2": 'testHeader2Val' + } + "actual": {} + }, + "errors": [ { "message": "Value of the ‘testheader2’ must be 'testHeader2Val'.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } }, { "message": "The ‘testheader2’ property is required.", - "severity": "error", - "pointer": "/testheader2" + "location": { + "pointer": "/testheader2" + } } ], - "validator": "HeadersJsonExample" + "kind": "json" } expectedOutput: "testHeader2: testHeader2Val" usedErrors: [] h.headersRealOKNoEmpty = testDesc: 'when expected headers are empty and real data are not empty' - dataReal: - testHeader1: 'testHeader1Val' - testHeader2: 'testHeader2Val' - dataExpected: {} - gavelResult: { - "results": [], - "validator": "HeadersJsonExample" + # dataReal: + # testHeader1: 'testHeader1Val' + # testHeader2: 'testHeader2Val' + # dataExpected: {} + fieldName: 'headers' + fieldResult: { + "values": { + "expected": {} + "actual": { + testHeader1: 'testHeader1Val' + testHeader2: 'testHeader2Val' + } + }, + "errors": [], + "kind": "json" } expectedOutput: 'testHeader1: testHeader1ValtestHeader2: testHeader2Val' usedErrors: [] @@ -177,11 +246,16 @@ h.headersWrapKeys = comments: false testDesc: 'when expected headers are non empty and real data are the same in real headers and I want to wrap header keys' - dataReal: headersWrapHeaderKeys - dataExpected: headersWrapHeaderKeys - gavelResult: { - "results": [] - 'validator': 'HeadersJsonExample' + # dataReal: headersWrapHeaderKeys + # dataExpected: headersWrapHeaderKeys + fieldName: 'headers' + fieldResult: { + "values": { + "expected": headersWrapHeaderKeys, + "actual": headersWrapHeaderKeys + } + "errors": [] + "kind": "json" } expectedOutput: """ \ @@ -199,22 +273,28 @@ b = {} b.bodyTypeFailFailIntVsStringRoot = testDesc: 'when expected body is integer and real is string' - dataReal: '1' - dataExpected: 1 + # dataReal: '1' + # dataExpected: 1 schema: { "type":"number", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": 1 + "actual": '1' + } + "errors": [ { "message": "The undefined property must be a number (current value is \"1\").", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: '1 The property must be a number (current value is "1").' usedErrors: [''] @@ -222,22 +302,28 @@ b.bodyTypeFailFailIntVsStringRoot = b.bodyTypeFailStringVsIntRoot = testDesc: 'when expected body is string and real is integer' - dataReal: 1 - dataExpected: "1" + # dataReal: 1 + # dataExpected: "1" schema: { "type":"string", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": '1' + "actual": 1 + } + "errors": [ { "message": "The undefined property must be a string (current value is 1).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: '1 The property must be a string (current value is 1).' usedErrors: [''] @@ -245,22 +331,28 @@ b.bodyTypeFailStringVsIntRoot = b.bodyTypeFailPrimitiveVsObjRoot = testDesc: 'when expected body is primitive and real is object' - dataReal: JSON.stringify {'key': 'val'} - dataExpected: "1" + # dataReal: JSON.stringify {'key': 'val'} + # dataExpected: "1" schema: { "type":"string", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": "1" + "actual": JSON.stringify {'key': 'val'} + } + "errors": [ { "message": "The undefined property must be a string (current value is {\"key\":\"val\"}).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: ''' { @@ -272,22 +364,28 @@ b.bodyTypeFailPrimitiveVsObjRoot = b.bodyTypeFailObjVsPrimitiveRoot = testDesc: 'when expected body is object and real is primitive' - dataReal: "1" - dataExpected: JSON.stringify {"key": "val"} + # dataReal: "1" + # dataExpected: JSON.stringify {"key": "val"} schema: { "type":"object", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify {"key": "val"} + "actual": "1" + }, + "errors": [ { "message": "The property must be an object (current value is 1).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: '1 The property must be an object (current value is 1).' usedErrors: [""] @@ -296,22 +394,28 @@ b.bodyTypeFailObjVsPrimitiveRoot = b.bodyTypeFailObjVsArrayRoot = testDesc: 'when expected body is object and real is array' - dataReal: JSON.stringify [1,2,3] - dataExpected: JSON.stringify {"key": "val"} + # dataReal: JSON.stringify [1,2,3] + # dataExpected: JSON.stringify {"key": "val"} schema: { "type":"object", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify {"key": "val"} + "actual": JSON.stringify [1,2,3] + } + "errors": [ { "message": "The property must be an object (current value is [1,2,3]).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: ''' [ @@ -324,22 +428,29 @@ b.bodyTypeFailObjVsArrayRoot = b.bodyTypeFailObjVsArrayRootNoSchema = testDesc: 'when expected body is object and real is array (no schema)' - dataReal: JSON.stringify [1,2,3] - dataExpected: JSON.stringify {"key": "val"} - gavelResult: { - "results": [ + # dataReal: JSON.stringify [1,2,3] + # dataExpected: JSON.stringify {"key": "val"} + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify {"key": "val"} + "actual": JSON.stringify [1,2,3] + } + "errors": [ { "message": "The property must be an object (current value is [1,2,3]).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } }, { "message": "The ‘key’ property is required.", - "severity": "error", - "pointer": "/key" + "location": { + "pointer": "/key" + } } ], - "validator": "JsonExample" + "kind": "json" } expectedOutput: ''' [ @@ -352,22 +463,28 @@ b.bodyTypeFailObjVsArrayRootNoSchema = b.bodyTypeFailArrayVsObjRoot = testDesc: 'when expected body is array and real is object' - dataReal: JSON.stringify {"key": "val"} - dataExpected: JSON.stringify [1,2,3] + # dataReal: JSON.stringify {"key": "val"} + # dataExpected: JSON.stringify [1,2,3] schema: { "type":"array", "$schema": "http://json-schema.org/draft-03/schema", "required":true } - gavelResult: { - "results": [ + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify [1,2,3] + "actual": JSON.stringify {"key": "val"} + }, + "errors": [ { "message": "The property must be an array (current value is {\"key\":\"val\"}).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } } ], - "validator": "JsonSchema" + "kind": "json" } expectedOutput: ''' { @@ -378,32 +495,41 @@ b.bodyTypeFailArrayVsObjRoot = bodyTypeFailArrayVsObjRootNoSchema = testDesc: 'when expected body is array and real is object (no schema)' - dataReal: JSON.stringify {"key": "val"} - dataExpected: JSON.stringify [1,2,3] - gavelResult: { - "results": [ + # dataReal: JSON.stringify {"key": "val"} + # dataExpected: JSON.stringify [1,2,3] + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify [1,2,3] + "actual": JSON.stringify {"key": "val"} + } + "errors": [ { "message": "The property must be an array (current value is {\"key\":\"val\"}).", - "severity": "error", - "pointer": "" + "location": { + "pointer": "" + } }, { "message": "The ‘0’ property is required.", - "severity": "error", - "pointer": "/0" + "location": { + "pointer": "/0" + } }, { "message": "The ‘1’ property is required.", - "severity": "error", - "pointer": "/1" + "location": { + "pointer": "/1" + } }, { "message": "The ‘2’ property is required.", - "severity": "error", - "pointer": "/2" + "location": { + "pointer": "/2" + } } ], - "validator": "JsonExample" + "kind": "json" } expectedOutput: ''' { @@ -452,57 +578,71 @@ bodyComplexReal = { b.bodyComplex = testDesc: 'complex body test' - dataReal: JSON.stringify bodyComplexReal - dataExpected: JSON.stringify bodyComplexExpected - gavelResult:{ - "results": [ + # dataReal: JSON.stringify bodyComplexReal + # dataExpected: JSON.stringify bodyComplexExpected + fieldName: "body" + fieldResult: { + "values": { + "expected": JSON.stringify bodyComplexExpected + "actual": JSON.stringify bodyComplexReal + } + "errors": [ { "message": "The ‘simpleKeyValueOKmiss’ property is required.", - "severity": "error", - "pointer": "/simpleKeyValueOKmiss" + "location": { + "pointer": "/simpleKeyValueOKmiss" + } }, { "message": "The ‘keyWithObjectValueFail,keyWithObjectValueOKnestedKeyMiss’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueFail/keyWithObjectValueOKnestedKeyMiss" + "location": { + "pointer": "/keyWithObjectValueFail/keyWithObjectValueOKnestedKeyMiss" + } }, { "message": "The keyWithObjectValueWrongTypeFail property must be an object (current value is [1,2,3]).", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail" + } }, { "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKeyMiss’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKeyMiss" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKeyMiss" + } }, { "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKey2’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKey2" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKey2" + } }, { "message": "The keyWithArrayValueTypeFail property must be an array (current value is {\"key\":\"val\"}).", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail" + "location": { + "pointer": "/keyWithArrayValueTypeFail" + } }, { "message": "The ‘keyWithArrayValueTypeFail,0’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/0" + "location": { + "pointer": "/keyWithArrayValueTypeFail/0" + } }, { "message": "The ‘keyWithArrayValueTypeFail,1’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/1" + "location": { + "pointer": "/keyWithArrayValueTypeFail/1" + } }, { "message": "The ‘keyWithArrayValueTypeFail,2’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/2" + "location": { + "pointer": "/keyWithArrayValueTypeFail/2" + } } ], - "validator": "JsonExample" + "kind": "json" } expectedOutput: ''' { @@ -542,61 +682,74 @@ b.bodyComplex = b.bodyComplexWithNonPointerError = testDesc: 'complex body test with non pointer error in gavel results' - dataReal: JSON.stringify bodyComplexReal - dataExpected: JSON.stringify bodyComplexExpected - gavelResult:{ - "results": [ + # dataReal: JSON.stringify bodyComplexReal + # dataExpected: JSON.stringify bodyComplexExpected + fieldName: 'body' + fieldResult: { + "values": { + "expected": JSON.stringify bodyComplexExpected + "actual": JSON.stringify bodyComplexReal + }, + "errors": [ { "message": "Your mamma can't swim up the hill." - "severity": "error" - } + }, { "message": "The ‘simpleKeyValueOKmiss’ property is required.", - "severity": "error", - "pointer": "/simpleKeyValueOKmiss" + "location": { + "pointer": "/simpleKeyValueOKmiss" + } }, { "message": "The ‘keyWithObjectValueFail,keyWithObjectValueOKnestedKeyMiss’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueFail/keyWithObjectValueOKnestedKeyMiss" + "location": { + "pointer": "/keyWithObjectValueFail/keyWithObjectValueOKnestedKeyMiss" + } }, { "message": "The keyWithObjectValueWrongTypeFail property must be an object (current value is [1,2,3]).", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail" + } }, { "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKeyMiss’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKeyMiss" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKeyMiss" + } }, { "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKey2’ property is required.", - "severity": "error", - "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKey2" + "location": { + "pointer": "/keyWithObjectValueWrongTypeFail/keyWithObjectValueOKnestedKey2" + } }, { "message": "The keyWithArrayValueTypeFail property must be an array (current value is {\"key\":\"val\"}).", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail" + "location": { + "pointer": "/keyWithArrayValueTypeFail" + } }, { "message": "The ‘keyWithArrayValueTypeFail,0’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/0" + "location": { + "pointer": "/keyWithArrayValueTypeFail/0" + } }, { "message": "The ‘keyWithArrayValueTypeFail,1’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/1" + "location": { + "pointer": "/keyWithArrayValueTypeFail/1" + } }, { "message": "The ‘keyWithArrayValueTypeFail,2’ property is required.", - "severity": "error", - "pointer": "/keyWithArrayValueTypeFail/2" + "location": { + "pointer": "/keyWithArrayValueTypeFail/2" + } } ], - "validator": "JsonExample" + "kind": "json" } expectedOutput: ''' { @@ -637,25 +790,44 @@ b.bodyComplexWithNonPointerError = b.bodyOkWithNestedObjectsInArrays = testDesc: 'when expected and real body are the same and contains array of objects' - dataReal: JSON.stringify { - "login": "true" - "results": [ - {"otrkey": "20_jahre_feste", "key2": "value2"} - {"otrkey": "30_jahre_feste", "key2": "value2"} - {"otrkey": "40_jahre_feste", "key2": "value2"} - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - {"otrkey": "20_jahre_feste", "key2": "value2"} - {"otrkey": "30_jahre_feste", "key2": "value2"} - {"otrkey": "40_jahre_feste", "key2": "value2"} - ] - } - gavelResult: { - "results": [], - "validator": "JsonExample" + # dataReal: JSON.stringify { + # "login": "true" + # "results": [ + # {"otrkey": "20_jahre_feste", "key2": "value2"} + # {"otrkey": "30_jahre_feste", "key2": "value2"} + # {"otrkey": "40_jahre_feste", "key2": "value2"} + # ] + # } + # dataExpected: JSON.stringify { + # "login": "true" + # "results": [ + # {"otrkey": "20_jahre_feste", "key2": "value2"} + # {"otrkey": "30_jahre_feste", "key2": "value2"} + # {"otrkey": "40_jahre_feste", "key2": "value2"} + # ] + # } + fieldName: 'body' + fieldResult: { + "values": { + "expected": JSON.stringify { + "login": "true" + "results": [ + {"otrkey": "20_jahre_feste", "key2": "value2"} + {"otrkey": "30_jahre_feste", "key2": "value2"} + {"otrkey": "40_jahre_feste", "key2": "value2"} + ] + } + "actual": JSON.stringify { + "login": "true" + "results": [ + {"otrkey": "20_jahre_feste", "key2": "value2"} + {"otrkey": "30_jahre_feste", "key2": "value2"} + {"otrkey": "40_jahre_feste", "key2": "value2"} + ] + } + }, + "errors": [], + "kind": "json" } expectedOutput: """ { @@ -680,25 +852,44 @@ b.bodyOkWithNestedObjectsInArrays = b.bodyOkWithNestedStringsInArrays = testDesc: 'when expected and real body are the same and contains array of strings' - dataReal: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - "MrauMrau" - "BauBau" - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - "MrauMrau" - "BauBau" - ] - } - gavelResult: { - "results": [], - "validator": "JsonExample" + # dataReal: JSON.stringify { + # "login": "true" + # "results": [ + # "BooBoo" + # "MrauMrau" + # "BauBau" + # ] + # } + # dataExpected: JSON.stringify { + # "login": "true" + # "results": [ + # "BooBoo" + # "MrauMrau" + # "BauBau" + # ] + # } + fieldName: 'body' + fieldResult: { + "values": { + "expected": JSON.stringify { + "login": "true" + "results": [ + "BooBoo" + "MrauMrau" + "BauBau" + ] + } + "actual": JSON.stringify { + "login": "true" + "results": [ + "BooBoo" + "MrauMrau" + "BauBau" + ] + } + } + "errors": [], + "kind": "json" } expectedOutput: """ { @@ -714,25 +905,44 @@ b.bodyOkWithNestedStringsInArrays = b.bodyOkWithNestedArraysInArrays = testDesc: 'when expected and real body are the same and contains array of arrays' - dataReal: JSON.stringify { - "login": "true" - "results": [ - [1,2,3] - [1,2,3] - [1,2,3] - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - [1,2,3] - [1,2,3] - [1,2,3] - ] - } - gavelResult: { - "results": [], - "validator": "JsonExample" + # dataReal: JSON.stringify { + # "login": "true" + # "results": [ + # [1,2,3] + # [1,2,3] + # [1,2,3] + # ] + # } + # dataExpected: JSON.stringify { + # "login": "true" + # "results": [ + # [1,2,3] + # [1,2,3] + # [1,2,3] + # ] + # } + fieldName: 'body' + fieldResult: { + "values": { + "expected": JSON.stringify { + "login": "true" + "results": [ + [1,2,3] + [1,2,3] + [1,2,3] + ] + } + "actual": JSON.stringify { + "login": "true" + "results": [ + [1,2,3] + [1,2,3] + [1,2,3] + ] + } + }, + "errors": [], + "kind": "json" } expectedOutput: """ { @@ -762,25 +972,44 @@ b.bodyOkWithNestedArraysInArrays = b.bodyOkWithNestedStringsInArraysWrappedKeys = testDesc: 'when expected and real body are the same and I want to wrap object keys in additional tags' - dataReal: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - 5 - "BauBau" - ] - } - dataExpected: JSON.stringify { - "login": "true" - "results": [ - "BooBoo" - 5 - "BauBau" - ] - } - gavelResult: { - "results": [], - "validator": "JsonExample" + # dataReal: JSON.stringify { + # "login": "true" + # "results": [ + # "BooBoo" + # 5 + # "BauBau" + # ] + # } + # dataExpected: JSON.stringify { + # "login": "true" + # "results": [ + # "BooBoo" + # 5 + # "BauBau" + # ] + # } + fieldName: 'body' + fieldResult: { + "values": { + "expected":JSON.stringify { + "login": "true" + "results": [ + "BooBoo" + 5 + "BauBau" + ] + } + "actual": JSON.stringify { + "login": "true" + "results": [ + "BooBoo" + 5 + "BauBau" + ] + } + }, + "errors": [], + "kind": "json" } expectedOutput: """ { @@ -812,7 +1041,3 @@ module.exports = { testsHeaders: h testsBody: b } - - - - diff --git a/test/integration/gavel2html-legacy-test.coffee b/test/integration/gavel2html-legacy-test.coffee deleted file mode 100644 index 31ad4e9..0000000 --- a/test/integration/gavel2html-legacy-test.coffee +++ /dev/null @@ -1,40 +0,0 @@ -{assert} = require 'chai' -clone = require 'clone' - -Gavel2Html = require '../../src/index' -fixtures = require '../fixtures/gavel2html-legacy' - -outputOptions = fixtures.gavel2htmlOutputOptions - -runTest = (test, gavelOptions) -> - describe test.testDesc, -> - gavel2html = undefined - output = undefined - before (done) -> - test.usePointers = false - gavel2html = new Gavel2Html test - output = gavel2html.getHtml gavelOptions - done() - - it 'html output should be as expected', -> - assert.equal output, test.expectedOutput - - it 'used errors should be as expected', -> - assert.deepEqual gavel2html.usedErrors, test.usedErrors - -describe 'Gavel2Html Tests with legacy JSON property array notation', -> - describe 'headers tests', -> - for name, test of fixtures.testsHeaders - do (test) -> - outputOpts = clone outputOptions - outputOpts.comments = false - runTest clone(test), (test.outputOptions or outputOpts) - - - describe 'body tests', -> - for name, test of fixtures.testsBody - do (test) -> - outputOpts = clone outputOptions - outputOpts.comments = true - runTest clone(test), (test.outputOptions or outputOpts) - diff --git a/test/unit/headers-result-converter-test.coffee b/test/unit/headers-result-converter-test.coffee index 0db13d8..d778418 100644 --- a/test/unit/headers-result-converter-test.coffee +++ b/test/unit/headers-result-converter-test.coffee @@ -2,7 +2,6 @@ clone = require 'clone' HeadersResultConverter = require '../../src/headers-result-converter' -arrayFixtures = require '../fixtures/gavel2html-legacy' pointerFixtures = require '../fixtures/gavel2html-pointers' describe 'HeadersResultConverter', () -> @@ -26,26 +25,13 @@ describe 'HeadersResultConverter', () -> } ] - describe 'getLinesFromAmandaResults', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new HeadersResultConverter { - dataReal: arrayFixtures.testsHeaders.headersRealFailValueCase.dataReal - dataExpected: arrayFixtures.testsHeaders.headersRealFailValueCase.dataExpected - gavelResult: arrayFixtures.testsHeaders.headersRealFailValueCase.gavelResult - usePointers: false - } - result = jsonResultConverter.getLinesFromAmandaResults() - result = clone result, false - assert.deepEqual result, expectedOutput - describe 'getLinesFromResults', () -> describe 'when called', () -> it 'should have proper structure and values', () -> jsonResultConverter = new HeadersResultConverter { - dataReal: pointerFixtures.testsHeaders.headersRealFailValueCase.dataReal - dataExpected: pointerFixtures.testsHeaders.headersRealFailValueCase.dataExpected - gavelResult: pointerFixtures.testsHeaders.headersRealFailValueCase.gavelResult + dataReal: pointerFixtures.testsHeaders.headersRealFailValueCase.fieldResult.values.actual + dataExpected: pointerFixtures.testsHeaders.headersRealFailValueCase.fieldResult.values.expected + fieldResult: pointerFixtures.testsHeaders.headersRealFailValueCase.fieldResult usePointers: true } result = jsonResultConverter.getLinesFromResults() @@ -72,26 +58,13 @@ describe 'HeadersResultConverter', () -> } ] - describe 'getLinesFromAmandaResults', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new HeadersResultConverter { - dataReal: arrayFixtures.testsHeaders.headersRealFailChanged.dataReal - dataExpected: arrayFixtures.testsHeaders.headersRealFailChanged.dataExpected - gavelResult: arrayFixtures.testsHeaders.headersRealFailChanged.gavelResult - usePointers: false - } - result = jsonResultConverter.getLinesFromAmandaResults() - result = clone result, false - assert.deepEqual result, expectedOutput - describe 'getLinesFromResults', () -> describe 'when called', () -> it 'should have proper structure and values', () -> jsonResultConverter = new HeadersResultConverter { - dataReal: pointerFixtures.testsHeaders.headersRealFailChanged.dataReal - dataExpected: pointerFixtures.testsHeaders.headersRealFailChanged.dataExpected - gavelResult: pointerFixtures.testsHeaders.headersRealFailChanged.gavelResult + dataReal: pointerFixtures.testsHeaders.headersRealFailChanged.fieldResult.values.actual + dataExpected: pointerFixtures.testsHeaders.headersRealFailChanged.fieldResult.values.expected + fieldResult: pointerFixtures.testsHeaders.headersRealFailChanged.fieldResult usePointers: true } result = jsonResultConverter.getLinesFromResults() @@ -118,26 +91,13 @@ describe 'HeadersResultConverter', () -> } ] - describe 'getLinesFromAmandaResults', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new HeadersResultConverter { - dataReal: arrayFixtures.testsHeaders.headersRealFailMiss.dataReal - dataExpected: arrayFixtures.testsHeaders.headersRealFailMiss.dataExpected - gavelResult: arrayFixtures.testsHeaders.headersRealFailMiss.gavelResult - usePointers: false - } - result = jsonResultConverter.getLinesFromAmandaResults() - result = clone result, false - assert.deepEqual result, expectedOutput - describe 'getLinesFromResults', () -> describe 'when called', () -> it 'should have proper structure and values', () -> jsonResultConverter = new HeadersResultConverter { - dataReal: pointerFixtures.testsHeaders.headersRealFailMiss.dataReal - dataExpected: pointerFixtures.testsHeaders.headersRealFailMiss.dataExpected - gavelResult: pointerFixtures.testsHeaders.headersRealFailMiss.gavelResult + dataReal: pointerFixtures.testsHeaders.headersRealFailMiss.fieldResult.values.actual + dataExpected: pointerFixtures.testsHeaders.headersRealFailMiss.fieldResult.values.expected + fieldResult: pointerFixtures.testsHeaders.headersRealFailMiss.fieldResult usePointers: true } result = jsonResultConverter.getLinesFromResults() diff --git a/test/unit/json-result-converter-test.coffee b/test/unit/json-result-converter-test.coffee index c792bb0..82d7d6a 100644 --- a/test/unit/json-result-converter-test.coffee +++ b/test/unit/json-result-converter-test.coffee @@ -1,140 +1,9 @@ {assert} = require 'chai' JsonResultConverter = require '../../src/json-result-converter' -arrayFixtures = require '../fixtures/gavel2html-legacy' pointerFixtures = require '../fixtures/gavel2html-pointers' describe 'JsonResultConverter', () -> - - describe 'regression test for migration from amandaResults to JSON pointer based results in bodies', () -> - expectedOutput = [ - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail", - "0" - ], - "value": 1, - "state": 1 - }, - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail", - "1" - ], - "value": 2, - "state": 1 - }, - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail", - "2" - ], - "value": 3, - "state": 1 - }, - { - "pathArray": [ - "keyWithArrayValueTypeFail", - "key" - ], - "value": "val", - "state": 1 - }, - { - "pathArray": [ - "simpleKeyValueOKmiss" - ], - "state": -1, - "message": "The ‘simpleKeyValueOKmiss’ property is required." - }, - { - "pathArray": [ - "keyWithObjectValueFail", - "keyWithObjectValueOKnestedKeyMiss" - ], - "state": -1, - "message": "The ‘keyWithObjectValueFail,keyWithObjectValueOKnestedKeyMiss’ property is required." - }, - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail" - ], - "state": 2, - "message": "The keyWithObjectValueWrongTypeFail property must be an object (current value is [1,2,3])." - }, - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail", - "keyWithObjectValueOKnestedKeyMiss" - ], - "state": -1, - "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKeyMiss’ property is required." - }, - { - "pathArray": [ - "keyWithObjectValueWrongTypeFail", - "keyWithObjectValueOKnestedKey2" - ], - "state": -1, - "message": "The ‘keyWithObjectValueWrongTypeFail,keyWithObjectValueOKnestedKey2’ property is required." - }, - { - "pathArray": [ - "keyWithArrayValueTypeFail" - ], - "state": 2, - "message": "The keyWithArrayValueTypeFail property must be an array (current value is {\"key\":\"val\"})." - }, - { - "pathArray": [ - "keyWithArrayValueTypeFail", - "0" - ], - "state": -1, - "message": "The ‘keyWithArrayValueTypeFail,0’ property is required." - }, - { - "pathArray": [ - "keyWithArrayValueTypeFail", - "1" - ], - "state": -1, - "message": "The ‘keyWithArrayValueTypeFail,1’ property is required." - }, - { - "pathArray": [ - "keyWithArrayValueTypeFail", - "2" - ], - "state": -1, - "message": "The ‘keyWithArrayValueTypeFail,2’ property is required." - } - ] - - describe 'getErrors', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new JsonResultConverter { - dataReal: JSON.parse arrayFixtures.testsBody.bodyComplex.dataReal - dataExpected: JSON.parse arrayFixtures.testsBody.bodyComplex.dataExpected - gavelResult: arrayFixtures.testsBody.bodyComplex.gavelResult - } - result = jsonResultConverter.getErrors() - result = JSON.parse JSON.stringify result - assert.deepEqual result, expectedOutput - - describe 'getErrorsFromResults', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new JsonResultConverter { - dataReal: JSON.parse pointerFixtures.testsBody.bodyComplex.dataReal - dataExpected: JSON.parse pointerFixtures.testsBody.bodyComplex.dataExpected - gavelResult: pointerFixtures.testsBody.bodyComplex.gavelResult - } - result = jsonResultConverter.getErrorsFromResults() - result = JSON.parse JSON.stringify result - assert.deepEqual result, expectedOutput - describe 'regression test for migration from amandaResults to JSON pointer based results in bodies with root level primitive type mismatch', () -> expectedOutput = [ { @@ -144,26 +13,14 @@ describe 'JsonResultConverter', () -> } ] - describe 'getErrors', () -> - describe 'when called', () -> - it 'should have proper structure and values', () -> - jsonResultConverter = new JsonResultConverter { - dataReal: JSON.parse arrayFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.dataReal - dataExpected: JSON.parse arrayFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.dataExpected - gavelResult: arrayFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.gavelResult - } - result = jsonResultConverter.getErrors() - result = JSON.parse JSON.stringify result - assert.deepEqual result, expectedOutput - describe 'getErrorsFromResults', () -> describe 'when called', () -> it 'should have proper structure and values', () -> jsonResultConverter = new JsonResultConverter { - dataReal: JSON.parse pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.dataReal - dataExpected: JSON.parse pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.dataExpected - gavelResult: pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.gavelResult + dataReal: JSON.parse pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.fieldResult.values.actual + dataExpected: JSON.parse pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.fieldResult.values.expected + fieldResult: pointerFixtures.testsBody.bodyTypeFailObjVsPrimitiveRoot.fieldResult } - result = jsonResultConverter.getErrorsFromResults() - result = JSON.parse JSON.stringify result - assert.deepEqual result, expectedOutput + errors = jsonResultConverter.getErrorsFromResults() + errors = JSON.parse JSON.stringify errors + assert.deepEqual errors, expectedOutput \ No newline at end of file