diff --git a/lib/xMsExampleExtractor.js b/lib/xMsExampleExtractor.js index 081f2091..605b3583 100644 --- a/lib/xMsExampleExtractor.js +++ b/lib/xMsExampleExtractor.js @@ -127,6 +127,8 @@ class xMsExampleExtractor { queryParams[queryParam[0]] = queryParam[1]; } + let headerParams = entries[entry]["RequestHeaders"]; + // if commandline included check for API version, validate api-version from URI in recordings matches the api-version of the spec if (!self.options.matchApiVersion || (("api-version" in queryParams) && queryParams["api-version"] == api.info.version)) { recordingPath = recordingPath.replace(/\?.*/, ''); @@ -171,6 +173,9 @@ class xMsExampleExtractor { for (let param of utils.getKeys(queryParams)) { example['parameters'][param] = queryParams[param]; } + for (let param of utils.getKeys(headerParams)) { + example['parameters'][param] = headerParams[param]; + } for (let param of utils.getKeys(infoFromOperation["parameters"])) { if (params[param]["in"] == "body") { let bodyParamName = params[param]["name"]; diff --git a/test/modelValidation/swaggers/specification/header/examples/arrayReqNotRequired.json b/test/modelValidation/swaggers/specification/header/examples/arrayReqNotRequired.json new file mode 100644 index 00000000..e24179d1 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/arrayReqNotRequired.json @@ -0,0 +1,6 @@ +{ + "parameters": {}, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/arrayReqRequired.json b/test/modelValidation/swaggers/specification/header/examples/arrayReqRequired.json new file mode 100644 index 00000000..6886ef2c --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/arrayReqRequired.json @@ -0,0 +1,11 @@ +{ + "parameters": { + "hello": [ + "world", + "galaxy" + ] + }, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/arrayResp.json b/test/modelValidation/swaggers/specification/header/examples/arrayResp.json new file mode 100644 index 00000000..20613b7e --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/arrayResp.json @@ -0,0 +1,13 @@ +{ + "parameters": {}, + "responses": { + "200": { + "headers": { + "hello": [ + "world", + "galaxy" + ] + } + } + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/booleanReqNotRequired.json b/test/modelValidation/swaggers/specification/header/examples/booleanReqNotRequired.json new file mode 100644 index 00000000..e24179d1 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/booleanReqNotRequired.json @@ -0,0 +1,6 @@ +{ + "parameters": {}, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/booleanReqRequired.json b/test/modelValidation/swaggers/specification/header/examples/booleanReqRequired.json new file mode 100644 index 00000000..71ae5ac9 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/booleanReqRequired.json @@ -0,0 +1,8 @@ +{ + "parameters": { + "hello": true + }, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/booleanResp.json b/test/modelValidation/swaggers/specification/header/examples/booleanResp.json new file mode 100644 index 00000000..c079b81d --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/booleanResp.json @@ -0,0 +1,10 @@ +{ + "parameters": {}, + "responses": { + "200": { + "headers": { + "hello": true + } + } + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/integerReqNotRequired.json b/test/modelValidation/swaggers/specification/header/examples/integerReqNotRequired.json new file mode 100644 index 00000000..e24179d1 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/integerReqNotRequired.json @@ -0,0 +1,6 @@ +{ + "parameters": {}, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/integerReqRequired.json b/test/modelValidation/swaggers/specification/header/examples/integerReqRequired.json new file mode 100644 index 00000000..3dd3cbe3 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/integerReqRequired.json @@ -0,0 +1,8 @@ +{ + "parameters": { + "hello": 5 + }, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/integerResp.json b/test/modelValidation/swaggers/specification/header/examples/integerResp.json new file mode 100644 index 00000000..8103669e --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/integerResp.json @@ -0,0 +1,10 @@ +{ + "parameters": {}, + "responses": { + "200": { + "headers": { + "hello": 5 + } + } + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/stringReqNotRequired.json b/test/modelValidation/swaggers/specification/header/examples/stringReqNotRequired.json new file mode 100644 index 00000000..e24179d1 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/stringReqNotRequired.json @@ -0,0 +1,6 @@ +{ + "parameters": {}, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/stringReqRequired.json b/test/modelValidation/swaggers/specification/header/examples/stringReqRequired.json new file mode 100644 index 00000000..2fc3fd77 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/stringReqRequired.json @@ -0,0 +1,8 @@ +{ + "parameters": { + "If-Match": "World" + }, + "responses": { + "200": {} + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/examples/stringResp.json b/test/modelValidation/swaggers/specification/header/examples/stringResp.json new file mode 100644 index 00000000..38c266e9 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/examples/stringResp.json @@ -0,0 +1,10 @@ +{ + "parameters": {}, + "responses": { + "200": { + "headers": { + "hello": "World" + } + } + } +} \ No newline at end of file diff --git a/test/modelValidation/swaggers/specification/header/test.json b/test/modelValidation/swaggers/specification/header/test.json new file mode 100644 index 00000000..21318568 --- /dev/null +++ b/test/modelValidation/swaggers/specification/header/test.json @@ -0,0 +1,355 @@ +{ + "swagger": "2.0", + "info": { + "title": "HeaderTests", + "description": "Tests for header parameters", + "version": "1.0" + }, + "host": "management.azure.com", + "schemes": [ + "https" + ], + "consumes": [], + "produces": [], + "paths": { + "/header/string/required": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_StringRequestRequired", + "description": "The parameter is a required header", + "x-ms-examples": { + "headerStringRequestRequired": { + "$ref": "./examples/stringReqRequired.json" + } + }, + "parameters": [ + { + "name": "If-Match", + "in": "header", + "required": true, + "type": "string", + "description": "Required string header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/string/notRequired": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_StringRequestNotRequired", + "description": "The parameter is a not required header", + "x-ms-examples": { + "headerStringRequestNotRequired": { + "$ref": "./examples/stringReqNotRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": false, + "type": "string", + "description": "Not required string header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/string": { + "get": { + "tags": [ + "Header" + ], + "operationId": "Header_StringResponseNotRequired", + "description": "Returns a header", + "x-ms-examples": { + "headerStringResponse": { + "$ref": "./examples/stringResp.json" + } + }, + "parameters": [], + "responses": { + "200": { + "description": "OK", + "headers": { + "hello": { + "type": "string", + "description": "Response string header" + } + } + } + } + } + }, + "/header/boolean/required": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_BoolRequestRequired", + "description": "The parameter is a required header", + "x-ms-examples": { + "headerBoolRequestRequired": { + "$ref": "./examples/booleanReqRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": true, + "type": "boolean", + "description": "Required boolean header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/boolean/notRequired": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_BoolRequestNotRequired", + "description": "The parameter is a not required header", + "x-ms-examples": { + "headerBoolRequestNotRequired": { + "$ref": "./examples/booleanReqNotRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": false, + "type": "boolean", + "description": "Not required boolean header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/boolean": { + "get": { + "tags": [ + "Header" + ], + "operationId": "Header_BoolResponseNotRequired", + "description": "Returns a header", + "x-ms-examples": { + "headerBoolResponse": { + "$ref": "./examples/booleanResp.json" + } + }, + "parameters": [], + "responses": { + "200": { + "description": "OK", + "headers": { + "hello": { + "type": "boolean", + "description": "Response boolean header" + } + } + } + } + } + }, + "/header/integer/required": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_IntegerRequestRequired", + "description": "The parameter is a required header", + "x-ms-examples": { + "headerIntegerRequestRequired": { + "$ref": "./examples/integerReqRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": true, + "type": "integer", + "description": "Required integer header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/integer/notRequired": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_IntegerRequestNotRequired", + "description": "The parameter is a not required header", + "x-ms-examples": { + "headerIntegerRequestNotRequired": { + "$ref": "./examples/integerReqNotRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": false, + "type": "integer", + "description": "Not required integer header" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/integer": { + "get": { + "tags": [ + "Header" + ], + "operationId": "Header_IntegerResponseNotRequired", + "description": "Returns a header", + "x-ms-examples": { + "headerIntegerResponse": { + "$ref": "./examples/integerResp.json" + } + }, + "parameters": [], + "responses": { + "200": { + "description": "OK", + "headers": { + "hello": { + "type": "integer", + "description": "Response integer header" + } + } + } + } + } + }, + "/header/array/required": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_ArrayRequestRequired", + "description": "The parameter is a required header", + "x-ms-examples": { + "headerArrayRequestRequired": { + "$ref": "./examples/arrayReqRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": true, + "type": "array", + "description": "Required array header", + "items": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/array/notRequired": { + "post": { + "tags": [ + "Header" + ], + "operationId": "Header_ArrayRequestNotRequired", + "description": "The parameter is a not required header", + "x-ms-examples": { + "headerArrayRequestNotRequired": { + "$ref": "./examples/arrayReqNotRequired.json" + } + }, + "parameters": [ + { + "name": "hello", + "in": "header", + "required": false, + "type": "array", + "description": "Not required array header", + "items": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/header/array": { + "get": { + "tags": [ + "Header" + ], + "operationId": "Header_ArrayResponseNotRequired", + "description": "Returns a header", + "x-ms-examples": { + "headerArrayResponse": { + "$ref": "./examples/arrayResp.json" + } + }, + "parameters": [], + "responses": { + "200": { + "description": "OK", + "headers": { + "hello": { + "type": "array", + "description": "Response array header", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "definitions": {}, + "parameters": {} +} \ No newline at end of file diff --git a/test/modelValidatorTests.js b/test/modelValidatorTests.js index 0f0ce1d8..26b5bc49 100644 --- a/test/modelValidatorTests.js +++ b/test/modelValidatorTests.js @@ -348,4 +348,18 @@ describe('Model Validation', function () { }); }); }); + + describe('Headers - ', function () { + it('should pass for various header parameters', function (done) { + let specPath = `${__dirname}/modelValidation/swaggers/specification/header/test.json`; + validate.validateExamples(specPath, undefined, { consoleLogLevel: 'off' }).then((result) => { + console.dir(result, { depth: null }); + assert(result.validityStatus === true, `swagger "${specPath}" contains model validation errors.`); + console.log(result); + done(); + }).catch((err) => { + done(err); + }); + }); + }); }); \ No newline at end of file