diff --git a/src/core/components/operation.jsx b/src/core/components/operation.jsx index fbf8ca60..194565da 100644 --- a/src/core/components/operation.jsx +++ b/src/core/components/operation.jsx @@ -149,7 +149,7 @@ export default class Operation extends PureComponent { const isDeepLinkingEnabled = deepLinking && deepLinking !== "false" // Merge in Live Response - if(response && response.size > 0) { + if(responses && response && response.size > 0) { let notDocumented = !responses.get(String(response.get("status"))) response = response.set("notDocumented", notDocumented) } diff --git a/src/core/components/parameter-row.jsx b/src/core/components/parameter-row.jsx index 2c4e0c9a..3fbf5843 100644 --- a/src/core/components/parameter-row.jsx +++ b/src/core/components/parameter-row.jsx @@ -30,7 +30,7 @@ export default class ParameterRow extends Component { let { specSelectors, pathMethod, param } = props let example = param.get("example") 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 enumValue = parameter ? parameter.get("enum") : undefined let value diff --git a/src/core/components/response-body.jsx b/src/core/components/response-body.jsx index 0829512e..265ff679 100644 --- a/src/core/components/response-body.jsx +++ b/src/core/components/response-body.jsx @@ -49,10 +49,10 @@ export default class ResponseBody extends React.Component { // Download } else if ( /^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"] if ( !(+contentLength) ) return null diff --git a/src/core/utils.js b/src/core/utils.js index ac633c34..8cd8eff6 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -470,6 +470,18 @@ export const propChecker = (props, nextProps, objectList=[], ignoreList=[]) => { || objectList.some( objectPropName => !eq(props[objectPropName], nextProps[objectPropName]))) } +export const validateMaximum = ( val, max ) => { + if (val > max) { + return "Value must be less than Maximum" + } +} + +export const validateMinimum = ( val, min ) => { + if (val < min) { + return "Value must be greater than Minimum" + } +} + export const validateNumber = ( val ) => { if (!/^-?\d+(\.?\d+)?$/.test(val)) { return "Value must be a number" @@ -512,13 +524,29 @@ 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 export const validateParam = (param, isXml) => { let errors = [] let value = isXml && param.get("in") === "body" ? param.get("value_xml") : param.get("value") let required = param.get("required") + let maximum = param.get("maximum") + let minimum = param.get("minimum") let type = param.get("type") 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) @@ -535,11 +563,31 @@ export const validateParam = (param, isXml) => { 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 + 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) ) { errors.push("Required field is not provided") return errors } + if (maximum || maximum === 0) { + let err = validateMaximum(value, maximum) + if (err) errors.push(err) + } + + if (minimum || minimum === 0) { + let err = validateMinimum(value, minimum) + if (err) errors.push(err) + } + if ( type === "string" ) { let err if (format === "date-time") { diff --git a/src/style/_layout.scss b/src/style/_layout.scss index d070c96c..9b38a700 100644 --- a/src/style/_layout.scss +++ b/src/style/_layout.scss @@ -252,8 +252,11 @@ font-size: 16px; display: flex; + flex: 0 3 auto; align-items: center; + word-break: break-all; + padding: 0 10px; @include text_code(); diff --git a/test/core/utils.js b/test/core/utils.js index dfe5c1ee..e506ef29 100644 --- a/test/core/utils.js +++ b/test/core/utils.js @@ -1,7 +1,23 @@ /* eslint-env mocha */ import expect from "expect" import { fromJS, OrderedMap } from "immutable" -import { mapToList, validateDateTime, validateGuid, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered, getAcceptControllingResponse, createDeepLinkPath, escapeDeepLinkPath } 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" describe("utils", function() { @@ -72,6 +88,36 @@ describe("utils", function() { }) + describe("validateMaximum", function() { + let errorMessage = "Value must be less than Maximum" + + it("doesn't return for valid input", function() { + expect(validateMaximum(9, 10)).toBeFalsy() + expect(validateMaximum(19, 20)).toBeFalsy() + }) + + it("returns a message for invalid input", function() { + expect(validateMaximum(1, 0)).toEqual(errorMessage) + expect(validateMaximum(10, 9)).toEqual(errorMessage) + expect(validateMaximum(20, 19)).toEqual(errorMessage) + }) + }) + + describe("validateMinimum", function() { + let errorMessage = "Value must be greater than Minimum" + + it("doesn't return for valid input", function() { + expect(validateMinimum(2, 1)).toBeFalsy() + expect(validateMinimum(20, 10)).toBeFalsy() + }) + + it("returns a message for invalid input", function() { + expect(validateMinimum(-1, 0)).toEqual(errorMessage) + expect(validateMinimum(1, 2)).toEqual(errorMessage) + expect(validateMinimum(10, 20)).toEqual(errorMessage) + }) + }) + describe("validateNumber", function() { let errorMessage = "Value must be a number" @@ -198,6 +244,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() { let param = null let result = null @@ -223,7 +298,7 @@ describe("utils", function() { result = validateParam( param, false ) expect( result ).toEqual( ["Required field is not provided"] ) - // valid string + // valid string param = fromJS({ required: true, type: "string", @@ -231,6 +306,50 @@ describe("utils", function() { }) result = validateParam( param, false ) 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() { @@ -485,14 +604,47 @@ describe("utils", function() { result = validateParam( param, false ) expect( result ).toEqual( ["Required field is not provided"] ) - // valid number + // valid number with min and max param = fromJS({ required: true, type: "number", - value: 10 + value: 10, + minimum: 5, + maximum: 99 }) result = validateParam( param, false ) expect( result ).toEqual( [] ) + + // valid negative number with min and max + param = fromJS({ + required: true, + type: "number", + value: -10, + minimum: -50, + maximum: -5 + }) + result = validateParam( param, false ) + expect( result ).toEqual( [] ) + + // invalid number with maximum:0 + param = fromJS({ + required: true, + type: "number", + value: 1, + maximum: 0 + }) + result = validateParam( param, false ) + expect( result ).toEqual( ["Value must be less than Maximum"] ) + + // invalid number with minimum:0 + param = fromJS({ + required: true, + type: "number", + value: -10, + minimum: 0 + }) + result = validateParam( param, false ) + expect( result ).toEqual( ["Value must be greater than Minimum"] ) }) it("validates optional numbers", function() {