Browse Source

feat: Display `nullable` for object model itself (#5660) (#5868)

bubble
Vladimir 4 years ago
committed by GitHub
parent
commit
41e595beda
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 80 additions and 1 deletions
  1. +7
    -0
      src/core/components/object-model.jsx
  2. +14
    -0
      test/e2e-cypress/static/documents/bugs/5660-model.yaml
  3. +17
    -0
      test/e2e-cypress/static/documents/bugs/5660-property.yaml
  4. +20
    -0
      test/e2e-cypress/tests/bugs/5660.js
  5. +22
    -1
      test/mocha/components/object-model.jsx

+ 7
- 0
src/core/components/object-model.jsx View File

@@ -5,6 +5,7 @@ import ImPropTypes from "react-immutable-proptypes"

const braceOpen = "{"
const braceClose = "}"
const propStyle = { color: "#6b6b6b", fontStyle: "italic" }

export default class ObjectModel extends Component {
static propTypes = {
@@ -40,11 +41,14 @@ export default class ObjectModel extends Component {
let additionalProperties = schema.get("additionalProperties")
let title = schema.get("title") || displayName || name
let requiredProperties = schema.get("required")
let infoProperties = schema
.filter( ( v, key) => ["nullable"].indexOf(key) !== -1 )

const JumpToPath = getComponent("JumpToPath", true)
const Markdown = getComponent("Markdown", true)
const Model = getComponent("Model")
const ModelCollapse = getComponent("ModelCollapse")
const Property = getComponent("Property")

const JumpToPathSection = () => {
return <span className="model-jump-to-path"><JumpToPath specPath={specPath} /></span>
@@ -217,6 +221,9 @@ export default class ObjectModel extends Component {
</span>
<span className="brace-close">{ braceClose }</span>
</ModelCollapse>
{
infoProperties.size ? infoProperties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propStyle={ propStyle } />) : null
}
</span>
}
}

+ 14
- 0
test/e2e-cypress/static/documents/bugs/5660-model.yaml View File

@@ -0,0 +1,14 @@
openapi: 3.0.2
info:
title: test
description: Nullable model itself
version: '1.0'
paths: {}
components:
schemas:
SomeObject:
type: object
properties:
name:
type: string
nullable: true

+ 17
- 0
test/e2e-cypress/static/documents/bugs/5660-property.yaml View File

@@ -0,0 +1,17 @@
openapi: 3.0.2
info:
title: test
description: Nullable object in model property
version: '1.0'
paths: {}
components:
schemas:
SomeObject:
type: object
properties:
meta:
type: object
properties:
tag:
type: string
nullable: true

+ 20
- 0
test/e2e-cypress/tests/bugs/5660.js View File

@@ -0,0 +1,20 @@
// http://github.com/swagger-api/swagger-ui/issues/5660

const expectedValue = "nullable: true"

describe("#5660: Nullable object", () => {
it("should render `nullable` marker for object ifself", () => {
cy.visit("/?url=/documents/bugs/5660-model.yaml")
.get("#model-SomeObject .model-toggle")
.click()
.get("#model-SomeObject > .model-box")
.contains(expectedValue)
})
it("should render `nullable` marker for nexted object in property", () => {
cy.visit("/?url=/documents/bugs/5660-property.yaml")
.get("#model-SomeObject .model-toggle")
.click()
.get("#model-SomeObject > .model-box")
.contains(expectedValue)
})
})

+ 22
- 1
test/mocha/components/object-model.jsx View File

@@ -7,6 +7,7 @@ import ModelExample from "components/model-example"
import Immutable from "immutable"
import Model from "components/model"
import ModelCollapse from "components/model-collapse"
import Property from "components/property"
import { inferSchema } from "corePlugins/samples/fn"

describe("<ObjectModel />", function() {
@@ -15,7 +16,8 @@ describe("<ObjectModel />", function() {
"JumpToPath" : dummyComponent,
"Markdown" : dummyComponent,
"Model" : Model,
"ModelCollapse" : ModelCollapse
"ModelCollapse" : ModelCollapse,
"Property" : Property
}
const props = {
getComponent: c => components[c],
@@ -52,6 +54,11 @@ describe("<ObjectModel />", function() {
},
className: "for-test"
}
const propsNullable = {
...props,
schema: props.schema.set("nullable", true)
}

it("renders a collapsible header", function(){
const wrapper = shallow(<ObjectModel {...props}/>)
const renderedModelCollapse = wrapper.find(ModelCollapse)
@@ -66,4 +73,18 @@ describe("<ObjectModel />", function() {
expect(renderedModel.get(1).props.schema.get("name")).toEqual("b")
expect(renderedModel.get(2).props.schema.get("name")).toEqual("a")
})

it("doesn't render `nullable` for model when it absent", function() {
const wrapper = shallow(<ObjectModel {...props}/>)
const renderProperties = wrapper.find(Property)
expect(renderProperties.length).toEqual(0)
})

it("renders `nullable` for model", function() {
const wrapper = shallow(<ObjectModel {...propsNullable}/>)
const renderProperties = wrapper.find(Property)
expect(renderProperties.length).toEqual(1)
expect(renderProperties.get(0).props.propKey).toEqual("nullable")
expect(renderProperties.get(0).props.propVal).toEqual(true)
})
})

Loading…
Cancel
Save