Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a0b659a96e | ||
|
|
3efdf1223e | ||
|
|
911a140e38 | ||
|
|
e2d8a4e396 | ||
|
|
39d34523b9 | ||
|
|
d90353228a | ||
|
|
4480db0390 | ||
|
|
2c4327bfd8 | ||
|
|
fd8274b353 | ||
|
|
762a32b59b | ||
|
|
8189fd2473 | ||
|
|
71d39af443 |
+1
-1
@@ -1,6 +1,6 @@
|
||||
FROM alpine:3.5
|
||||
|
||||
MAINTAINER fehguy
|
||||
LABEL maintainer="fehguy"
|
||||
|
||||
ENV VERSION "v2.2.10"
|
||||
ENV FOLDER "swagger-ui-2.2.10"
|
||||
|
||||
@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 5 revisions since initial creation in 20
|
||||
|
||||
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes
|
||||
------------------ | ------------ | -------------------------- | -----
|
||||
3.13.1 | 2018-03-23 | 2.0, 3.0 | [tag v3.13.1](https://github.com/swagger-api/swagger-ui/tree/v3.13.1)
|
||||
3.13.3 | 2018-03-23 | 2.0, 3.0 | [tag v3.13.3](https://github.com/swagger-api/swagger-ui/tree/v3.13.3)
|
||||
3.0.21 | 2017-07-26 | 2.0 | [tag v3.0.21](https://github.com/swagger-api/swagger-ui/tree/v3.0.21)
|
||||
2.2.10 | 2017-01-04 | 1.1, 1.2, 2.0 | [tag v2.2.10](https://github.com/swagger-api/swagger-ui/tree/v2.2.10)
|
||||
2.1.5 | 2016-07-20 | 1.1, 1.2, 2.0 | [tag v2.1.5](https://github.com/swagger-api/swagger-ui/tree/v2.1.5)
|
||||
|
||||
Vendored
+18
-18
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -66,8 +66,8 @@ Parameter Name | Description
|
||||
Parameter Name | Description
|
||||
--- | ---
|
||||
`oauth2RedirectUrl` | `String`. OAuth redirect URL.
|
||||
`requestInterceptor` | `Function=(a => a)`. MUST be a function. Function to intercept remote definition, Try-It-Out, and OAuth2 requests. Accepts one argument requestInterceptor(request) and must return the potentially modified request.
|
||||
`responseInterceptor` |`Function=(a => a)`. MUST be a function. Function to intercept remote definition, Try-It-Out, and OAuth2 responses. Accepts one argument responseInterceptor(response) and must return the potentially modified response.
|
||||
`requestInterceptor` | `Function=(a => a)`. MUST be a function. Function to intercept remote definition, Try-It-Out, and OAuth2 requests. Accepts one argument requestInterceptor(request) and must return the modified request, or a Promise that resolves to the modified request.
|
||||
`responseInterceptor` |`Function=(a => a)`. MUST be a function. Function to intercept remote definition, Try-It-Out, and OAuth2 responses. Accepts one argument responseInterceptor(response) and must return the modified response, or a Promise that resolves to the modified response.
|
||||
`showMutatedRequest` | `Boolean=true`. If set to `true`, uses the mutated request returned from a requestInterceptor to produce the curl command in the UI, otherwise the request before the requestInterceptor was applied is used.
|
||||
`supportedSubmitMethods` | `Array=["get", "put", "post", "delete", "options", "head", "patch", "trace"]`. List of HTTP methods that have the Try it out feature enabled. An empty array disables Try it out for all operations. This does not filter the operations from the display.
|
||||
`validatorUrl` | `String="https://online.swagger.io/validator" OR null`. By default, Swagger-UI attempts to validate specs against swagger.io's online validator. You can use this parameter to set a different validator URL, for example for locally deployed validators ([Validator Badge](https://github.com/swagger-api/validator-badge)). Setting it to `null` will disable validation.
|
||||
|
||||
+4
-5
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "swagger-ui",
|
||||
"version": "3.13.1",
|
||||
"version": "3.13.3",
|
||||
"main": "dist/swagger-ui.js",
|
||||
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||
"contributors": [
|
||||
@@ -19,9 +19,8 @@
|
||||
"build-core": "webpack --config webpack-dist.config.js --colors",
|
||||
"build-standalone": "webpack --config webpack-dist-standalone.config.js --colors",
|
||||
"predev": "npm install",
|
||||
"dev": "npm-run-all --parallel hot-server open-localhost",
|
||||
"dev": "npm-run-all --parallel hot-server",
|
||||
"watch": "webpack --config webpack-watch.config.js --watch --progress",
|
||||
"open-localhost": "node -e 'require(\"open\")(\"http://localhost:3200\")'",
|
||||
"hot-server": "webpack-dev-server --host 0.0.0.0 --config webpack-hot-dev-server.config.js --inline --hot --progress --content-base dev-helpers/",
|
||||
"deps-license": "license-checker --production --csv --out $npm_package_config_deps_check_dir/licenses.csv && license-checker --development --csv --out $npm_package_config_deps_check_dir/licenses-dev.csv",
|
||||
"deps-size": "webpack -p --config webpack.check.js --json | webpack-bundle-size-analyzer >| $npm_package_config_deps_check_dir/sizes.txt",
|
||||
@@ -37,7 +36,7 @@
|
||||
"test-e2e": "sleep 3 && nightwatch test/e2e/scenarios/ --config test/e2e/nightwatch.json",
|
||||
"e2e-initial-render": "nightwatch test/e2e/scenarios/ --config test/e2e/nightwatch.json --group initial-render",
|
||||
"mock-api": "json-server --watch test/e2e/db.json --port 3204",
|
||||
"hot-e2e-server": "webpack-dev-server --content-base test/e2e/helpers --host 0.0.0.0 --config webpack-hot-dev-server.config.js --inline --hot --progress",
|
||||
"hot-e2e-server": "webpack-dev-server --port 3230 --content-base test/e2e/helpers --host 0.0.0.0 --config webpack-hot-dev-server.config.js --inline --hot --progress",
|
||||
"e2e": "npm-run-all --parallel -r hot-e2e-server mock-api test-e2e"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -84,7 +83,7 @@
|
||||
"scroll-to-element": "^2.0.0",
|
||||
"serialize-error": "2.0.0",
|
||||
"shallowequal": "0.2.2",
|
||||
"swagger-client": "^3.5.2",
|
||||
"swagger-client": "^3.6.0",
|
||||
"url-parse": "^1.1.8",
|
||||
"whatwg-fetch": "0.11.1",
|
||||
"worker-loader": "^0.7.1",
|
||||
|
||||
@@ -60,7 +60,7 @@ export default class LiveResponse extends React.Component {
|
||||
const body = response.get("text")
|
||||
const duration = response.get("duration")
|
||||
const headersKeys = Object.keys(headers)
|
||||
const contentType = headers["content-type"]
|
||||
const contentType = headers["content-type"] || headers["Content-Type"]
|
||||
|
||||
const Curl = getComponent("curl")
|
||||
const ResponseBody = getComponent("responseBody")
|
||||
|
||||
@@ -72,6 +72,7 @@ export default class Operation extends PureComponent {
|
||||
tag,
|
||||
showSummary,
|
||||
operationId,
|
||||
originalOperationId,
|
||||
allowTryItOut,
|
||||
displayOperationId,
|
||||
displayRequestDuration,
|
||||
@@ -140,7 +141,7 @@ export default class Operation extends PureComponent {
|
||||
</div>
|
||||
}
|
||||
|
||||
{ displayOperationId && operationId ? <span className="opblock-summary-operation-id">{operationId}</span> : null }
|
||||
{ displayOperationId && (originalOperationId || operationId) ? <span className="opblock-summary-operation-id">{originalOperationId || operationId}</span> : null }
|
||||
|
||||
{
|
||||
(!security || !security.count()) ? null :
|
||||
|
||||
@@ -107,40 +107,43 @@ export default class ParameterRow extends Component {
|
||||
|
||||
let paramWithMeta = specSelectors.parameterWithMeta(pathMethod, param.get("name"), param.get("in"))
|
||||
|
||||
let schema = param.get("schema")
|
||||
let type = isOAS3 && isOAS3() ? param.getIn(["schema", "type"]) : param.get("type")
|
||||
let schema = isOAS3 && isOAS3() ? param.get("schema") : param
|
||||
let type = schema.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 = schema.getIn(["items", "type"])
|
||||
let value = paramWithMeta ? paramWithMeta.get("value") : ""
|
||||
let extensions = getExtensions(param)
|
||||
|
||||
let paramItems // undefined
|
||||
let paramItemsEnum // undefined
|
||||
let isDisplayParamItemsEnum = false
|
||||
let paramEnum // undefined
|
||||
let paramDefaultValue // undefined
|
||||
let paramExample // undefined
|
||||
let isDisplayParamEnum = false
|
||||
|
||||
if ( param !== undefined ) {
|
||||
paramItems = param.get("items")
|
||||
paramItems = schema.get("items")
|
||||
}
|
||||
if ( paramItems !== undefined ) {
|
||||
paramItemsEnum = param.get("items").get("enum")
|
||||
|
||||
if (paramItems !== undefined) {
|
||||
paramEnum = paramItems.get("enum")
|
||||
paramDefaultValue = paramItems.get("default")
|
||||
} else {
|
||||
paramEnum = schema.get("enum")
|
||||
}
|
||||
if ( paramItemsEnum !== undefined ) {
|
||||
if (paramItemsEnum.size > 0) {
|
||||
isDisplayParamItemsEnum = true
|
||||
}
|
||||
|
||||
if ( paramEnum !== undefined && paramEnum.size > 0) {
|
||||
isDisplayParamEnum = true
|
||||
}
|
||||
|
||||
// Default and Example Value for readonly doc
|
||||
let paramDefaultValue // undefined
|
||||
let paramExample // undefined
|
||||
if ( param !== undefined ) {
|
||||
paramDefaultValue = param.get("default")
|
||||
paramDefaultValue = schema.get("default")
|
||||
paramExample = param.get("example")
|
||||
}
|
||||
|
||||
if (isDisplayParamItemsEnum) { // if we have an array, default value is in "items"
|
||||
paramDefaultValue = paramItems.get("default")
|
||||
if (paramExample === undefined) {
|
||||
paramExample = param.get("x-example")
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
@@ -159,23 +162,18 @@ export default class ParameterRow extends Component {
|
||||
</td>
|
||||
|
||||
<td className="col parameters-col_description">
|
||||
<Markdown source={ param.get("description") }/>
|
||||
{ param.get("description") ? <Markdown source={ param.get("description") }/> : null }
|
||||
|
||||
{ (bodyParam || !isExecute) && isDisplayParamItemsEnum ?
|
||||
<Markdown source={
|
||||
"<i>Available values</i>: " + paramItemsEnum.map(function(item) {
|
||||
{ (bodyParam || !isExecute) && isDisplayParamEnum ?
|
||||
<Markdown className="parameter__enum" source={
|
||||
"<i>Available values</i> : " + paramEnum.map(function(item) {
|
||||
return item
|
||||
}).toArray().join(", ")}/>
|
||||
: null
|
||||
}
|
||||
|
||||
{ (bodyParam || !isExecute) && paramDefaultValue !== undefined ?
|
||||
<Markdown source={"<i>Default value</i>: " + paramDefaultValue}/>
|
||||
: null
|
||||
}
|
||||
|
||||
{ (bodyParam || !isExecute) && paramExample !== undefined ?
|
||||
<Markdown source={"<i>Example</i>: " + paramExample}/>
|
||||
<Markdown className="parameter__default" source={"<i>Default value</i> : " + paramDefaultValue}/>
|
||||
: null
|
||||
}
|
||||
|
||||
@@ -188,8 +186,8 @@ export default class ParameterRow extends Component {
|
||||
required={ required }
|
||||
description={param.get("description") ? `${param.get("name")} - ${param.get("description")}` : `${param.get("name")}`}
|
||||
onChange={ this.onChangeWrapper }
|
||||
errors={ param.get("errors") }
|
||||
schema={ isOAS3 && isOAS3() ? param.get("schema") : param }/>
|
||||
errors={ paramWithMeta.get("errors") }
|
||||
schema={ schema }/>
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,11 +2,12 @@ import React from "react"
|
||||
import PropTypes from "prop-types"
|
||||
import Remarkable from "remarkable"
|
||||
import sanitize from "sanitize-html"
|
||||
import cx from "classnames"
|
||||
|
||||
// eslint-disable-next-line no-useless-escape
|
||||
const isPlainText = (str) => /^[A-Z\s0-9!?\.]+$/gi.test(str)
|
||||
|
||||
function Markdown({ source }) {
|
||||
function Markdown({ source, className = "" }) {
|
||||
if(isPlainText(source)) {
|
||||
// If the source text is not Markdown,
|
||||
// let's save some time and just render it.
|
||||
@@ -28,12 +29,13 @@ function Markdown({ source }) {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="markdown" dangerouslySetInnerHTML={{ __html: sanitized }}></div>
|
||||
<div className={cx(className, "markdown")} dangerouslySetInnerHTML={{ __html: sanitized }}></div>
|
||||
)
|
||||
}
|
||||
|
||||
Markdown.propTypes = {
|
||||
source: PropTypes.string.isRequired
|
||||
source: PropTypes.string.isRequired,
|
||||
className: PropTypes.string.isRequired
|
||||
}
|
||||
|
||||
export default Markdown
|
||||
|
||||
@@ -58,7 +58,7 @@ export default class OperationContainer extends PureComponent {
|
||||
const { op, layoutSelectors, getConfigs } = props
|
||||
const { docExpansion, deepLinking, displayOperationId, displayRequestDuration, supportedSubmitMethods } = getConfigs()
|
||||
const showSummary = layoutSelectors.showSummary()
|
||||
const operationId = op.getIn(["operation", "operationId"]) || op.getIn(["operation", "__originalOperationId"]) || opId(op.get("operation"), props.path, props.method) || op.get("id")
|
||||
const operationId = op.getIn(["operation", "__originalOperationId"]) || op.getIn(["operation", "operationId"]) || opId(op.get("operation"), props.path, props.method) || op.get("id")
|
||||
const isShownKey = ["operations", props.tag, operationId]
|
||||
const isDeepLinkingEnabled = deepLinking && deepLinking !== "false"
|
||||
const allowTryItOut = supportedSubmitMethods.indexOf(props.method) >= 0 && (typeof props.allowTryItOut === "undefined" ?
|
||||
@@ -105,7 +105,8 @@ export default class OperationContainer extends PureComponent {
|
||||
|
||||
toggleShown =() => {
|
||||
let { layoutActions, tag, operationId, isShown } = this.props
|
||||
if(!isShown) {
|
||||
const resolvedSubtree = this.getResolvedSubtree()
|
||||
if(!isShown && resolvedSubtree === undefined) {
|
||||
// transitioning from collapsed to expanded
|
||||
this.requestResolvedSubtree()
|
||||
}
|
||||
@@ -203,6 +204,7 @@ export default class OperationContainer extends PureComponent {
|
||||
security,
|
||||
isAuthorized,
|
||||
operationId,
|
||||
originalOperationId: resolvedSubtree.getIn(["operation", "__originalOperationId"]),
|
||||
showSummary,
|
||||
isShown,
|
||||
jumpToKey,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import parseUrl from "url-parse"
|
||||
import win from "core/window"
|
||||
import { btoa, buildFormData } from "core/utils"
|
||||
|
||||
@@ -139,15 +140,25 @@ export const authorizeAccessCodeWithBasicAuthentication = ( { auth, redirectUrl
|
||||
return authActions.authorizeRequest({body: buildFormData(form), name, url: schema.get("tokenUrl"), auth, headers})
|
||||
}
|
||||
|
||||
export const authorizeRequest = ( data ) => ( { fn, getConfigs, authActions, errActions, authSelectors } ) => {
|
||||
export const authorizeRequest = ( data ) => ( { fn, getConfigs, authActions, errActions, oas3Selectors, specSelectors, authSelectors } ) => {
|
||||
let { body, query={}, headers={}, name, url, auth } = data
|
||||
let { additionalQueryStringParams } = authSelectors.getConfigs() || {}
|
||||
let fetchUrl = url
|
||||
|
||||
for (let key in additionalQueryStringParams) {
|
||||
url += "&" + key + "=" + encodeURIComponent(additionalQueryStringParams[key])
|
||||
let { additionalQueryStringParams } = authSelectors.getConfigs() || {}
|
||||
|
||||
let parsedUrl
|
||||
|
||||
if (specSelectors.isOAS3()) {
|
||||
parsedUrl = parseUrl(url, oas3Selectors.selectedServer(), true)
|
||||
} else {
|
||||
parsedUrl = parseUrl(url, specSelectors.url(), true)
|
||||
}
|
||||
|
||||
if(typeof additionalQueryStringParams === "object") {
|
||||
parsedUrl.query = Object.assign({}, parsedUrl.query, additionalQueryStringParams)
|
||||
}
|
||||
|
||||
const fetchUrl = parsedUrl.toString()
|
||||
|
||||
let _headers = Object.assign({
|
||||
"Accept":"application/json, text/plain, */*",
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import React from "react"
|
||||
import PropTypes from "prop-types"
|
||||
import ReactMarkdown from "react-markdown"
|
||||
import cx from "classnames"
|
||||
import { Parser, HtmlRenderer } from "commonmark"
|
||||
import { OAS3ComponentWrapFactory } from "../helpers"
|
||||
import { sanitizer } from "core/components/providers/markdown"
|
||||
|
||||
export const Markdown = ({ source }) => {
|
||||
export const Markdown = ({ source, className = "" }) => {
|
||||
if ( source ) {
|
||||
const parser = new Parser()
|
||||
const writer = new HtmlRenderer()
|
||||
@@ -19,14 +20,15 @@ export const Markdown = ({ source }) => {
|
||||
return (
|
||||
<ReactMarkdown
|
||||
source={sanitized}
|
||||
className={"renderedMarkdown"}
|
||||
className={cx(className, "renderedMarkdown")}
|
||||
/>
|
||||
)
|
||||
}
|
||||
return null
|
||||
}
|
||||
Markdown.propTypes = {
|
||||
source: PropTypes.string
|
||||
source: PropTypes.string,
|
||||
className: PropTypes.string,
|
||||
}
|
||||
|
||||
export default OAS3ComponentWrapFactory(Markdown)
|
||||
export default OAS3ComponentWrapFactory(Markdown)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { objectify, isFunc, normalizeArray } from "core/utils"
|
||||
import { objectify, isFunc, normalizeArray, deeplyStripKey } from "core/utils"
|
||||
import XML from "xml"
|
||||
import memoizee from "memoizee"
|
||||
|
||||
@@ -29,13 +29,14 @@ export const sampleFromSchema = (schema, config={}) => {
|
||||
let { type, example, properties, additionalProperties, items } = objectify(schema)
|
||||
let { includeReadOnly, includeWriteOnly } = config
|
||||
|
||||
if(example && example.$$ref) {
|
||||
delete example.$$ref
|
||||
if(example !== undefined) {
|
||||
return deeplyStripKey(example, "$$ref", (val) => {
|
||||
// do a couple of quick sanity tests to ensure the value
|
||||
// looks like a $$ref that swagger-client generates.
|
||||
return typeof val === "string" && val.indexOf("#") > -1
|
||||
})
|
||||
}
|
||||
|
||||
if(example !== undefined)
|
||||
return example
|
||||
|
||||
if(!type) {
|
||||
if(properties) {
|
||||
type = "object"
|
||||
|
||||
@@ -54,7 +54,7 @@ const mergerFn = (oldVal, newVal) => {
|
||||
return newVal
|
||||
}
|
||||
|
||||
return Map().mergeWith(
|
||||
return OrderedMap().mergeWith(
|
||||
mergerFn,
|
||||
oldVal,
|
||||
newVal
|
||||
@@ -66,7 +66,7 @@ const mergerFn = (oldVal, newVal) => {
|
||||
|
||||
export const specJsonWithResolvedSubtrees = createSelector(
|
||||
state,
|
||||
spec => Map().mergeWith(
|
||||
spec => OrderedMap().mergeWith(
|
||||
mergerFn,
|
||||
spec.get("json"),
|
||||
spec.get("resolvedSubtrees")
|
||||
@@ -109,7 +109,7 @@ export const semver = createSelector(
|
||||
)
|
||||
|
||||
export const paths = createSelector(
|
||||
spec,
|
||||
specJsonWithResolvedSubtrees,
|
||||
spec => spec.get("paths")
|
||||
)
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import get from "lodash/get"
|
||||
|
||||
export const updateSpec = (ori, {specActions}) => (...args) => {
|
||||
ori(...args)
|
||||
specActions.parseToJson(...args)
|
||||
@@ -5,7 +7,21 @@ export const updateSpec = (ori, {specActions}) => (...args) => {
|
||||
|
||||
export const updateJsonSpec = (ori, {specActions}) => (...args) => {
|
||||
ori(...args)
|
||||
|
||||
specActions.invalidateResolvedSubtreeCache()
|
||||
|
||||
// Trigger resolution of any path-level $refs.
|
||||
const [json] = args
|
||||
const pathItems = get(json, ["paths"])
|
||||
const pathItemKeys = Object.keys(pathItems)
|
||||
|
||||
pathItemKeys.forEach(k => {
|
||||
const val = get(pathItems, [k])
|
||||
|
||||
if(val.$ref) {
|
||||
specActions.requestResolvedSubtree(["paths", k])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Log the request ( just for debugging, shouldn't affect prod )
|
||||
|
||||
@@ -712,3 +712,25 @@ export const createDeepLinkPath = (str) => typeof str == "string" || str instanc
|
||||
export const escapeDeepLinkPath = (str) => cssEscape( createDeepLinkPath(str) )
|
||||
|
||||
export const getExtensions = (defObj) => defObj.filter((v, k) => /^x-/.test(k))
|
||||
|
||||
// Deeply strips a specific key from an object.
|
||||
//
|
||||
// `predicate` can be used to discriminate the stripping further,
|
||||
// by preserving the key's place in the object based on its value.
|
||||
export function deeplyStripKey(input, keyToStrip, predicate = () => true) {
|
||||
if(typeof input !== "object" || Array.isArray(input) || !keyToStrip) {
|
||||
return input
|
||||
}
|
||||
|
||||
const obj = Object.assign({}, input)
|
||||
|
||||
Object.keys(obj).forEach(k => {
|
||||
if(k === keyToStrip && predicate(obj[k], k)) {
|
||||
delete obj[k]
|
||||
return
|
||||
}
|
||||
obj[k] = deeplyStripKey(obj[k], keyToStrip, predicate)
|
||||
})
|
||||
|
||||
return obj
|
||||
}
|
||||
|
||||
@@ -6,23 +6,8 @@ import ModelExample from "components/model-example"
|
||||
import ModelComponent from "components/model-wrapper"
|
||||
|
||||
describe("<ModelExample/>", function(){
|
||||
// Given
|
||||
let components = {
|
||||
ModelWrapper: ModelComponent
|
||||
}
|
||||
let props = {
|
||||
getComponent: (c) => {
|
||||
return components[c]
|
||||
},
|
||||
specSelectors: {},
|
||||
schema: {},
|
||||
example: "{\"example\": \"value\"}",
|
||||
isExecute: false,
|
||||
getConfigs: () => ({
|
||||
defaultModelRendering: "model",
|
||||
defaultModelExpandDepth: 1
|
||||
})
|
||||
}
|
||||
let components, props
|
||||
|
||||
let exampleSelectedTestInputs = [
|
||||
{ defaultModelRendering: "model", isExecute: true },
|
||||
{ defaultModelRendering: "example", isExecute: true },
|
||||
@@ -30,10 +15,31 @@ describe("<ModelExample/>", function(){
|
||||
{ defaultModelRendering: "othervalue", isExecute: true },
|
||||
{ defaultModelRendering: "othervalue", isExecute: false }
|
||||
]
|
||||
|
||||
let modelSelectedTestInputs = [
|
||||
{ defaultModelRendering: "model", isExecute: false }
|
||||
]
|
||||
|
||||
beforeEach(() => {
|
||||
components = {
|
||||
ModelWrapper: ModelComponent
|
||||
}
|
||||
|
||||
props = {
|
||||
getComponent: (c) => {
|
||||
return components[c]
|
||||
},
|
||||
specSelectors: {},
|
||||
schema: {},
|
||||
example: "{\"example\": \"value\"}",
|
||||
isExecute: false,
|
||||
getConfigs: () => ({
|
||||
defaultModelRendering: "model",
|
||||
defaultModelExpandDepth: 1
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
it("renders model and example tabs", function(){
|
||||
// When
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
/* eslint-env mocha */
|
||||
import expect, { createSpy } from "expect"
|
||||
import { authorizeRequest } from "corePlugins/auth/actions"
|
||||
|
||||
describe("auth plugin - actions", () => {
|
||||
|
||||
describe("authorizeRequest", () => {
|
||||
|
||||
[
|
||||
[
|
||||
{
|
||||
oas3: true,
|
||||
server: "https://host/resource",
|
||||
scheme: "http",
|
||||
host: null,
|
||||
url: "http://specs/file",
|
||||
},
|
||||
"https://host/authorize"
|
||||
],
|
||||
[
|
||||
{
|
||||
oas3: false,
|
||||
server: null,
|
||||
scheme: "https",
|
||||
host: undefined,
|
||||
url: "https://specs/file",
|
||||
},
|
||||
"https://specs/authorize"
|
||||
],
|
||||
[
|
||||
{
|
||||
oas3: false,
|
||||
server: null,
|
||||
scheme: "https",
|
||||
host: "host",
|
||||
url: "http://specs/file",
|
||||
},
|
||||
"http://specs/authorize"
|
||||
],
|
||||
].forEach(([{oas3, server, scheme, host, url}, expectedFetchUrl]) => {
|
||||
it("should resolve authorization endpoint against the server URL", () => {
|
||||
|
||||
// Given
|
||||
const data = {
|
||||
url: "/authorize"
|
||||
}
|
||||
const system = {
|
||||
fn: {
|
||||
fetch: createSpy().andReturn(Promise.resolve())
|
||||
},
|
||||
getConfigs: () => ({}),
|
||||
authSelectors: {
|
||||
getConfigs: () => ({})
|
||||
},
|
||||
oas3Selectors: {
|
||||
selectedServer: () => server
|
||||
},
|
||||
specSelectors: {
|
||||
isOAS3: () => oas3,
|
||||
operationScheme: () => scheme,
|
||||
host: () => host,
|
||||
url: () => url
|
||||
}
|
||||
}
|
||||
|
||||
// When
|
||||
authorizeRequest(data)(system)
|
||||
|
||||
// Then
|
||||
expect(system.fn.fetch.calls.length).toEqual(1)
|
||||
expect(system.fn.fetch.calls[0].arguments[0]).toInclude({url: expectedFetchUrl})
|
||||
})
|
||||
})
|
||||
|
||||
it("should add additionalQueryStringParams to Swagger 2.0 authorization and token URLs", () => {
|
||||
|
||||
// Given
|
||||
const data = {
|
||||
url: "/authorize?q=1"
|
||||
}
|
||||
const system = {
|
||||
fn: {
|
||||
fetch: createSpy().andReturn(Promise.resolve())
|
||||
},
|
||||
getConfigs: () => ({}),
|
||||
authSelectors: {
|
||||
getConfigs: () => ({
|
||||
additionalQueryStringParams: {
|
||||
myCustomParam: "abc123"
|
||||
}
|
||||
})
|
||||
},
|
||||
specSelectors: {
|
||||
isOAS3: () => false,
|
||||
operationScheme: () => "https",
|
||||
host: () => "http://google.com",
|
||||
url: () => "http://google.com/swagger.json"
|
||||
}
|
||||
}
|
||||
|
||||
// When
|
||||
authorizeRequest(data)(system)
|
||||
|
||||
// Then
|
||||
expect(system.fn.fetch.calls.length).toEqual(1)
|
||||
|
||||
expect(system.fn.fetch.calls[0].arguments[0].url)
|
||||
.toEqual("http://google.com/authorize?q=1&myCustomParam=abc123")
|
||||
})
|
||||
|
||||
it("should add additionalQueryStringParams to OpenAPI 3.0 authorization and token URLs", () => {
|
||||
|
||||
// Given
|
||||
const data = {
|
||||
url: "/authorize?q=1"
|
||||
}
|
||||
const system = {
|
||||
fn: {
|
||||
fetch: createSpy().andReturn(Promise.resolve())
|
||||
},
|
||||
getConfigs: () => ({}),
|
||||
authSelectors: {
|
||||
getConfigs: () => ({
|
||||
additionalQueryStringParams: {
|
||||
myCustomParam: "abc123"
|
||||
}
|
||||
})
|
||||
},
|
||||
oas3Selectors: {
|
||||
selectedServer: () => "http://google.com"
|
||||
},
|
||||
specSelectors: {
|
||||
isOAS3: () => true,
|
||||
}
|
||||
}
|
||||
|
||||
// When
|
||||
authorizeRequest(data)(system)
|
||||
|
||||
// Then
|
||||
expect(system.fn.fetch.calls.length).toEqual(1)
|
||||
|
||||
expect(system.fn.fetch.calls[0].arguments[0].url)
|
||||
.toEqual("http://google.com/authorize?q=1&myCustomParam=abc123")
|
||||
})
|
||||
})
|
||||
})
|
||||
+108
-22
@@ -100,6 +100,92 @@ describe("sampleFromSchema", function() {
|
||||
expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected)
|
||||
})
|
||||
|
||||
it("returns object without any $$ref fields at the root schema level", function () {
|
||||
var definition = {
|
||||
type: "object",
|
||||
properties: {
|
||||
message: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
example: {
|
||||
value: {
|
||||
message: "Hello, World!"
|
||||
},
|
||||
$$ref: "#/components/examples/WelcomeExample"
|
||||
},
|
||||
$$ref: "#/components/schemas/Welcome"
|
||||
}
|
||||
|
||||
var expected = {
|
||||
"value": {
|
||||
"message": "Hello, World!"
|
||||
}
|
||||
}
|
||||
|
||||
expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected)
|
||||
})
|
||||
|
||||
it("returns object without any $$ref fields at nested schema levels", function () {
|
||||
var definition = {
|
||||
type: "object",
|
||||
properties: {
|
||||
message: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
example: {
|
||||
a: {
|
||||
value: {
|
||||
message: "Hello, World!"
|
||||
},
|
||||
$$ref: "#/components/examples/WelcomeExample"
|
||||
}
|
||||
},
|
||||
$$ref: "#/components/schemas/Welcome"
|
||||
}
|
||||
|
||||
var expected = {
|
||||
a: {
|
||||
"value": {
|
||||
"message": "Hello, World!"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected)
|
||||
})
|
||||
|
||||
it("returns object with any $$ref fields that appear to be user-created", function () {
|
||||
var definition = {
|
||||
type: "object",
|
||||
properties: {
|
||||
message: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
example: {
|
||||
$$ref: {
|
||||
value: {
|
||||
message: "Hello, World!"
|
||||
},
|
||||
$$ref: "#/components/examples/WelcomeExample"
|
||||
}
|
||||
},
|
||||
$$ref: "#/components/schemas/Welcome"
|
||||
}
|
||||
|
||||
var expected = {
|
||||
$$ref: {
|
||||
"value": {
|
||||
"message": "Hello, World!"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected)
|
||||
})
|
||||
|
||||
describe("for array type", function() {
|
||||
it("returns array with sample of array type", function() {
|
||||
var definition = {
|
||||
@@ -108,12 +194,12 @@ describe("sampleFromSchema", function() {
|
||||
type: "integer"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ 0 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
|
||||
it("returns array of examples for array that has example", function() {
|
||||
var definition = {
|
||||
type: "array",
|
||||
@@ -122,9 +208,9 @@ describe("sampleFromSchema", function() {
|
||||
},
|
||||
example: "dog"
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "dog" ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
@@ -132,16 +218,16 @@ describe("sampleFromSchema", function() {
|
||||
var definition = {
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string",
|
||||
type: "string",
|
||||
},
|
||||
example: [ "dog", "cat" ]
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "dog", "cat" ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
|
||||
it("returns array of samples for oneOf type", function() {
|
||||
var definition = {
|
||||
type: "array",
|
||||
@@ -154,9 +240,9 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ 0 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
@@ -175,9 +261,9 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "string", 0 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
@@ -198,12 +284,12 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "dog", 1 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
|
||||
it("returns array of samples for anyOf type", function() {
|
||||
var definition = {
|
||||
type: "array",
|
||||
@@ -216,9 +302,9 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ 0 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
@@ -237,9 +323,9 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "string", 0 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
|
||||
@@ -260,9 +346,9 @@ describe("sampleFromSchema", function() {
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var expected = [ "dog", 1 ]
|
||||
|
||||
|
||||
expect(sampleFromSchema(definition)).toEqual(expected)
|
||||
})
|
||||
})
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
/* eslint-env mocha */
|
||||
import expect from "expect"
|
||||
import { fromJS } from "immutable"
|
||||
import { fromJSOrdered } from "core/utils"
|
||||
import {
|
||||
parameterValues,
|
||||
contentTypeValues,
|
||||
@@ -9,6 +10,8 @@ import {
|
||||
operationConsumes
|
||||
} from "corePlugins/spec/selectors"
|
||||
|
||||
import Petstore from "./assets/petstore.json"
|
||||
|
||||
describe("spec plugin - selectors", function(){
|
||||
|
||||
describe("parameterValue", function(){
|
||||
@@ -311,7 +314,6 @@ describe("spec plugin - selectors", function(){
|
||||
|
||||
})
|
||||
|
||||
|
||||
describe("specJsonWithResolvedSubtrees", function(){
|
||||
|
||||
it("should return a correctly merged tree", function(){
|
||||
@@ -360,5 +362,93 @@ describe("spec plugin - selectors", function(){
|
||||
}
|
||||
})
|
||||
})
|
||||
it("should preserve initial map key ordering", function(){
|
||||
// Given
|
||||
let state = fromJSOrdered({
|
||||
json: Petstore,
|
||||
resolvedSubtrees: {
|
||||
paths: {
|
||||
"/pet/{petId}": {
|
||||
post: {
|
||||
tags: [
|
||||
"pet"
|
||||
],
|
||||
summary: "Updates a pet in the store with form data",
|
||||
description: "",
|
||||
operationId: "updatePetWithForm",
|
||||
consumes: [
|
||||
"application/x-www-form-urlencoded"
|
||||
],
|
||||
produces: [
|
||||
"application/xml",
|
||||
"application/json"
|
||||
],
|
||||
parameters: [
|
||||
{
|
||||
name: "petId",
|
||||
"in": "path",
|
||||
description: "ID of pet that needs to be updated",
|
||||
required: true,
|
||||
type: "integer",
|
||||
format: "int64"
|
||||
},
|
||||
{
|
||||
name: "name",
|
||||
"in": "formData",
|
||||
description: "Updated name of the pet",
|
||||
required: false,
|
||||
type: "string"
|
||||
},
|
||||
{
|
||||
name: "status",
|
||||
"in": "formData",
|
||||
description: "Updated status of the pet",
|
||||
required: false,
|
||||
type: "string"
|
||||
}
|
||||
],
|
||||
responses: {
|
||||
"405": {
|
||||
description: "Invalid input"
|
||||
}
|
||||
},
|
||||
security: [
|
||||
{
|
||||
petstore_auth: [
|
||||
"write:pets",
|
||||
"read:pets"
|
||||
]
|
||||
}
|
||||
],
|
||||
__originalOperationId: "updatePetWithForm"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// When
|
||||
let result = specJsonWithResolvedSubtrees(state)
|
||||
|
||||
// Then
|
||||
const correctOrder = [
|
||||
"/pet",
|
||||
"/pet/findByStatus",
|
||||
"/pet/findByTags",
|
||||
"/pet/{petId}",
|
||||
"/pet/{petId}/uploadImage",
|
||||
"/store/inventory",
|
||||
"/store/order",
|
||||
"/store/order/{orderId}",
|
||||
"/user",
|
||||
"/user/createWithArray",
|
||||
"/user/createWithList",
|
||||
"/user/login",
|
||||
"/user/logout",
|
||||
"/user/{username}"
|
||||
]
|
||||
expect(state.getIn(["json", "paths"]).keySeq().toJS()).toEqual(correctOrder)
|
||||
expect(result.getIn(["paths"]).keySeq().toJS()).toEqual(correctOrder)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
+54
-1
@@ -21,7 +21,8 @@ import {
|
||||
createDeepLinkPath,
|
||||
escapeDeepLinkPath,
|
||||
sanitizeUrl,
|
||||
extractFileNameFromContentDispositionHeader
|
||||
extractFileNameFromContentDispositionHeader,
|
||||
deeplyStripKey
|
||||
} from "core/utils"
|
||||
import win from "core/window"
|
||||
|
||||
@@ -942,6 +943,58 @@ describe("utils", function() {
|
||||
})
|
||||
})
|
||||
|
||||
describe("deeplyStripKey", function() {
|
||||
it("should filter out a specified key", function() {
|
||||
const input = {
|
||||
$$ref: "#/this/is/my/ref",
|
||||
a: {
|
||||
$$ref: "#/this/is/my/other/ref",
|
||||
value: 12345
|
||||
}
|
||||
}
|
||||
const result = deeplyStripKey(input, "$$ref")
|
||||
expect(result).toEqual({
|
||||
a: {
|
||||
value: 12345
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
it("should filter out a specified key by predicate", function() {
|
||||
const input = {
|
||||
$$ref: "#/this/is/my/ref",
|
||||
a: {
|
||||
$$ref: "#/keep/this/one",
|
||||
value: 12345
|
||||
}
|
||||
}
|
||||
const result = deeplyStripKey(input, "$$ref", (v) => v !== "#/keep/this/one")
|
||||
expect(result).toEqual({
|
||||
a: {
|
||||
value: 12345,
|
||||
$$ref: "#/keep/this/one"
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
it("should only call the predicate when the key matches", function() {
|
||||
const input = {
|
||||
$$ref: "#/this/is/my/ref",
|
||||
a: {
|
||||
$$ref: "#/this/is/my/other/ref",
|
||||
value: 12345
|
||||
}
|
||||
}
|
||||
let count = 0
|
||||
|
||||
const result = deeplyStripKey(input, "$$ref", () => {
|
||||
count++
|
||||
return true
|
||||
})
|
||||
expect(count).toEqual(2)
|
||||
})
|
||||
})
|
||||
|
||||
describe("parse and serialize search", function() {
|
||||
afterEach(function() {
|
||||
win.location.search = ""
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
describe("bug #4374: OAS3 parameters should be visibly validated in Try-It-Out", function () {
|
||||
let mainPage
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 10000)
|
||||
.pause(1000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/bugs/4374.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
done()
|
||||
})
|
||||
afterEach(function (client, done) {
|
||||
done()
|
||||
})
|
||||
it("indicates an error when a required parameter is not selected", function (client) {
|
||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
||||
.assert.containsText(".opblock-summary-path span", "/pet/findByStatus")
|
||||
.click(".opblock")
|
||||
.waitForElementVisible(".opblock.is-open", 5000)
|
||||
.click(".try-out__btn")
|
||||
.click(".btn.execute")
|
||||
.pause(100)
|
||||
.assert.cssClassPresent(".parameters-col_description select", "invalid")
|
||||
|
||||
client.end()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,29 @@
|
||||
describe("bug #4409: operationId normalization and layout tracking", function () {
|
||||
let mainPage
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/bugs/4409.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
done()
|
||||
})
|
||||
afterEach(function (client, done) {
|
||||
done()
|
||||
})
|
||||
it("expands an operation that has a normalizable operationId", function (client) {
|
||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
||||
.assert.containsText(".opblock-summary-path span", "/myApi")
|
||||
.click(".opblock")
|
||||
.waitForElementVisible(".opblock-body", 5000)
|
||||
.assert.cssClassPresent(".opblock", "is-open")
|
||||
|
||||
client.end()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,58 @@
|
||||
describe("parameter enum rendering", function () {
|
||||
describe("swagger 2.0", () => {
|
||||
beforeEach(function (client, done) {
|
||||
client
|
||||
.url("localhost:3230")
|
||||
.waitForElementVisible(".download-url-input", 10000)
|
||||
.pause(1000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/features/parameter-enum-rendering.swagger.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
done()
|
||||
})
|
||||
afterEach(function (client, done) {
|
||||
done()
|
||||
})
|
||||
it("reveals a string parameter's enums and defaults when viewing that parameter", function (client) {
|
||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
||||
.assert.containsText(".opblock-summary-path span", "/report")
|
||||
.click(".opblock")
|
||||
.waitForElementVisible(".opblock.is-open", 5000)
|
||||
.pause(500)
|
||||
.assert.containsText("div.parameter__enum", "today, yesterday, lastweek")
|
||||
.assert.containsText("div.parameter__default", "today")
|
||||
|
||||
client.end()
|
||||
})
|
||||
})
|
||||
describe("openapi 3.0", () => {
|
||||
beforeEach(function (client, done) {
|
||||
client
|
||||
.url("localhost:3230")
|
||||
.waitForElementVisible(".download-url-input", 10000)
|
||||
.pause(1000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/features/parameter-enum-rendering.openapi.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
done()
|
||||
})
|
||||
afterEach(function (client, done) {
|
||||
done()
|
||||
})
|
||||
it("reveals a string parameter's enums and defaults when viewing that parameter", function (client) {
|
||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
||||
.assert.containsText(".opblock-summary-path span", "/report")
|
||||
.click(".opblock")
|
||||
.waitForElementVisible(".opblock.is-open", 5000)
|
||||
.pause(500)
|
||||
.assert.containsText("div.parameter__enum", "today, yesterday, lastweek")
|
||||
.assert.containsText("div.parameter__default", "today")
|
||||
|
||||
client.end()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -4,12 +4,12 @@ describe("render informationContainer", function () {
|
||||
beforeEach(function (client, done) {
|
||||
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
@@ -29,8 +29,8 @@ describe("render informationContainer", function () {
|
||||
.assert.containsText("@title", "Swagger Petstore")
|
||||
.assert.containsText("@version", "1.0.0")
|
||||
.assert.containsText("@baseUrl", "[ Base URL: localhost:3204/ ]")
|
||||
.assert.attributeEquals("@mainUrl", "href", "http://localhost:3200/test-specs/petstore.json")
|
||||
.assert.containsText("@mainUrlContent", "http://localhost:3200/test-specs/petstore.json")
|
||||
.assert.attributeEquals("@mainUrl", "href", "http://localhost:3230/test-specs/petstore.json")
|
||||
.assert.containsText("@mainUrlContent", "http://localhost:3230/test-specs/petstore.json")
|
||||
.assert.containsText("@description", "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.io or on irc.freenode.net, #swagger. For this sample, you can use the api key special-key to test the authorization filters.")
|
||||
.assert.attributeEquals("@swaggerUrl", "href", "http://swagger.io/")
|
||||
.assert.attributeEquals("@swaggerircUrl", "href", "http://swagger.io/irc/")
|
||||
|
||||
@@ -3,12 +3,12 @@ describe("Render Model Wrapper", function () {
|
||||
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ describe("render pet api container", function () {
|
||||
let apiWrapper
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/callbacks.openapi.yaml")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/callbacks.openapi.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ describe("render pet api container", function () {
|
||||
let apiWrapper
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.openapi.yaml")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.openapi.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ describe("onComplete option", function () {
|
||||
let mainPage
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".opblock-tag-section", 5000)
|
||||
|
||||
@@ -3,13 +3,13 @@ describe("render pet api container", function () {
|
||||
let apiWrapper
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ describe("render store api container", function(){
|
||||
let apiWrapper
|
||||
beforeEach( function(client, done){
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(3000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ describe("render user api container", function(){
|
||||
let apiWrapper
|
||||
beforeEach( function(client, done){
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -4,13 +4,13 @@ describe("Remote $ref rendering", function () {
|
||||
|
||||
mainPage = client
|
||||
// expand the models so we don't have to manually do it
|
||||
.url("localhost:3200?defaultModelsExpandDepth=5")
|
||||
.url("localhost:3230?defaultModelsExpandDepth=5")
|
||||
.page.main()
|
||||
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(2000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/refs/api1.yaml")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/refs/api1.yaml")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ describe("Render scheme", function () {
|
||||
beforeEach(function (client, done) {
|
||||
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
schemeContainer = mainPage.section.schemeContainer
|
||||
@@ -12,7 +12,7 @@ describe("Render scheme", function () {
|
||||
client.waitForElementVisible(".download-url-input", 5000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ describe("initial render", function () {
|
||||
|
||||
beforeEach(function (client, done) {
|
||||
mainPage = client
|
||||
.url("localhost:3200")
|
||||
.url("localhost:3230")
|
||||
.page.main()
|
||||
|
||||
topbar = mainPage.section.topbar
|
||||
@@ -26,7 +26,7 @@ describe("initial render", function () {
|
||||
client.waitForElementVisible(".download-url-input", 10000)
|
||||
.pause(5000)
|
||||
.clearValue(".download-url-input")
|
||||
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
|
||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/petstore.json")
|
||||
.click("button.download-url-button")
|
||||
.pause(1000)
|
||||
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
---
|
||||
openapi: 3.0.0
|
||||
servers:
|
||||
- url: http://localhost:3204/
|
||||
info:
|
||||
description: 'This is a sample server Petstore server. You can find out more about
|
||||
Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For
|
||||
this sample, you can use the api key `special-key` to test the authorization filters.'
|
||||
version: 1.0.0
|
||||
title: Swagger Petstore
|
||||
termsOfService: http://swagger.io/terms/
|
||||
contact:
|
||||
email: apiteam@swagger.io
|
||||
license:
|
||||
name: Apache 2.0
|
||||
url: http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
tags:
|
||||
- name: pet
|
||||
description: Everything about your Pets
|
||||
externalDocs:
|
||||
description: Find out more
|
||||
url: http://swagger.io
|
||||
- name: store
|
||||
description: Access to Petstore orders
|
||||
- name: user
|
||||
description: Operations about user
|
||||
externalDocs:
|
||||
description: Find out more about our store
|
||||
url: http://swagger.io
|
||||
paths:
|
||||
"/pet/findByStatus":
|
||||
get:
|
||||
tags:
|
||||
- pet
|
||||
summary: Finds Pets by status
|
||||
description: Multiple status values can be provided with comma separated strings
|
||||
operationId: findPetsByStatus
|
||||
parameters:
|
||||
- name: status
|
||||
in: query
|
||||
description: Status values that need to be considered for filter
|
||||
required: true
|
||||
explode: true
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
enum:
|
||||
- available
|
||||
- pending
|
||||
- sold
|
||||
default: available
|
||||
responses:
|
||||
'200':
|
||||
description: successful operation
|
||||
content:
|
||||
application/xml:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
"$ref": "#/components/schemas/Pet"
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
"$ref": "#/components/schemas/Pet"
|
||||
'400':
|
||||
description: Invalid status value
|
||||
security:
|
||||
- petstore_auth:
|
||||
- write:pets
|
||||
- read:pets
|
||||
externalDocs:
|
||||
description: Find out more about Swagger
|
||||
url: http://swagger.io
|
||||
components:
|
||||
schemas:
|
||||
Order:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
petId:
|
||||
type: integer
|
||||
format: int64
|
||||
quantity:
|
||||
type: integer
|
||||
format: int32
|
||||
shipDate:
|
||||
type: string
|
||||
format: date-time
|
||||
status:
|
||||
type: string
|
||||
description: Order Status
|
||||
enum:
|
||||
- placed
|
||||
- approved
|
||||
- delivered
|
||||
complete:
|
||||
type: boolean
|
||||
default: false
|
||||
xml:
|
||||
name: Order
|
||||
Category:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
name:
|
||||
type: string
|
||||
xml:
|
||||
name: Category
|
||||
User:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
username:
|
||||
type: string
|
||||
firstName:
|
||||
type: string
|
||||
lastName:
|
||||
type: string
|
||||
email:
|
||||
type: string
|
||||
password:
|
||||
type: string
|
||||
phone:
|
||||
type: string
|
||||
userStatus:
|
||||
type: integer
|
||||
format: int32
|
||||
description: User Status
|
||||
xml:
|
||||
name: User
|
||||
Tag:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
name:
|
||||
type: string
|
||||
xml:
|
||||
name: Tag
|
||||
Pet:
|
||||
type: object
|
||||
required:
|
||||
- name
|
||||
- photoUrls
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
category:
|
||||
"$ref": "#/components/schemas/Category"
|
||||
name:
|
||||
type: string
|
||||
example: doggie
|
||||
photoUrls:
|
||||
type: array
|
||||
xml:
|
||||
name: photoUrl
|
||||
wrapped: true
|
||||
items:
|
||||
type: string
|
||||
tags:
|
||||
type: array
|
||||
xml:
|
||||
name: tag
|
||||
wrapped: true
|
||||
items:
|
||||
"$ref": "#/components/schemas/Tag"
|
||||
status:
|
||||
type: string
|
||||
description: pet status in the store
|
||||
enum:
|
||||
- available
|
||||
- pending
|
||||
- sold
|
||||
xml:
|
||||
name: Pet
|
||||
ApiResponse:
|
||||
type: object
|
||||
properties:
|
||||
code:
|
||||
type: integer
|
||||
format: int32
|
||||
type:
|
||||
type: string
|
||||
message:
|
||||
type: string
|
||||
requestBodies:
|
||||
Pet:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
"$ref": "#/components/schemas/Pet"
|
||||
application/xml:
|
||||
schema:
|
||||
"$ref": "#/components/schemas/Pet"
|
||||
description: Pet object that needs to be added to the store
|
||||
required: true
|
||||
UserArray:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
"$ref": "#/components/schemas/User"
|
||||
description: List of user object
|
||||
required: true
|
||||
securitySchemes:
|
||||
petstore_auth:
|
||||
type: oauth2
|
||||
flows:
|
||||
implicit:
|
||||
authorizationUrl: http://petstore.swagger.io/oauth/dialog
|
||||
scopes:
|
||||
write:pets: modify pets in your account
|
||||
read:pets: read your pets
|
||||
api_key:
|
||||
type: apiKey
|
||||
name: api_key
|
||||
in: header
|
||||
@@ -0,0 +1,24 @@
|
||||
openapi: 3.0.0
|
||||
servers:
|
||||
- url: 'https://__host__/'
|
||||
info:
|
||||
description: Test API
|
||||
version: '1.0'
|
||||
title: Test API
|
||||
contact:
|
||||
name: Sample Person
|
||||
email: Sample.Person@adp.com
|
||||
tags:
|
||||
- name: Test API with Schema
|
||||
description: Test API with Schema
|
||||
paths:
|
||||
/myApi:
|
||||
get:
|
||||
operationId: some guid
|
||||
responses:
|
||||
'200':
|
||||
description: Returns documents
|
||||
description: Returns documents
|
||||
tags:
|
||||
- Test API with Schema
|
||||
summary: Test API with Schema
|
||||
@@ -0,0 +1,21 @@
|
||||
openapi: 3.0.0
|
||||
info:
|
||||
title: test
|
||||
version: 0.0.0
|
||||
paths:
|
||||
/report:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: rel_date
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
default: today
|
||||
enum:
|
||||
- today
|
||||
- yesterday
|
||||
- lastweek
|
||||
responses:
|
||||
'200':
|
||||
description: OK
|
||||
@@ -0,0 +1,20 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: test
|
||||
version: 0.0.0
|
||||
paths:
|
||||
/report:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: rel_date
|
||||
required: true
|
||||
type: string
|
||||
default: today
|
||||
enum:
|
||||
- today
|
||||
- yesterday
|
||||
- lastweek
|
||||
responses:
|
||||
200:
|
||||
description: OK
|
||||
Reference in New Issue
Block a user