@@ -149,7 +149,7 @@ export default class Operation extends PureComponent { | |||||
const isDeepLinkingEnabled = deepLinking && deepLinking !== "false" | const isDeepLinkingEnabled = deepLinking && deepLinking !== "false" | ||||
// Merge in Live Response | // Merge in Live Response | ||||
if(response && response.size > 0) { | |||||
if(responses && response && response.size > 0) { | |||||
let notDocumented = !responses.get(String(response.get("status"))) | let notDocumented = !responses.get(String(response.get("status"))) | ||||
response = response.set("notDocumented", notDocumented) | response = response.set("notDocumented", notDocumented) | ||||
} | } | ||||
@@ -30,7 +30,7 @@ export default class ParameterRow extends Component { | |||||
let { specSelectors, pathMethod, param } = props | let { specSelectors, pathMethod, param } = props | ||||
let example = param.get("example") | let example = param.get("example") | ||||
let defaultValue = param.get("default") | let defaultValue = param.get("default") | ||||
let parameter = specSelectors.getParameter(pathMethod, param.get("name")) | |||||
let parameter = specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) | |||||
let paramValue = parameter ? parameter.get("value") : undefined | let paramValue = parameter ? parameter.get("value") : undefined | ||||
let enumValue = parameter ? parameter.get("enum") : undefined | let enumValue = parameter ? parameter.get("enum") : undefined | ||||
let value | let value | ||||
@@ -49,10 +49,10 @@ export default class ResponseBody extends React.Component { | |||||
// Download | // Download | ||||
} else if ( | } else if ( | ||||
/^application\/octet-stream/i.test(contentType) || | /^application\/octet-stream/i.test(contentType) || | ||||
headers["Content-Disposition"] && (/attachment/i).test(headers["Content-Disposition"]) || | |||||
headers["content-disposition"] && (/attachment/i).test(headers["content-disposition"]) || | |||||
headers["Content-Description"] && (/File Transfer/i).test(headers["Content-Description"]) || | |||||
headers["content-description"] && (/File Transfer/i).test(headers["content-description"])) { | |||||
(headers["Content-Disposition"] && (/attachment/i).test(headers["Content-Disposition"])) || | |||||
(headers["content-disposition"] && (/attachment/i).test(headers["content-disposition"])) || | |||||
(headers["Content-Description"] && (/File Transfer/i).test(headers["Content-Description"])) || | |||||
(headers["content-description"] && (/File Transfer/i).test(headers["content-description"]))) { | |||||
let contentLength = headers["content-length"] || headers["Content-Length"] | let contentLength = headers["content-length"] || headers["Content-Length"] | ||||
if ( !(+contentLength) ) return null | if ( !(+contentLength) ) return null | ||||
@@ -524,6 +524,18 @@ export const validateGuid = (val) => { | |||||
} | } | ||||
} | } | ||||
export const validateMaxLength = (val, max) => { | |||||
if (val.length > max) { | |||||
return "Value must be less than MaxLength" | |||||
} | |||||
} | |||||
export const validateMinLength = (val, min) => { | |||||
if (val.length < min) { | |||||
return "Value must be greater than MinLength" | |||||
} | |||||
} | |||||
// validation of parameters before execute | // validation of parameters before execute | ||||
export const validateParam = (param, isXml) => { | export const validateParam = (param, isXml) => { | ||||
let errors = [] | let errors = [] | ||||
@@ -533,6 +545,8 @@ export const validateParam = (param, isXml) => { | |||||
let minimum = param.get("minimum") | let minimum = param.get("minimum") | ||||
let type = param.get("type") | let type = param.get("type") | ||||
let format = param.get("format") | let format = param.get("format") | ||||
let maxLength = param.get("maxLength") | |||||
let minLength = param.get("minLength") | |||||
/* | /* | ||||
If the parameter is required OR the parameter has a value (meaning optional, but filled in) | If the parameter is required OR the parameter has a value (meaning optional, but filled in) | ||||
@@ -549,6 +563,16 @@ export const validateParam = (param, isXml) => { | |||||
let numberCheck = type === "number" && !validateNumber(value) // validateNumber returns undefined if the value is a number | let numberCheck = type === "number" && !validateNumber(value) // validateNumber returns undefined if the value is a number | ||||
let integerCheck = type === "integer" && !validateInteger(value) // validateInteger returns undefined if the value is an integer | let integerCheck = type === "integer" && !validateInteger(value) // validateInteger returns undefined if the value is an integer | ||||
if (maxLength || maxLength === 0) { | |||||
let err = validateMaxLength(value, maxLength) | |||||
if (err) errors.push(err) | |||||
} | |||||
if (minLength) { | |||||
let err = validateMinLength(value, minLength) | |||||
if (err) errors.push(err) | |||||
} | |||||
if ( required && !(stringCheck || arrayCheck || listCheck || fileCheck || booleanCheck || numberCheck || integerCheck) ) { | if ( required && !(stringCheck || arrayCheck || listCheck || fileCheck || booleanCheck || numberCheck || integerCheck) ) { | ||||
errors.push("Required field is not provided") | errors.push("Required field is not provided") | ||||
return errors | return errors | ||||
@@ -1,8 +1,23 @@ | |||||
/* eslint-env mocha */ | /* eslint-env mocha */ | ||||
import expect from "expect" | import expect from "expect" | ||||
import { fromJS, OrderedMap } from "immutable" | import { fromJS, OrderedMap } from "immutable" | ||||
import { mapToList, validateDateTime, validateGuid, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered, getAcceptControllingResponse, createDeepLinkPath, escapeDeepLinkPath } from "core/utils" | |||||
import { validateMaximum, validateMinimum } from "core/utils" | |||||
import { | |||||
mapToList, | |||||
validateMinLength, | |||||
validateMaxLength, | |||||
validateDateTime, | |||||
validateGuid, | |||||
validateNumber, | |||||
validateInteger, | |||||
validateParam, | |||||
validateFile, | |||||
validateMaximum, | |||||
validateMinimum, | |||||
fromJSOrdered, | |||||
getAcceptControllingResponse, | |||||
createDeepLinkPath, | |||||
escapeDeepLinkPath | |||||
} from "core/utils" | |||||
import win from "core/window" | import win from "core/window" | ||||
describe("utils", function() { | describe("utils", function() { | ||||
@@ -227,6 +242,35 @@ describe("utils", function() { | |||||
}) | }) | ||||
}) | }) | ||||
describe("validateMaxLength", function() { | |||||
let errorMessage = "Value must be less than MaxLength" | |||||
it("doesn't return for valid guid", function() { | |||||
expect(validateMaxLength("a", 1)).toBeFalsy() | |||||
expect(validateMaxLength("abc", 5)).toBeFalsy() | |||||
}) | |||||
it("returns a message for invalid input'", function() { | |||||
expect(validateMaxLength("abc", 0)).toEqual(errorMessage) | |||||
expect(validateMaxLength("abc", 1)).toEqual(errorMessage) | |||||
expect(validateMaxLength("abc", 2)).toEqual(errorMessage) | |||||
}) | |||||
}) | |||||
describe("validateMinLength", function() { | |||||
let errorMessage = "Value must be greater than MinLength" | |||||
it("doesn't return for valid guid", function() { | |||||
expect(validateMinLength("a", 1)).toBeFalsy() | |||||
expect(validateMinLength("abc", 2)).toBeFalsy() | |||||
}) | |||||
it("returns a message for invalid input'", function() { | |||||
expect(validateMinLength("abc", 5)).toEqual(errorMessage) | |||||
expect(validateMinLength("abc", 8)).toEqual(errorMessage) | |||||
}) | |||||
}) | |||||
describe("validateParam", function() { | describe("validateParam", function() { | ||||
let param = null | let param = null | ||||
let result = null | let result = null | ||||
@@ -252,7 +296,7 @@ describe("utils", function() { | |||||
result = validateParam( param, false ) | result = validateParam( param, false ) | ||||
expect( result ).toEqual( ["Required field is not provided"] ) | expect( result ).toEqual( ["Required field is not provided"] ) | ||||
// valid string | |||||
// valid string | |||||
param = fromJS({ | param = fromJS({ | ||||
required: true, | required: true, | ||||
type: "string", | type: "string", | ||||
@@ -260,6 +304,50 @@ describe("utils", function() { | |||||
}) | }) | ||||
result = validateParam( param, false ) | result = validateParam( param, false ) | ||||
expect( result ).toEqual( [] ) | expect( result ).toEqual( [] ) | ||||
// valid string with min and max length | |||||
param = fromJS({ | |||||
required: true, | |||||
type: "string", | |||||
value: "test string", | |||||
maxLength: 50, | |||||
minLength: 1 | |||||
}) | |||||
result = validateParam( param, false ) | |||||
expect( result ).toEqual( [] ) | |||||
}) | |||||
it("validates required strings with min and max length", function() { | |||||
// invalid string with max length | |||||
param = fromJS({ | |||||
required: true, | |||||
type: "string", | |||||
value: "test string", | |||||
maxLength: 5 | |||||
}) | |||||
result = validateParam( param, false ) | |||||
expect( result ).toEqual( ["Value must be less than MaxLength"] ) | |||||
// invalid string with max length 0 | |||||
param = fromJS({ | |||||
required: true, | |||||
type: "string", | |||||
value: "test string", | |||||
maxLength: 0 | |||||
}) | |||||
result = validateParam( param, false ) | |||||
expect( result ).toEqual( ["Value must be less than MaxLength"] ) | |||||
// invalid string with min length | |||||
param = fromJS({ | |||||
required: true, | |||||
type: "string", | |||||
value: "test string", | |||||
minLength: 50 | |||||
}) | |||||
result = validateParam( param, false ) | |||||
expect( result ).toEqual( ["Value must be greater than MinLength"] ) | |||||
}) | }) | ||||
it("validates optional strings", function() { | it("validates optional strings", function() { | ||||