From 408e038b2d638f025304d2cd47893757f769cf0c Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Mon, 11 Sep 2017 20:28:58 -0600 Subject: [PATCH 1/4] fromJS does not maintain order of object properties. Use a reviver function with fromJS inside the response.jsx component for the passed down schema prop. --- src/core/components/parameter-row.jsx | 3 +-- src/core/components/response.jsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/components/parameter-row.jsx b/src/core/components/parameter-row.jsx index 04466a38..456a8e63 100644 --- a/src/core/components/parameter-row.jsx +++ b/src/core/components/parameter-row.jsx @@ -81,12 +81,11 @@ export default class ParameterRow extends Component { const Markdown = getComponent("Markdown") let schema = param.get("schema") - let type = isOAS3 && isOAS3() ? param.getIn(["schema", "type"]) : param.get("type") let isFormData = inType === "formData" let isFormDataSupported = "FormData" in win let required = param.get("required") - let itemType = param.getIn(isOAS3 && isOAS3() ? ["schema", "items", "type"] : ["items", "type"]) + let itemType = param.getIn(isOAS3 && isOAS3() ? ["schema", "items", "type"] : ["items", "type"]) let parameter = specSelectors.getParameter(pathMethod, param.get("name")) let value = parameter ? parameter.get("value") : "" diff --git a/src/core/components/response.jsx b/src/core/components/response.jsx index 8c0a8bf1..a06f05f0 100644 --- a/src/core/components/response.jsx +++ b/src/core/components/response.jsx @@ -117,7 +117,7 @@ export default class Response extends React.Component { value.toOrderedMap() ) } example={ example }/> ) : null} From a47cc284f7ff9e0b01e97309676bc856da56c484 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Tue, 12 Sep 2017 23:06:24 -0600 Subject: [PATCH 2/4] Update response.jsx to use already existing, fromJSOrdered function --- src/core/components/response.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/components/response.jsx b/src/core/components/response.jsx index a06f05f0..02662f90 100644 --- a/src/core/components/response.jsx +++ b/src/core/components/response.jsx @@ -1,7 +1,7 @@ import React from "react" import PropTypes from "prop-types" import { fromJS, Seq } from "immutable" -import { getSampleSchema } from "core/utils" +import { getSampleSchema, fromJSOrdered } from "core/utils" const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => { if ( examples && examples.size ) { @@ -58,7 +58,6 @@ export default class Response extends React.Component { code, response, className, - fn, getComponent, specSelectors, @@ -117,7 +116,7 @@ export default class Response extends React.Component { value.toOrderedMap() ) } + schema={ fromJSOrdered(schema) } example={ example }/> ) : null} From cb88cd53b6799a36bdbf2c7dfe45fa9ca7708bb9 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Tue, 12 Sep 2017 23:07:11 -0600 Subject: [PATCH 3/4] Added test for response.jsx to make sure properties are passed to `ModelExample` component in the correct order --- test/components/response.js | 58 +++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 test/components/response.js diff --git a/test/components/response.js b/test/components/response.js new file mode 100644 index 00000000..2f9919d5 --- /dev/null +++ b/test/components/response.js @@ -0,0 +1,58 @@ +import React from "react" +import expect from "expect" +import { shallow } from "enzyme" +import { fromJS } from "immutable" +import Response from "components/response" +import ModelExample from "components/model-example" +import { inferSchema } from "corePlugins/samples/fn" + +describe("", function() { + const dummyComponent = () => null + const components = { + headers: dummyComponent, + highlightCode: dummyComponent, + modelExample: ModelExample, + Markdown: dummyComponent, + operationLink: dummyComponent, + contentType: dummyComponent + } + const props = { + getComponent: c => components[c], + specSelectors: { + isOAS3() { + return false + } + }, + fn: { + inferSchema + }, + contentType: "application/json", + className: "for-test", + response: fromJS({ + type: "object", + properties: { + // Note reverse order: c, b, a + "c": { + type: "integer" + }, + "b": { + type: "boolean" + }, + "a": { + type: "string" + } + } + }), + code: "200" + } + + it.only("renders the model-example schema properties in order", function() { + const wrapper = shallow() + const renderedModelExample = wrapper.find(ModelExample) + expect(renderedModelExample.length).toEqual(1) + + // Assert the schema's properties have maintained their order + const modelExampleSchemaProperties = renderedModelExample.props().schema.toJS().properties + expect( Object.keys(modelExampleSchemaProperties) ).toEqual(["c", "b", "a"]) + }) +}) \ No newline at end of file From ef99b7e434ac552789ae2373bdf8ca22b5b5cca5 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Tue, 12 Sep 2017 23:09:21 -0600 Subject: [PATCH 4/4] Remove `it.only` from new test --- test/components/response.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/components/response.js b/test/components/response.js index 2f9919d5..6919435a 100644 --- a/test/components/response.js +++ b/test/components/response.js @@ -46,7 +46,7 @@ describe("", function() { code: "200" } - it.only("renders the model-example schema properties in order", function() { + it("renders the model-example schema properties in order", function() { const wrapper = shallow() const renderedModelExample = wrapper.find(ModelExample) expect(renderedModelExample.length).toEqual(1)