Skip to content

Commit 61eb86e

Browse files
authored
Merge branch 'master' into ft/3820-oas3-path-operation-servers
2 parents bb57fd2 + 5015348 commit 61eb86e

File tree

6 files changed

+173
-22
lines changed

6 files changed

+173
-22
lines changed

src/core/components/layout-utils.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export class Select extends React.Component {
183183
{ allowEmptyValue ? <option value="">--</option> : null }
184184
{
185185
allowedValues.map(function (item, key) {
186-
return <option key={ key } value={ String(item) }>{ item }</option>
186+
return <option key={ key } value={ String(item) }>{ String(item) }</option>
187187
})
188188
}
189189
</select>

src/core/components/response-body.jsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ export default class ResponseBody extends React.Component {
5757
(headers["Content-Description"] && (/File Transfer/i).test(headers["Content-Description"])) ||
5858
(headers["content-description"] && (/File Transfer/i).test(headers["content-description"]))) {
5959

60-
let contentLength = headers["content-length"] || headers["Content-Length"]
61-
if ( !(+contentLength) ) return null
62-
6360
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
6461

6562
if (!isSafari && "Blob" in window) {

src/core/json-schema-components.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class JsonSchemaForm extends Component {
3636

3737
let { type, format="" } = schema
3838

39-
let Comp = getComponent(`JsonSchema_${type}_${format}`) || getComponent(`JsonSchema_${type}`) || getComponent("JsonSchema_string")
39+
let Comp = (format ? getComponent(`JsonSchema_${type}_${format}`) : getComponent(`JsonSchema_${type}`)) || getComponent("JsonSchema_string")
4040
return <Comp { ...this.props } fn={fn} getComponent={getComponent} value={value} onChange={onChange} schema={schema}/>
4141
}
4242

@@ -68,19 +68,19 @@ export class JsonSchema_string extends Component {
6868
const isDisabled = schema["in"] === "formData" && !("FormData" in window)
6969
const Input = getComponent("Input")
7070
if (schema["type"] === "file") {
71-
return (<Input type="file"
72-
className={ errors.length ? "invalid" : ""}
71+
return (<Input type="file"
72+
className={ errors.length ? "invalid" : ""}
7373
title={ errors.length ? errors : ""}
74-
onChange={ this.onChange }
74+
onChange={ this.onChange }
7575
disabled={isDisabled}/>)
7676
}
7777
else {
78-
return (<Input type={ schema.format === "password" ? "password" : "text" }
79-
className={ errors.length ? "invalid" : ""}
78+
return (<Input type={ schema.format === "password" ? "password" : "text" }
79+
className={ errors.length ? "invalid" : ""}
8080
title={ errors.length ? errors : ""}
81-
value={value}
82-
placeholder={description}
83-
onChange={ this.onChange }
81+
value={value}
82+
placeholder={description}
83+
onChange={ this.onChange }
8484
disabled={isDisabled}/>)
8585
}
8686
}
@@ -189,8 +189,8 @@ export class JsonSchema_boolean extends Component {
189189
return (<Select className={ errors.length ? "invalid" : ""}
190190
title={ errors.length ? errors : ""}
191191
value={ String(value) }
192-
allowedValues={ fromJS(["true", "false"]) }
193-
allowEmptyValue={ true }
192+
allowedValues={ fromJS(schema.enum || ["true", "false"]) }
193+
allowEmptyValue={ !this.props.required }
194194
onChange={ this.onEnumChange }/>)
195195
}
196196
}

src/core/utils.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,14 +473,17 @@ export const validateParam = (param, isXml, isOAS3 = false) => {
473473
let required = param.get("required")
474474

475475
let paramDetails = isOAS3 ? param.get("schema") : param
476+
477+
if(!paramDetails) return errors
478+
476479
let maximum = paramDetails.get("maximum")
477480
let minimum = paramDetails.get("minimum")
478481
let type = paramDetails.get("type")
479482
let format = paramDetails.get("format")
480483
let maxLength = paramDetails.get("maxLength")
481484
let minLength = paramDetails.get("minLength")
482485
let pattern = paramDetails.get("pattern")
483-
486+
484487

485488
/*
486489
If the parameter is required OR the parameter has a value (meaning optional, but filled in)
@@ -506,7 +509,7 @@ export const validateParam = (param, isXml, isOAS3 = false) => {
506509
let err = validatePattern(value, pattern)
507510
if (err) errors.push(err)
508511
}
509-
512+
510513
if (maxLength || maxLength === 0) {
511514
let err = validateMaxLength(value, maxLength)
512515
if (err) errors.push(err)
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/* eslint-env mocha */
2+
import React from "react"
3+
import expect, { createSpy } from "expect"
4+
import { Select, Input } from "components/layout-utils"
5+
import { render } from "enzyme"
6+
import * as JsonSchemaComponents from "core/json-schema-components"
7+
import { JsonSchemaForm } from "core/json-schema-components"
8+
9+
const components = {...JsonSchemaComponents, Select, Input}
10+
11+
const getComponentStub = (name) => {
12+
if(components[name]) return components[name]
13+
14+
return null
15+
}
16+
17+
describe("<JsonSchemaForm/>", function(){
18+
describe("strings", function() {
19+
it("should render the correct options for a string enum parameter", function(){
20+
21+
let props = {
22+
getComponent: getComponentStub,
23+
value: "",
24+
onChange: () => {},
25+
keyName: "",
26+
fn: {},
27+
schema: {
28+
type: "string",
29+
enum: ["one", "two"]
30+
}
31+
}
32+
33+
let wrapper = render(<JsonSchemaForm {...props}/>)
34+
35+
expect(wrapper.find("select").length).toEqual(1)
36+
expect(wrapper.find("select option").length).toEqual(3)
37+
expect(wrapper.find("select option").eq(0).text()).toEqual("--")
38+
expect(wrapper.find("select option").eq(1).text()).toEqual("one")
39+
expect(wrapper.find("select option").eq(2).text()).toEqual("two")
40+
})
41+
42+
it("should render the correct options for a required string enum parameter", function(){
43+
44+
let props = {
45+
getComponent: getComponentStub,
46+
value: "",
47+
onChange: () => {},
48+
keyName: "",
49+
fn: {},
50+
required: true,
51+
schema: {
52+
type: "string",
53+
enum: ["one", "two"]
54+
}
55+
}
56+
57+
let wrapper = render(<JsonSchemaForm {...props}/>)
58+
59+
expect(wrapper.find("select").length).toEqual(1)
60+
expect(wrapper.find("select option").length).toEqual(2)
61+
expect(wrapper.find("select option").eq(0).text()).toEqual("one")
62+
expect(wrapper.find("select option").eq(1).text()).toEqual("two")
63+
})
64+
})
65+
describe("booleans", function() {
66+
it("should render the correct options for a boolean parameter", function(){
67+
68+
let props = {
69+
getComponent: getComponentStub,
70+
value: "",
71+
onChange: () => {},
72+
keyName: "",
73+
fn: {},
74+
schema: {
75+
type: "boolean"
76+
}
77+
}
78+
79+
let wrapper = render(<JsonSchemaForm {...props}/>)
80+
81+
expect(wrapper.find("select").length).toEqual(1)
82+
expect(wrapper.find("select option").length).toEqual(3)
83+
expect(wrapper.find("select option").eq(0).text()).toEqual("--")
84+
expect(wrapper.find("select option").eq(1).text()).toEqual("true")
85+
expect(wrapper.find("select option").eq(2).text()).toEqual("false")
86+
})
87+
88+
it("should render the correct options for a required enum boolean parameter", function(){
89+
90+
let props = {
91+
getComponent: getComponentStub,
92+
value: "",
93+
onChange: () => {},
94+
keyName: "",
95+
fn: {},
96+
required: true,
97+
schema: {
98+
type: "boolean",
99+
enum: ["true"]
100+
}
101+
}
102+
103+
let wrapper = render(<JsonSchemaForm {...props}/>)
104+
105+
expect(wrapper.find("select").length).toEqual(1)
106+
expect(wrapper.find("select option").length).toEqual(1)
107+
expect(wrapper.find("select option").first().text()).toEqual("true")
108+
})
109+
})
110+
describe("unknown types", function() {
111+
it("should render unknown types as strings", function(){
112+
113+
let props = {
114+
getComponent: getComponentStub,
115+
value: "yo",
116+
onChange: () => {},
117+
keyName: "",
118+
fn: {},
119+
schema: {
120+
type: "NotARealType"
121+
}
122+
}
123+
124+
125+
let wrapper = render(<JsonSchemaForm {...props}/>)
126+
127+
expect(wrapper.find("input").length).toEqual(1)
128+
// expect(wrapper.find("select input").length).toEqual(1)
129+
// expect(wrapper.find("select option").first().text()).toEqual("true")
130+
})
131+
132+
it("should render unknown types as strings when a format is passed", function(){
133+
134+
let props = {
135+
getComponent: getComponentStub,
136+
value: "yo",
137+
onChange: () => {},
138+
keyName: "",
139+
fn: {},
140+
schema: {
141+
type: "NotARealType",
142+
format: "NotARealFormat"
143+
}
144+
}
145+
146+
147+
let wrapper = render(<JsonSchemaForm {...props}/>)
148+
149+
expect(wrapper.find("input").length).toEqual(1)
150+
// expect(wrapper.find("select input").length).toEqual(1)
151+
// expect(wrapper.find("select option").first().text()).toEqual("true")
152+
})
153+
})
154+
})

test/core/utils.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,11 @@ describe("utils", function() {
321321
}
322322

323323
it("should check the isOAS3 flag when validating parameters", function() {
324-
// This should "skip" validation because there is no `schema.type` property
324+
// This should "skip" validation because there is no `schema` property
325325
// and we are telling `validateParam` this is an OAS3 spec
326326
param = fromJS({
327327
value: "",
328-
required: true,
329-
schema: {
330-
notTheTypeProperty: "string"
331-
}
328+
required: true
332329
})
333330
result = validateParam( param, false, true )
334331
expect( result ).toEqual( [] )

0 commit comments

Comments
 (0)