Skip to content

Commit b6eb232

Browse files
authored
Merge branch 'master' into master
2 parents 54a2d40 + a3f923e commit b6eb232

File tree

10 files changed

+73
-22
lines changed

10 files changed

+73
-22
lines changed

src/core/components/param-body.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default class ParamBody extends PureComponent {
4747

4848
updateValues = (props) => {
4949
let { specSelectors, pathMethod, param, isExecute, consumesValue="" } = props
50-
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : {}
50+
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) : {}
5151
let isXml = /xml/i.test(consumesValue)
5252
let isJson = /json/i.test(consumesValue)
5353
let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value")
@@ -107,7 +107,7 @@ export default class ParamBody extends PureComponent {
107107
const HighlightCode = getComponent("highlightCode")
108108
const ContentType = getComponent("contentType")
109109
// for domains where specSelectors not passed
110-
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : param
110+
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) : param
111111
let errors = parameter.get("errors", List())
112112
let consumesValue = specSelectors.contentTypeValues(pathMethod).get("requestContentType")
113113
let consumes = this.props.consumes && this.props.consumes.size ? this.props.consumes : ParamBody.defaultProp.consumes

src/core/components/parameter-row.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ export default class ParameterRow extends Component {
1919

2020
let { specSelectors, pathMethod, param } = props
2121
let defaultValue = param.get("default")
22-
let parameter = specSelectors.getParameter(pathMethod, param.get("name"))
22+
let parameter = specSelectors.getParameter(pathMethod, param.get("name"), param.get("in"))
2323
let value = parameter ? parameter.get("value") : ""
2424
if ( defaultValue !== undefined && value === undefined ) {
2525
this.onChangeWrapper(defaultValue)
2626
}
2727
}
2828

29+
shouldComponentUpdate(nextProps) {
30+
return nextProps.param !== this.props.param
31+
}
32+
2933
componentWillReceiveProps(props) {
3034
let { specSelectors, pathMethod, param } = props
3135
let example = param.get("example")
@@ -86,7 +90,7 @@ export default class ParameterRow extends Component {
8690
let isFormDataSupported = "FormData" in win
8791
let required = param.get("required")
8892
let itemType = param.getIn(isOAS3 && isOAS3() ? ["schema", "items", "type"] : ["items", "type"])
89-
let parameter = specSelectors.getParameter(pathMethod, param.get("name"))
93+
let parameter = specSelectors.getParameter(pathMethod, param.get("name"), param.get("in"))
9094
let value = parameter ? parameter.get("value") : ""
9195

9296
return (

src/core/components/parameters.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default class Parameters extends Component {
3737
onChangeKey,
3838
} = this.props
3939

40-
changeParam( onChangeKey, param.get("name"), value, isXml)
40+
changeParam( onChangeKey, param.get("name"), param.get("in"), value, isXml)
4141
}
4242

4343
onChangeConsumesWrapper = ( val ) => {
@@ -94,7 +94,7 @@ export default class Parameters extends Component {
9494
<ParameterRow fn={ fn }
9595
getComponent={ getComponent }
9696
param={ parameter }
97-
key={ parameter.get( "name" ) }
97+
key={ `${parameter.get( "in" )}.${parameter.get("name")}` }
9898
onChange={ this.onChange }
9999
onChangeConsumes={this.onChangeConsumesWrapper}
100100
specSelectors={ specSelectors }

src/core/plugins/oas3/wrap-components/parameters.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class Parameters extends Component {
4949
onChangeKey,
5050
} = this.props
5151

52-
changeParam( onChangeKey, param.get("name"), value, isXml)
52+
changeParam( onChangeKey, param.get("name"), param.get("in"), value, isXml)
5353
}
5454

5555
onChangeConsumesWrapper = ( val ) => {

src/core/plugins/spec/actions.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ export const formatIntoYaml = () => ({specActions, specSelectors}) => {
130130
}
131131
}
132132

133-
export function changeParam( path, paramName, value, isXml ){
133+
export function changeParam( path, paramName, paramIn, value, isXml ){
134134
return {
135135
type: UPDATE_PARAM,
136-
payload:{ path, value, paramName, isXml }
136+
payload:{ path, value, paramName, paramIn, isXml }
137137
}
138138
}
139139

@@ -206,7 +206,6 @@ export const executeRequest = (req) =>
206206
// if url is relative, parseUrl makes it absolute by inferring from `window.location`
207207
req.contextUrl = parseUrl(specSelectors.url()).toString()
208208

209-
210209
if(op && op.operationId) {
211210
req.operationId = op.operationId
212211
} else if(op && pathName && method) {

src/core/plugins/spec/reducers.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ export default {
4040
},
4141

4242
[UPDATE_PARAM]: ( state, {payload} ) => {
43-
let { path, paramName, value, isXml } = payload
43+
let { path, paramName, paramIn, value, isXml } = payload
44+
4445
return state.updateIn( [ "resolved", "paths", ...path, "parameters" ], fromJS([]), parameters => {
45-
const index = parameters.findIndex(p => p.get( "name" ) === paramName )
46+
const index = parameters.findIndex(p => p.get( "name" ) === paramName && p.get("in") === paramIn )
4647
if (!(value instanceof win.File)) {
4748
value = fromJSOrdered( value )
4849
}

src/core/plugins/spec/selectors.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,10 +260,10 @@ export const allowTryItOutFor = () => {
260260
}
261261

262262
// Get the parameter value by parameter name
263-
export function getParameter(state, pathMethod, name) {
263+
export function getParameter(state, pathMethod, name, inType) {
264264
let params = spec(state).getIn(["paths", ...pathMethod, "parameters"], fromJS([]))
265265
return params.filter( (p) => {
266-
return Map.isMap(p) && p.get("name") === name
266+
return Map.isMap(p) && p.get("name") === name && p.get("in") === inType
267267
}).first()
268268
}
269269

@@ -280,7 +280,7 @@ export function parameterValues(state, pathMethod, isXml) {
280280
let params = spec(state).getIn(["paths", ...pathMethod, "parameters"], fromJS([]))
281281
return params.reduce( (hash, p) => {
282282
let value = isXml && p.get("in") === "body" ? p.get("value_xml") : p.get("value")
283-
return hash.set(p.get("name"), value)
283+
return hash.set(`${p.get("in")}.${p.get("name")}`, value)
284284
}, fromJS({}))
285285
}
286286

src/core/utils.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,12 +500,25 @@ export const validateString = ( val ) => {
500500
}
501501
}
502502

503+
export const validateDateTime = (val) => {
504+
if (isNaN(Date.parse(val))) {
505+
return "Value must be a DateTime"
506+
}
507+
}
508+
509+
export const validateGuid = (val) => {
510+
if (!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}[)}]?$/.test(val)) {
511+
return "Value must be a Guid"
512+
}
513+
}
514+
503515
// validation of parameters before execute
504516
export const validateParam = (param, isXml) => {
505517
let errors = []
506518
let value = isXml && param.get("in") === "body" ? param.get("value_xml") : param.get("value")
507519
let required = param.get("required")
508520
let type = param.get("type")
521+
let format = param.get("format")
509522

510523
/*
511524
If the parameter is required OR the parameter has a value (meaning optional, but filled in)
@@ -528,7 +541,14 @@ export const validateParam = (param, isXml) => {
528541
}
529542

530543
if ( type === "string" ) {
531-
let err = validateString(value)
544+
let err
545+
if (format === "date-time") {
546+
err = validateDateTime(value)
547+
} else if (format === "uuid") {
548+
err = validateGuid(value)
549+
} else {
550+
err = validateString(value)
551+
}
532552
if (!err) return errors
533553
errors.push(err)
534554
} else if ( type === "boolean" ) {

test/core/plugins/spec/selectors.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ describe("spec plugin - selectors", function(){
2929
"/one": {
3030
get: {
3131
parameters: [
32-
{ name: "one", value: 1},
33-
{ name: "two", value: "duos"}
32+
{ name: "one", in: "query", value: 1},
33+
{ name: "two", in: "query", value: "duos"}
3434
]
3535
}
3636
}
@@ -43,8 +43,8 @@ describe("spec plugin - selectors", function(){
4343

4444
// Then
4545
expect(paramValues.toJS()).toEqual({
46-
one: 1,
47-
two: "duos"
46+
"query.one": 1,
47+
"query.two": "duos"
4848
})
4949

5050
})

test/core/utils.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-env mocha */
22
import expect from "expect"
33
import { fromJS, OrderedMap } from "immutable"
4-
import { mapToList, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered, getAcceptControllingResponse, createDeepLinkPath, escapeDeepLinkPath } from "core/utils"
4+
import { mapToList, validateDateTime, validateGuid, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered, getAcceptControllingResponse, createDeepLinkPath, escapeDeepLinkPath } from "core/utils"
55
import win from "core/window"
66

77
describe("utils", function() {
@@ -158,7 +158,7 @@ describe("utils", function() {
158158
})
159159
})
160160

161-
describe("validateFile", function() {
161+
describe("validateFile", function() {
162162
let errorMessage = "Value must be a file"
163163

164164
it("validates against objects which are instances of 'File'", function() {
@@ -171,6 +171,33 @@ describe("utils", function() {
171171
})
172172
})
173173

174+
describe("validateDateTime", function() {
175+
let errorMessage = "Value must be a DateTime"
176+
177+
it("doesn't return for valid dates", function() {
178+
expect(validateDateTime("Mon, 25 Dec 1995 13:30:00 +0430")).toBeFalsy()
179+
})
180+
181+
it("returns a message for invalid input'", function() {
182+
expect(validateDateTime(null)).toEqual(errorMessage)
183+
expect(validateDateTime("string")).toEqual(errorMessage)
184+
})
185+
})
186+
187+
describe("validateGuid", function() {
188+
let errorMessage = "Value must be a Guid"
189+
190+
it("doesn't return for valid guid", function() {
191+
expect(validateGuid("8ce4811e-cec5-4a29-891a-15d1917153c1")).toBeFalsy()
192+
expect(validateGuid("{8ce4811e-cec5-4a29-891a-15d1917153c1}")).toBeFalsy()
193+
})
194+
195+
it("returns a message for invalid input'", function() {
196+
expect(validateGuid(1)).toEqual(errorMessage)
197+
expect(validateGuid("string")).toEqual(errorMessage)
198+
})
199+
})
200+
174201
describe("validateParam", function() {
175202
let param = null
176203
let result = null

0 commit comments

Comments
 (0)