提交 87f1a975 编写于 作者: K Kyle 提交者: GitHub

Merge branch 'master' into ft/react-perf-permanent

When reporting an issue, please provide the following details: <!---
- swagger-ui version Thanks for filing an issue 😄 ! Before you submit, please read the following:
- a swagger file reproducing the issue
Search open/closed issues before submitting since someone might have asked the same thing before!
Issues on GitHub are only related to problems of Swagger-UI itself. We'll try to offer support
here for your use case, but we can't offer help with projects that use Swagger-UI indirectly,
like Springfox or swagger-node.
Likewise, we can't accept features or bugs in the Swagger/OpenAPI specifications themselves,
or anything that violates the specifications.
-->
<!--- Provide a general summary of the issue in the title above -->
| Q | A
| ------------------------------- | -------
| Bug or feature request? |
| Which Swagger/OpenAPI version? |
| Which Swagger-UI version? |
| How did you install Swagger-UI? |
| Which broswer & version? |
| Which operating system? |
### Demonstration API definition
<!--- If you're describing a bug, please provide an API definition that reproduces your problem -->
<!--- If you have link to a demo repo please link that! -->
<!--- If your spec is large, please put it into a Gist (https://gist.github.com) instead of pasting it here. -->
```yaml
your: "API definition goes here"
```
### Configuration (browser query string, constructor, config.yaml)
<!--- If describing a bug, tell us what your configuration looks like -->
```js
{
"your": { "constructorConfig": "here" }
}
```
`?yourQueryStringConfig=here`
### Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
### Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
### Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
### Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
...@@ -6,3 +6,5 @@ npm-debug.log* ...@@ -6,3 +6,5 @@ npm-debug.log*
.eslintcache .eslintcache
package-lock.json package-lock.json
*.iml *.iml
selenium-debug.log
test/e2e/db.json
## Contributing to Swagger-UI
We love contributions from our community of users! This document explains our guidelines and workflows. Please take care to follow them, as it helps us keep things moving smoothly.
#### Environment setup
0. Install Node.js (4 or newer) and npm (3 or newer).
1. Make a fork of Swagger-UI on GitHub, then clone your fork to your machine.
2. Run `npm install` in your Swagger-UI directory.
3. Run `npm run dev`. `localhost:3200` should open automatically.
4. You're ready to go!
#### Branching model
Feature branches should be prefixed with `ft/`.
Bugfix branches should be prefixed with `bug/`.
Version branches should be prefixed with `v/`.
After the forward slash, include a short description of what you're fixing. For example: `bug/fix-everything-that-was-broken`. For versions, add the version that will be released via the branch, for example: `v/1.2.3`.
If there's an issue filed that you're addressing in your branch, include the issue number directly after the forward slash. For example: `bug/1234-fix-all-the-other-things`.
#### Filing issues
- **Do** include the Swagger-UI build you're using - you can find this by opening your console and checking `window.versions.swaggerUi`
- **Do** include a spec that demonstrates the issue you're experiencing.
- **Do** include screenshots, if needed. GIFs are even better!
- **Do** place code inside of a pre-formatted container by surrounding the code with triple backticks.
- **Don't** open tickets discussing issues with the Swagger/OpenAPI specification itself, or for issues with projects that use Swagger-UI.
- **Don't** open an issue without searching the issue tracker for duplicates first.
#### Committing
- Break your commits into logical atomic units. Well-segmented commits make it _much_ easier for others to step through your changes.
- Limit your subject (first) line to 50 characters (GitHub truncates more than 70).
- Provide a body if you'd like to explain your commit in detail.
- Capitalize the beginning of your subject line, and do not end the subject line with a period.
- Your subject line should complete this sentence: `If applied, this commit will [your subject line].`
- Don't use [magic GitHub words](https://help.github.com/articles/closing-issues-using-keywords/) in your commits to close issues - do that in the pull request for your code instead.
_Adapted from [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/#seven-rules)._
#### Making pull requests
- **Do** summarize your changes in the PR body. If in doubt, write a bullet-point list titled `This PR does the following:`.
- **Do** include references to issues that your PR solves, and use [magic GitHub words](https://help.github.com/articles/closing-issues-using-keywords/) to close those issues automatically when your PR is merged.
- **Do** include tests that cover new or changed functionality.
- **Do** be careful to follow our ESLint style rules. We recommend installing an ESLint plugin if you use a graphical code editor.
- **Do** make sure that tests and the linter are passing by running `npm test` locally, otherwise we can't merge your pull request.
- **Don't** include any changes to files in the `dist/` directory - we update those files only during releases.
- **Don't** mention maintainers in your original PR body - we probably would've seen it anyway, so it just increases the noise in our inboxes. Do feel free to ping maintainers if a week has passed and you've heard nothing from us.
- **Don't** open PRs for custom functionality that only serves a small subset of our users - custom functionality should be implemented outside of our codebase, via a plugin.
...@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 5 revisions since initial creation in 20 ...@@ -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 Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes
------------------ | ------------ | -------------------------- | ----- ------------------ | ------------ | -------------------------- | -----
3.1.2 | 2017-07-31 | 2.0, 3.0 | [tag v3.1.2](https://github.com/swagger-api/swagger-ui/tree/v3.1.2) 3.1.4 | 2017-08-05 | 2.0, 3.0 | [tag v3.1.4](https://github.com/swagger-api/swagger-ui/tree/v3.1.4)
3.0.21 | 2017-07-26 | 2.0 | [tag v3.0.21](https://github.com/swagger-api/swagger-ui/tree/v3.0.21) 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.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) 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)
...@@ -59,6 +59,15 @@ If you'd like to make modifications to the codebase, run the dev server with: `n ...@@ -59,6 +59,15 @@ If you'd like to make modifications to the codebase, run the dev server with: `n
If you'd like to rebuild the `/dist` folder with your codebase changes, run `npm run build`. If you'd like to rebuild the `/dist` folder with your codebase changes, run `npm run build`.
##### Integration Tests
You will need JDK of version 7 or higher as instructed here
http://nightwatchjs.org/gettingstarted#selenium-server-setup
Integration tests can be run locally with `npm run e2e` - be sure you aren't running a dev server when testing!
##### Browser support ##### Browser support
Swagger UI works in the latest versions of Chrome, Safari, Firefox, Edge and IE11. Swagger UI works in the latest versions of Chrome, Safari, Firefox, Edge and IE11.
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
{ {
box-sizing: inherit; box-sizing: inherit;
} }
body { body {
margin:0; margin:0;
background: #fafafa; background: #fafafa;
......
此差异已折叠。
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;AAoyKA;;;;;;AAy+EA;;;;;;;;;;;;;;;;;;;;;;;;;;AAw1TA;;;;;;;;;;;;;;AAs8JA;;;;;;;;;AAy6oBA;;;;;AAqqQA;AAm4DA;;;;;;AAo4YA;;;;;;AA8jaA;AAumvBA","sourceRoot":""} {"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;AAoyKA;;;;;;AAy+EA;;;;;;;;;;;;;;;;;;;;;;;;;;AAw1TA;;;;;;;;;;;;;;AAs8JA;;;;;;;;;AAw6oBA;;;;;AAirQA;AAm4DA;;;;;;AAo4YA;;;;;;AA8jaA;AAumvBA","sourceRoot":""}
\ No newline at end of file \ No newline at end of file
此差异已折叠。
此差异已折叠。
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAyvcA","sourceRoot":""} {"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAowcA","sourceRoot":""}
\ No newline at end of file \ No newline at end of file
var path = require("path") var path = require("path")
var webpack = require("webpack") var webpack = require('webpack')
var ExtractTextPlugin = require("extract-text-webpack-plugin") var ExtractTextPlugin = require('extract-text-webpack-plugin')
var deepExtend = require("deep-extend") const CopyWebpackPlugin = require('copy-webpack-plugin')
const {gitDescribeSync} = require("git-describe") var deepExtend = require('deep-extend')
const {gitDescribeSync} = require('git-describe')
const os = require("os") const os = require("os")
var pkg = require("./package.json") var pkg = require("./package.json")
...@@ -60,7 +61,8 @@ module.exports = function(rules, options) { ...@@ -60,7 +61,8 @@ module.exports = function(rules, options) {
})) }))
} }
if( specialOptions.minimize ) { if( specialOptions.minimize ) { // production mode
plugins.push( plugins.push(
new webpack.optimize.UglifyJsPlugin({ new webpack.optimize.UglifyJsPlugin({
sourceMap: true, sourceMap: true,
...@@ -74,6 +76,8 @@ module.exports = function(rules, options) { ...@@ -74,6 +76,8 @@ module.exports = function(rules, options) {
plugins.push( new webpack.NoEmitOnErrorsPlugin()) plugins.push( new webpack.NoEmitOnErrorsPlugin())
} else { // development mode
plugins.push(new CopyWebpackPlugin([ { from: 'test/e2e/specs', to: 'test-specs' } ]))
} }
plugins.push( plugins.push(
......
{ {
"name": "swagger-ui", "name": "swagger-ui",
"version": "3.1.2", "version": "3.1.4",
"main": "dist/swagger-ui.js", "main": "dist/swagger-ui.js",
"repository": "git@github.com:swagger-api/swagger-ui.git", "repository": "git@github.com:swagger-api/swagger-ui.git",
"contributors": [ "contributors": [
...@@ -32,7 +32,11 @@ ...@@ -32,7 +32,11 @@
"test": "npm run lint-errors && npm run just-test-in-node", "test": "npm run lint-errors && npm run just-test-in-node",
"test-in-node": "npm run lint-errors && npm run just-test-in-node", "test-in-node": "npm run lint-errors && npm run just-test-in-node",
"just-test": "karma start --config karma.conf.js", "just-test": "karma start --config karma.conf.js",
"just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core test/components test/bugs test/swagger-ui-dist-package" "just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core test/components test/bugs test/swagger-ui-dist-package",
"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",
"e2e": "npm-run-all --parallel -r hot-server mock-api test-e2e"
}, },
"dependencies": { "dependencies": {
"base64-js": "^1.2.0", "base64-js": "^1.2.0",
...@@ -90,6 +94,8 @@ ...@@ -90,6 +94,8 @@
"babel-preset-react": "^6.23.0", "babel-preset-react": "^6.23.0",
"babel-preset-stage-0": "^6.22.0", "babel-preset-stage-0": "^6.22.0",
"babel-runtime": "^6.23.0", "babel-runtime": "^6.23.0",
"chromedriver": "^2.30.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "0.28.4", "css-loader": "0.28.4",
"deep-extend": "^0.5.0", "deep-extend": "^0.5.0",
"deepmerge": "^1.3.2", "deepmerge": "^1.3.2",
...@@ -100,9 +106,9 @@ ...@@ -100,9 +106,9 @@
"extract-text-webpack-plugin": "^2.1.2", "extract-text-webpack-plugin": "^2.1.2",
"file-loader": "0.11.2", "file-loader": "0.11.2",
"git-describe": "^4.0.1", "git-describe": "^4.0.1",
"html-webpack-plugin": "^2.28.0",
"imports-loader": "0.7.1", "imports-loader": "0.7.1",
"json-loader": "0.5.4", "json-loader": "0.5.4",
"json-server": "^0.11.0",
"karma": "^1.7.0", "karma": "^1.7.0",
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "^2.2.0",
"karma-mocha": "^1.3.0", "karma-mocha": "^1.3.0",
...@@ -111,6 +117,7 @@ ...@@ -111,6 +117,7 @@
"less": "2.7.2", "less": "2.7.2",
"license-checker": "^11.0.0", "license-checker": "^11.0.0",
"mocha": "^3.4.2", "mocha": "^3.4.2",
"nightwatch": "^0.9.16",
"node-sass": "^4.5.0", "node-sass": "^4.5.0",
"npm-run-all": "4.0.2", "npm-run-all": "4.0.2",
"null-loader": "0.1.1", "null-loader": "0.1.1",
...@@ -121,6 +128,7 @@ ...@@ -121,6 +128,7 @@
"react-test-renderer": "^15.5.4", "react-test-renderer": "^15.5.4",
"rimraf": "^2.6.0", "rimraf": "^2.6.0",
"sass-loader": "^6.0.2", "sass-loader": "^6.0.2",
"selenium-server-standalone-jar": "3.4.0",
"standard": "^10.0.2", "standard": "^10.0.2",
"standard-loader": "^6.0.1", "standard-loader": "^6.0.1",
"style-loader": "0.18.2", "style-loader": "0.18.2",
......
...@@ -15,7 +15,7 @@ export default class ArrayModel extends Component { ...@@ -15,7 +15,7 @@ export default class ArrayModel extends Component {
} }
render(){ render(){
let { getComponent, required, schema, depth, expandDepth, name } = this.props let { getComponent, schema, depth, expandDepth, name } = this.props
let items = schema.get("items") let items = schema.get("items")
let title = schema.get("title") || name let title = schema.get("title") || name
let properties = schema.filter( ( v, key) => ["type", "items", "$$ref"].indexOf(key) === -1 ) let properties = schema.filter( ( v, key) => ["type", "items", "$$ref"].indexOf(key) === -1 )
...@@ -31,7 +31,7 @@ export default class ArrayModel extends Component { ...@@ -31,7 +31,7 @@ export default class ArrayModel extends Component {
return <span className="model"> return <span className="model">
<ModelCollapse title={titleEl} collapsed={ depth > expandDepth } collapsedContent="[...]"> <ModelCollapse title={titleEl} collapsed={ depth > expandDepth } collapsedContent="[...]">
[ [
<span><Model { ...this.props } schema={ items } required={ false }/></span> <span><Model { ...this.props } schema={ items } required={ false } depth={ depth + 1 } /></span>
] ]
{ {
properties.size ? <span> properties.size ? <span>
...@@ -41,7 +41,6 @@ export default class ArrayModel extends Component { ...@@ -41,7 +41,6 @@ export default class ArrayModel extends Component {
: null : null
} }
</ModelCollapse> </ModelCollapse>
{ required && <span style={{ color: "red" }}>*</span>}
</span> </span>
} }
} }
...@@ -23,7 +23,7 @@ export default class AuthorizationPopup extends React.Component { ...@@ -23,7 +23,7 @@ export default class AuthorizationPopup extends React.Component {
<h3>Available authorizations</h3> <h3>Available authorizations</h3>
<button type="button" className="close-modal" onClick={ this.close }> <button type="button" className="close-modal" onClick={ this.close }>
<svg width="20" height="20"> <svg width="20" height="20">
<use xlinkHref="#close" /> <use href="#close" xlinkHref="#close" />
</svg> </svg>
</button> </button>
</div> </div>
......
...@@ -25,7 +25,7 @@ export default class AuthorizeBtn extends React.Component { ...@@ -25,7 +25,7 @@ export default class AuthorizeBtn extends React.Component {
<button className={isAuthorized ? "btn authorize locked" : "btn authorize unlocked"} onClick={ this.onClick }> <button className={isAuthorized ? "btn authorize locked" : "btn authorize unlocked"} onClick={ this.onClick }>
<span>Authorize</span> <span>Authorize</span>
<svg width="20" height="20"> <svg width="20" height="20">
<use xlinkHref={ isAuthorized ? "#locked" : "#unlocked" } /> <use href={ isAuthorized ? "#locked" : "#unlocked" } xlinkHref={ isAuthorized ? "#locked" : "#unlocked" } />
</svg> </svg>
</button> </button>
{ showPopup && <AuthorizationPopup /> } { showPopup && <AuthorizationPopup /> }
......
...@@ -24,7 +24,7 @@ export default class AuthorizeOperationBtn extends React.Component { ...@@ -24,7 +24,7 @@ export default class AuthorizeOperationBtn extends React.Component {
return ( return (
<button className={isAuthorized ? "authorization__btn locked" : "authorization__btn unlocked"} onClick={ this.onClick }> <button className={isAuthorized ? "authorization__btn locked" : "authorization__btn unlocked"} onClick={ this.onClick }>
<svg width="20" height="20"> <svg width="20" height="20">
<use xlinkHref={ isAuthorized ? "#locked" : "#unlocked" } /> <use href={ isAuthorized ? "#locked" : "#unlocked" } xlinkHref={ isAuthorized ? "#locked" : "#unlocked" } />
</svg> </svg>
</button> </button>
......
...@@ -69,7 +69,10 @@ export default class BaseLayout extends React.Component { ...@@ -69,7 +69,10 @@ export default class BaseLayout extends React.Component {
<div className="scheme-container"> <div className="scheme-container">
<Col className="schemes wrapper" mobile={12}> <Col className="schemes wrapper" mobile={12}>
{ schemes && schemes.size ? ( { schemes && schemes.size ? (
<Schemes schemes={ schemes } specActions={ specActions } /> <Schemes
currentScheme={specSelectors.operationScheme()}
schemes={ schemes }
specActions={ specActions } />
) : null } ) : null }
{ securityDefinitions ? ( { securityDefinitions ? (
......
...@@ -55,14 +55,14 @@ export default class Model extends Component { ...@@ -55,14 +55,14 @@ export default class Model extends Component {
return <ObjectModel return <ObjectModel
className="object" { ...this.props } className="object" { ...this.props }
schema={ modelSchema } schema={ modelSchema }
name={ name || modelName } name={ modelName || name }
deprecated={deprecated} deprecated={deprecated}
isRef={ isRef!== undefined ? isRef : !!$$ref } /> isRef={ isRef!== undefined ? isRef : !!$$ref } />
case "array": case "array":
return <ArrayModel return <ArrayModel
className="array" { ...this.props } className="array" { ...this.props }
schema={ modelSchema } schema={ modelSchema }
name={ name || modelName } name={ modelName || name }
deprecated={deprecated} deprecated={deprecated}
required={ required } /> required={ required } />
case "string": case "string":
...@@ -74,7 +74,7 @@ export default class Model extends Component { ...@@ -74,7 +74,7 @@ export default class Model extends Component {
{ ...this.props } { ...this.props }
getComponent={ getComponent } getComponent={ getComponent }
schema={ modelSchema } schema={ modelSchema }
name={ name || modelName } name={ modelName || name }
deprecated={deprecated} deprecated={deprecated}
required={ required }/> } required={ required }/> }
} }
......
...@@ -24,7 +24,7 @@ export default class Models extends Component { ...@@ -24,7 +24,7 @@ export default class Models extends Component {
return <section className={ showModels ? "models is-open" : "models"}> return <section className={ showModels ? "models is-open" : "models"}>
<h4 onClick={() => layoutActions.show("models", !showModels)}> <h4 onClick={() => layoutActions.show("models", !showModels)}>
<span>Models</span> <span>Models</span>
<svg className="arrow" width="20" height="20"> <svg width="20" height="20">
<use xlinkHref={showModels ? "#large-arrow-down" : "#large-arrow"} /> <use xlinkHref={showModels ? "#large-arrow-down" : "#large-arrow"} />
</svg> </svg>
</h4> </h4>
......
...@@ -17,9 +17,10 @@ export default class ObjectModel extends Component { ...@@ -17,9 +17,10 @@ export default class ObjectModel extends Component {
} }
render(){ render(){
let { schema, name, isRef, getComponent, depth, ...props } = this.props let { schema, name, isRef, getComponent, depth, expandDepth, ...otherProps } = this.props
let { expandDepth, specSelectors } = this.props let { specSelectors } = otherProps
let { isOAS3 } = specSelectors let { isOAS3 } = specSelectors
let description = schema.get("description") let description = schema.get("description")
let properties = schema.get("properties") let properties = schema.get("properties")
let additionalProperties = schema.get("additionalProperties") let additionalProperties = schema.get("additionalProperties")
...@@ -59,7 +60,7 @@ export default class ObjectModel extends Component { ...@@ -59,7 +60,7 @@ export default class ObjectModel extends Component {
} }
<span className="inner-object"> <span className="inner-object">
{ {
<table className="model" style={{ marginLeft: "2em" }}><tbody> <table className="model"><tbody>
{ {
!description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}> !description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}>
<td>description:</td> <td>description:</td>
...@@ -82,7 +83,7 @@ export default class ObjectModel extends Component { ...@@ -82,7 +83,7 @@ export default class ObjectModel extends Component {
{ key }{ isRequired && <span style={{ color: "red" }}>*</span> } { key }{ isRequired && <span style={{ color: "red" }}>*</span> }
</td> </td>
<td style={{ verticalAlign: "top" }}> <td style={{ verticalAlign: "top" }}>
<Model key={ `object-${name}-${key}_${value}` } { ...props } <Model key={ `object-${name}-${key}_${value}` } { ...otherProps }
required={ isRequired } required={ isRequired }
getComponent={ getComponent } getComponent={ getComponent }
schema={ value } schema={ value }
...@@ -96,7 +97,7 @@ export default class ObjectModel extends Component { ...@@ -96,7 +97,7 @@ export default class ObjectModel extends Component {
: <tr> : <tr>
<td>{ "< * >:" }</td> <td>{ "< * >:" }</td>
<td> <td>
<Model { ...props } required={ false } <Model { ...otherProps } required={ false }
getComponent={ getComponent } getComponent={ getComponent }
schema={ additionalProperties } schema={ additionalProperties }
depth={ depth + 1 } /> depth={ depth + 1 } />
...@@ -109,7 +110,7 @@ export default class ObjectModel extends Component { ...@@ -109,7 +110,7 @@ export default class ObjectModel extends Component {
<td>{ "anyOf ->" }</td> <td>{ "anyOf ->" }</td>
<td> <td>
{anyOf.map((schema, k) => { {anyOf.map((schema, k) => {
return <div key={k}><Model { ...props } required={ false } return <div key={k}><Model { ...otherProps } required={ false }
getComponent={ getComponent } getComponent={ getComponent }
schema={ schema } schema={ schema }
depth={ depth + 1 } /></div> depth={ depth + 1 } /></div>
...@@ -123,7 +124,7 @@ export default class ObjectModel extends Component { ...@@ -123,7 +124,7 @@ export default class ObjectModel extends Component {
<td>{ "oneOf ->" }</td> <td>{ "oneOf ->" }</td>
<td> <td>
{oneOf.map((schema, k) => { {oneOf.map((schema, k) => {
return <div key={k}><Model { ...props } required={ false } return <div key={k}><Model { ...otherProps } required={ false }
getComponent={ getComponent } getComponent={ getComponent }
schema={ schema } schema={ schema }
depth={ depth + 1 } /></div> depth={ depth + 1 } /></div>
...@@ -137,7 +138,7 @@ export default class ObjectModel extends Component { ...@@ -137,7 +138,7 @@ export default class ObjectModel extends Component {
<td>{ "not ->" }</td> <td>{ "not ->" }</td>
<td> <td>
{not.map((schema, k) => { {not.map((schema, k) => {
return <div key={k}><Model { ...props } required={ false } return <div key={k}><Model { ...otherProps } required={ false }
getComponent={ getComponent } getComponent={ getComponent }
schema={ schema } schema={ schema }
depth={ depth + 1 } /></div> depth={ depth + 1 } /></div>
......
...@@ -186,7 +186,7 @@ export default class Operation extends PureComponent { ...@@ -186,7 +186,7 @@ export default class Operation extends PureComponent {
} }
</div> </div>
<Collapse isOpened={shown} animated> <Collapse isOpened={shown}>
<div className="opblock-body"> <div className="opblock-body">
{ deprecated && <h4 className="opblock-title_normal"> Warning: Deprecated</h4>} { deprecated && <h4 className="opblock-title_normal"> Warning: Deprecated</h4>}
{ description && { description &&
...@@ -229,7 +229,7 @@ export default class Operation extends PureComponent { ...@@ -229,7 +229,7 @@ export default class Operation extends PureComponent {
path={ path } path={ path }
method={ method } method={ method }
specActions={ specActions } specActions={ specActions }
operationScheme={ operationScheme } /> currentScheme={ operationScheme } />
</div> : null </div> : null
} }
......
...@@ -109,7 +109,7 @@ export default class Operations extends React.Component { ...@@ -109,7 +109,7 @@ export default class Operations extends React.Component {
<button className="expand-operation" title="Expand operation" onClick={() => layoutActions.show(isShownKey, !showTag)}> <button className="expand-operation" title="Expand operation" onClick={() => layoutActions.show(isShownKey, !showTag)}>
<svg className="arrow" width="20" height="20"> <svg className="arrow" width="20" height="20">
<use xlinkHref={showTag ? "#large-arrow-down" : "#large-arrow"} /> <use href={showTag ? "#large-arrow-down" : "#large-arrow"} xlinkHref={showTag ? "#large-arrow-down" : "#large-arrow"} />
</svg> </svg>
</button> </button>
</h4> </h4>
......
...@@ -69,7 +69,9 @@ export default class ParamBody extends PureComponent { ...@@ -69,7 +69,9 @@ export default class ParamBody extends PureComponent {
let { param, fn:{inferSchema} } = this.props let { param, fn:{inferSchema} } = this.props
let schema = inferSchema(param.toJS()) let schema = inferSchema(param.toJS())
return getSampleSchema(schema, xml) return getSampleSchema(schema, xml, {
includeWriteOnly: true
})
} }
onChange = (value, { isEditBox, isXml }) => { onChange = (value, { isEditBox, isXml }) => {
......
...@@ -58,6 +58,8 @@ export default class ParameterRow extends Component { ...@@ -58,6 +58,8 @@ export default class ParameterRow extends Component {
render() { render() {
let {param, onChange, getComponent, isExecute, fn, onChangeConsumes, specSelectors, pathMethod} = this.props let {param, onChange, getComponent, isExecute, fn, onChangeConsumes, specSelectors, pathMethod} = this.props
let { isOAS3 } = specSelectors
// const onChangeWrapper = (value) => onChange(param, value) // const onChangeWrapper = (value) => onChange(param, value)
const JsonSchemaForm = getComponent("JsonSchemaForm") const JsonSchemaForm = getComponent("JsonSchemaForm")
const ParamBody = getComponent("ParamBody") const ParamBody = getComponent("ParamBody")
...@@ -80,10 +82,11 @@ export default class ParameterRow extends Component { ...@@ -80,10 +82,11 @@ export default class ParameterRow extends Component {
let schema = param.get("schema") let schema = param.get("schema")
let type = isOAS3 && isOAS3() ? param.getIn(["schema", "type"]) : param.get("type")
let isFormData = inType === "formData" let isFormData = inType === "formData"
let isFormDataSupported = "FormData" in win let isFormDataSupported = "FormData" in win
let required = param.get("required") let required = param.get("required")
let itemType = param.getIn(["items", "type"]) let itemType = param.getIn(isOAS3 && isOAS3() ? ["schema", "items", "type"] : ["items", "type"])
let parameter = specSelectors.getParameter(pathMethod, param.get("name")) let parameter = specSelectors.getParameter(pathMethod, param.get("name"))
let value = parameter ? parameter.get("value") : "" let value = parameter ? parameter.get("value") : ""
...@@ -94,7 +97,10 @@ export default class ParameterRow extends Component { ...@@ -94,7 +97,10 @@ export default class ParameterRow extends Component {
{ param.get("name") } { param.get("name") }
{ !required ? null : <span style={{color: "red"}}>&nbsp;*</span> } { !required ? null : <span style={{color: "red"}}>&nbsp;*</span> }
</div> </div>
<div className="parameter__type">{ param.get("type") } { itemType && `[${itemType}]` }</div> <div className="parameter__type">{ type } { itemType && `[${itemType}]` }</div>
<div className="parameter__deprecated">
{ isOAS3 && isOAS3() && param.get("deprecated") ? "deprecated": null }
</div>
<div className="parameter__in">({ param.get("in") })</div> <div className="parameter__in">({ param.get("in") })</div>
</td> </td>
......
...@@ -7,11 +7,12 @@ export default class Primitive extends Component { ...@@ -7,11 +7,12 @@ export default class Primitive extends Component {
static propTypes = { static propTypes = {
schema: PropTypes.object.isRequired, schema: PropTypes.object.isRequired,
getComponent: PropTypes.func.isRequired, getComponent: PropTypes.func.isRequired,
required: PropTypes.bool name: PropTypes.string,
depth: PropTypes.number
} }
render(){ render(){
let { schema, getComponent, required } = this.props let { schema, getComponent, name, depth } = this.props
if(!schema || !schema.get) { if(!schema || !schema.get) {
// don't render if schema isn't correctly formed // don't render if schema isn't correctly formed
...@@ -24,12 +25,13 @@ export default class Primitive extends Component { ...@@ -24,12 +25,13 @@ export default class Primitive extends Component {
let enumArray = schema.get("enum") let enumArray = schema.get("enum")
let description = schema.get("description") let description = schema.get("description")
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "description", "$$ref"].indexOf(key) === -1 ) let properties = schema.filter( ( v, key) => ["enum", "type", "format", "description", "$$ref"].indexOf(key) === -1 )
let style = required ? { fontWeight: "bold" } : {}
const Markdown = getComponent("Markdown") const Markdown = getComponent("Markdown")
const EnumModel = getComponent("EnumModel") const EnumModel = getComponent("EnumModel")
return <span className="prop"> return <span className="model">
<span className="prop-type" style={ style }>{ type }</span> { required && <span style={{ color: "red" }}>*</span>} <span className="prop">
{ name && <span className={`${depth === 1 && "model-title"} prop-name`}>{ name }</span> }
<span className="prop-type">{ type }</span>
{ format && <span className="prop-format">(${format})</span>} { format && <span className="prop-format">(${format})</span>}
{ {
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }> properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }>
...@@ -51,5 +53,6 @@ export default class Primitive extends Component { ...@@ -51,5 +53,6 @@ export default class Primitive extends Component {
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } /> enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
} }
</span> </span>
</span>
} }
} }
\ No newline at end of file
...@@ -83,11 +83,16 @@ export default class Response extends React.Component { ...@@ -83,11 +83,16 @@ export default class Response extends React.Component {
if(isOAS3()) { if(isOAS3()) {
let oas3SchemaForContentType = response.getIn(["content", this.state.responseContentType, "schema"]) let oas3SchemaForContentType = response.getIn(["content", this.state.responseContentType, "schema"])
sampleResponse = oas3SchemaForContentType ? getSampleSchema(oas3SchemaForContentType.toJS(), this.state.responseContentType, { includeReadOnly: true }) : null sampleResponse = oas3SchemaForContentType ? getSampleSchema(oas3SchemaForContentType.toJS(), this.state.responseContentType, {
includeReadOnly: true
}) : null
schema = oas3SchemaForContentType ? inferSchema(oas3SchemaForContentType.toJS()) : null schema = oas3SchemaForContentType ? inferSchema(oas3SchemaForContentType.toJS()) : null
} else { } else {
schema = inferSchema(response.toJS()) schema = inferSchema(response.toJS())
sampleResponse = schema ? getSampleSchema(schema, contentType, { includeReadOnly: true }) : null sampleResponse = schema ? getSampleSchema(schema, contentType, {
includeReadOnly: true,
includeWriteOnly: true // writeOnly has no filtering effect in swagger 2.0
}) : null
} }
let example = getExampleComponent( sampleResponse, examples, HighlightCode ) let example = getExampleComponent( sampleResponse, examples, HighlightCode )
...@@ -122,10 +127,10 @@ export default class Response extends React.Component { ...@@ -122,10 +127,10 @@ export default class Response extends React.Component {
</td> </td>
{specSelectors.isOAS3() ? <td> {specSelectors.isOAS3() ? <td className="col response-col_links">
{ links ? { links ?
links.toSeq().map((link, key) => { links.toSeq().map((link, key) => {
return <OperationLink key={key} name={key} link={ link }/> return <OperationLink key={key} name={key} link={ link } getComponent={getComponent}/>
}) })
: <i>No links</i>} : <i>No links</i>}
</td> : null} </td> : null}
......
...@@ -68,7 +68,7 @@ export default class Responses extends React.Component { ...@@ -68,7 +68,7 @@ export default class Responses extends React.Component {
<tr className="responses-header"> <tr className="responses-header">
<td className="col col_header response-col_status">Code</td> <td className="col col_header response-col_status">Code</td>
<td className="col col_header response-col_description">Description</td> <td className="col col_header response-col_description">Description</td>
{ specSelectors.isOAS3() ? <td className="col col_header response-col_description">Links</td> : null } { specSelectors.isOAS3() ? <td className="col col_header response-col_links">Links</td> : null }
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
......
...@@ -6,9 +6,9 @@ export default class Schemes extends React.Component { ...@@ -6,9 +6,9 @@ export default class Schemes extends React.Component {
static propTypes = { static propTypes = {
specActions: PropTypes.object.isRequired, specActions: PropTypes.object.isRequired,
schemes: PropTypes.object.isRequired, schemes: PropTypes.object.isRequired,
currentScheme: PropTypes.string.isRequired,
path: PropTypes.string, path: PropTypes.string,
method: PropTypes.string, method: PropTypes.string,
operationScheme: PropTypes.string
} }
componentWillMount() { componentWillMount() {
...@@ -19,8 +19,8 @@ export default class Schemes extends React.Component { ...@@ -19,8 +19,8 @@ export default class Schemes extends React.Component {
} }
componentWillReceiveProps(nextProps) { componentWillReceiveProps(nextProps) {
if ( !this.props.operationScheme || !nextProps.schemes.has(this.props.operationScheme) ) { if ( !this.props.currentScheme || !nextProps.schemes.includes(this.props.currentScheme) ) {
// if we don't have a selected operationScheme or if our selected scheme is no longer an option, // if we don't have a selected currentScheme or if our selected scheme is no longer an option,
// then fire 'change' event and select the first scheme in the list of options // then fire 'change' event and select the first scheme in the list of options
this.setScheme(nextProps.schemes.first()) this.setScheme(nextProps.schemes.first())
} }
......
...@@ -20,7 +20,7 @@ export default function curl( request ){ ...@@ -20,7 +20,7 @@ export default function curl( request ){
if ( request.get("body") ){ if ( request.get("body") ){
if(type === "multipart/form-data" && request.get("method") === "POST") { if(type === "multipart/form-data" && request.get("method") === "POST") {
for( let [ k,v ] of request.get("body").values()) { for( let [ k,v ] of request.get("body").entrySeq()) {
curlified.push( "-F" ) curlified.push( "-F" )
if (v instanceof win.File) { if (v instanceof win.File) {
curlified.push( `"${k}=@${v.name};type=${v.type}"` ) curlified.push( `"${k}=@${v.name};type=${v.type}"` )
......
...@@ -4,19 +4,24 @@ import ImPropTypes from "react-immutable-proptypes" ...@@ -4,19 +4,24 @@ import ImPropTypes from "react-immutable-proptypes"
class OperationLink extends Component { class OperationLink extends Component {
render() { render() {
const { link, name } = this.props const { link, name, getComponent } = this.props
const Markdown = getComponent("Markdown")
let targetOp = link.get("operationId") || link.get("operationRef") let targetOp = link.get("operationId") || link.get("operationRef")
let parameters = link.get("parameters") && link.get("parameters").toJS() let parameters = link.get("parameters") && link.get("parameters").toJS()
let description = link.get("description") let description = link.get("description")
return <span> return <div style={{ marginBottom: "1.5em" }}>
<div style={{ padding: "5px 2px" }}>{name}{description ? `: ${description}` : ""}</div> <div style={{ marginBottom: ".5em" }}>
<b><code>{name}</code></b>
{ description ? <Markdown source={description}></Markdown> : null }
</div>
<pre> <pre>
Operation `{targetOp}`<br /><br /> Operation `{targetOp}`<br /><br />
Parameters {padString(0, JSON.stringify(parameters, null, 2)) || "{}"}<br /> Parameters {padString(0, JSON.stringify(parameters, null, 2)) || "{}"}<br />
</pre> </pre>
</span> </div>
} }
} }
...@@ -30,6 +35,7 @@ function padString(n, string) { ...@@ -30,6 +35,7 @@ function padString(n, string) {
} }
OperationLink.propTypes = { OperationLink.propTypes = {
getComponent: PropTypes.func.isRequired,
link: ImPropTypes.orderedMap.isRequired, link: ImPropTypes.orderedMap.isRequired,
name: PropTypes.String name: PropTypes.String
} }
......
...@@ -16,7 +16,9 @@ const RequestBody = ({ requestBody, getComponent, specSelectors, contentType }) ...@@ -16,7 +16,9 @@ const RequestBody = ({ requestBody, getComponent, specSelectors, contentType })
const mediaTypeValue = requestBodyContent.get(contentType) const mediaTypeValue = requestBodyContent.get(contentType)
const sampleSchema = getSampleSchema(mediaTypeValue.get("schema").toJS(), contentType) const sampleSchema = getSampleSchema(mediaTypeValue.get("schema").toJS(), contentType, {
includeWriteOnly: true
})
return <div> return <div>
{ requestBodyDescription && { requestBodyDescription &&
......
...@@ -3,7 +3,6 @@ import PropTypes from "prop-types" ...@@ -3,7 +3,6 @@ import PropTypes from "prop-types"
import { OAS3ComponentWrapFactory } from "../helpers" import { OAS3ComponentWrapFactory } from "../helpers"
import { Model } from "core/components/model" import { Model } from "core/components/model"
class ModelComponent extends Component { class ModelComponent extends Component {
static propTypes = { static propTypes = {
schema: PropTypes.object.isRequired, schema: PropTypes.object.isRequired,
......
...@@ -27,7 +27,7 @@ const primitive = (schema) => { ...@@ -27,7 +27,7 @@ const primitive = (schema) => {
export const sampleFromSchema = (schema, config={}) => { export const sampleFromSchema = (schema, config={}) => {
let { type, example, properties, additionalProperties, items } = objectify(schema) let { type, example, properties, additionalProperties, items } = objectify(schema)
let { includeReadOnly } = config let { includeReadOnly, includeWriteOnly } = config
if(example !== undefined) if(example !== undefined)
return example return example
...@@ -46,16 +46,20 @@ export const sampleFromSchema = (schema, config={}) => { ...@@ -46,16 +46,20 @@ export const sampleFromSchema = (schema, config={}) => {
let props = objectify(properties) let props = objectify(properties)
let obj = {} let obj = {}
for (var name in props) { for (var name in props) {
if ( !props[name].readOnly || includeReadOnly ) { if ( props[name].readOnly && !includeReadOnly ) {
obj[name] = sampleFromSchema(props[name], { includeReadOnly: includeReadOnly }) continue
} }
if ( props[name].writeOnly && !includeWriteOnly ) {
continue
}
obj[name] = sampleFromSchema(props[name], config)
} }
if ( additionalProperties === true ) { if ( additionalProperties === true ) {
obj.additionalProp1 = {} obj.additionalProp1 = {}
} else if ( additionalProperties ) { } else if ( additionalProperties ) {
let additionalProps = objectify(additionalProperties) let additionalProps = objectify(additionalProperties)
let additionalPropVal = sampleFromSchema(additionalProps, { includeReadOnly: includeReadOnly }) let additionalPropVal = sampleFromSchema(additionalProps, config)
for (let i = 1; i < 4; i++) { for (let i = 1; i < 4; i++) {
obj["additionalProp" + i] = additionalPropVal obj["additionalProp" + i] = additionalPropVal
...@@ -65,7 +69,7 @@ export const sampleFromSchema = (schema, config={}) => { ...@@ -65,7 +69,7 @@ export const sampleFromSchema = (schema, config={}) => {
} }
if(type === "array") { if(type === "array") {
return [ sampleFromSchema(items, { includeReadOnly: includeReadOnly }) ] return [ sampleFromSchema(items, config) ]
} }
if(schema["enum"]) { if(schema["enum"]) {
...@@ -96,7 +100,7 @@ export const inferSchema = (thing) => { ...@@ -96,7 +100,7 @@ export const inferSchema = (thing) => {
export const sampleXmlFromSchema = (schema, config={}) => { export const sampleXmlFromSchema = (schema, config={}) => {
let objectifySchema = objectify(schema) let objectifySchema = objectify(schema)
let { type, properties, additionalProperties, items, example } = objectifySchema let { type, properties, additionalProperties, items, example } = objectifySchema
let { includeReadOnly } = config let { includeReadOnly, includeWriteOnly } = config
let defaultValue = objectifySchema.default let defaultValue = objectifySchema.default
let res = {} let res = {}
let _attr = {} let _attr = {}
...@@ -177,7 +181,13 @@ export const sampleXmlFromSchema = (schema, config={}) => { ...@@ -177,7 +181,13 @@ export const sampleXmlFromSchema = (schema, config={}) => {
example = example || {} example = example || {}
for (let propName in props) { for (let propName in props) {
if ( !props[propName].readOnly || includeReadOnly ) { if ( props[propName].readOnly && !includeReadOnly ) {
continue
}
if ( props[propName].writeOnly && !includeWriteOnly ) {
continue
}
props[propName].xml = props[propName].xml || {} props[propName].xml = props[propName].xml || {}
if (props[propName].xml.attribute) { if (props[propName].xml.attribute) {
...@@ -199,7 +209,6 @@ export const sampleXmlFromSchema = (schema, config={}) => { ...@@ -199,7 +209,6 @@ export const sampleXmlFromSchema = (schema, config={}) => {
} }
} }
}
if (additionalProperties === true) { if (additionalProperties === true) {
res[displayName].push({additionalProp: "Anything can be here"}) res[displayName].push({additionalProp: "Anything can be here"})
......
html
{
box-sizing: border-box;
}
*,
*:before,
*:after
{
box-sizing: inherit;
}
body
{
margin: 0;
background: #fafafa;
}
.wrapper .wrapper
{ {
width: 100%; width: 100%;
...@@ -540,6 +522,22 @@ body ...@@ -540,6 +522,22 @@ body
} }
} }
.response-col_links
{
padding-left: 2em;
max-width: 40em;
font-size: 14px;
@include text_body();
.response-undocumented
{
font-size: 11px;
@include text_code(#999);
}
}
.response-col_description__inner .response-col_description__inner
{ {
span span
...@@ -699,7 +697,6 @@ body ...@@ -699,7 +697,6 @@ body
.renderedMarkdown { .renderedMarkdown {
p { p {
@include text_body(); @include text_body();
font-size: 14px;
margin-top: 0px; margin-top: 0px;
margin-bottom: 0px; margin-bottom: 0px;
} }
......
...@@ -227,8 +227,6 @@ span ...@@ -227,8 +227,6 @@ span
{ {
> span.model > span.model
{ {
padding: 0 0 0 10px;
.brace-close .brace-close
{ {
padding: 0 0 0 10px; padding: 0 0 0 10px;
...@@ -236,6 +234,12 @@ span ...@@ -236,6 +234,12 @@ span
} }
} }
.prop-name
{
display: inline-block;
width: 100px;
}
.prop-type .prop-type
{ {
color: #55a; color: #55a;
......
...@@ -19,8 +19,8 @@ table ...@@ -19,8 +19,8 @@ table
&:first-of-type &:first-of-type
{ {
width: 100px; width: 124px;
padding: 0; padding: 0 0 0 2em;
} }
} }
} }
...@@ -52,7 +52,8 @@ table ...@@ -52,7 +52,8 @@ table
&:first-of-type &:first-of-type
{ {
width: 20%; max-width: 20%;
min-width: 6em;
padding: 10px 0; padding: 10px 0;
} }
} }
...@@ -138,6 +139,14 @@ table ...@@ -138,6 +139,14 @@ table
@include text_code(#888); @include text_code(#888);
} }
.parameter__deprecated
{
font-size: 12px;
font-style: italic;
@include text_code(#f00);
}
.table-container .table-container
{ {
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
margin: 0; margin: 0;
border: 2px solid #547f00; border: 2px solid #547f00;
border-radius: 4px 0 0 4px;
outline: none; outline: none;
} }
......
...@@ -14,5 +14,6 @@ ...@@ -14,5 +14,6 @@
@import 'information'; @import 'information';
@import 'authorize'; @import 'authorize';
@import 'errors'; @import 'errors';
@include text_body();
@import 'split-pane-mode'; @import 'split-pane-mode';
} }
...@@ -7,18 +7,20 @@ import { fromJS } from "immutable" ...@@ -7,18 +7,20 @@ import { fromJS } from "immutable"
import Schemes from "components/schemes" import Schemes from "components/schemes"
describe("<Schemes/>", function(){ describe("<Schemes/>", function(){
it("calls props.specActions.setScheme() when no operationScheme is selected", function(){ it("calls props.specActions.setScheme() when no currentScheme is selected", function(){
let setSchemeSpy = createSpy()
// Given // Given
let props = { let props = {
specActions: { specActions: {
setScheme: createSpy() setScheme: setSchemeSpy
}, },
schemes: fromJS([ schemes: fromJS([
"http", "http",
"https" "https"
]), ]),
operationScheme: undefined, currentScheme: undefined,
path: "/test", path: "/test",
method: "get" method: "get"
} }
...@@ -26,16 +28,45 @@ describe("<Schemes/>", function(){ ...@@ -26,16 +28,45 @@ describe("<Schemes/>", function(){
// When // When
let wrapper = shallow(<Schemes {...props}/>) let wrapper = shallow(<Schemes {...props}/>)
// Then operationScheme should default to first scheme in options list // Then currentScheme should default to first scheme in options list
expect(props.specActions.setScheme).toHaveBeenCalledWith("http", "/test" , "get") expect(props.specActions.setScheme).toHaveBeenCalledWith("http", "/test" , "get")
// When the operationScheme is no longer in the list of options // When the currentScheme is no longer in the list of options
props.schemes = fromJS([ props.schemes = fromJS([
"https" "https"
]) ])
wrapper.setProps(props) wrapper.setProps(props)
// Then operationScheme should default to first scheme in options list // Then currentScheme should default to first scheme in options list, again
expect(props.specActions.setScheme).toHaveBeenCalledWith("https", "/test", "get") expect(props.specActions.setScheme).toHaveBeenCalledWith("https", "/test", "get")
}) })
it("doesn't call props.specActions.setScheme() when schemes hasn't changed", function(){
let setSchemeSpy = createSpy()
// Given
let props = {
specActions: {
setScheme: setSchemeSpy
},
schemes: fromJS([
"http",
"https"
]),
currentScheme: "https"
}
// When
let wrapper = shallow(<Schemes {...props}/>)
// Should be called initially, to set the global state
expect(setSchemeSpy.calls.length).toEqual(1)
// After an update
wrapper.instance().componentWillReceiveProps(props)
// Should not be called again, since `currentScheme` is in schemes
expect(setSchemeSpy.calls.length).toEqual(1)
})
}) })
...@@ -132,10 +132,10 @@ describe("curlify", function() { ...@@ -132,10 +132,10 @@ describe("curlify", function() {
url: "http://example.com", url: "http://example.com",
method: "POST", method: "POST",
headers: { "content-type": "multipart/form-data" }, headers: { "content-type": "multipart/form-data" },
body: [ body: {
["id", "123"], id: "123",
["name", "Sahar"] name: "Sahar"
] }
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
...@@ -152,10 +152,10 @@ describe("curlify", function() { ...@@ -152,10 +152,10 @@ describe("curlify", function() {
url: "http://example.com", url: "http://example.com",
method: "POST", method: "POST",
headers: { "content-type": "multipart/form-data" }, headers: { "content-type": "multipart/form-data" },
body: [ body: {
["id", "123"], id: "123",
["file", file] file
] }
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
......
import { createXMLExample } from "corePlugins/samples/fn" import { createXMLExample, sampleFromSchema } from "corePlugins/samples/fn"
import expect from "expect" import expect from "expect"
describe("sampleFromSchema", function() {
it("returns object with no readonly fields for parameter", function () {
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
readOnlyDog: {
readOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
var expected = {
id: 0
}
expect(sampleFromSchema(definition, { includeReadOnly: false })).toEqual(expected)
})
it("returns object with readonly fields for parameter, with includeReadOnly", function () {
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
readOnlyDog: {
readOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
var expected = {
id: 0,
readOnlyDog: "string"
}
expect(sampleFromSchema(definition, { includeReadOnly: true })).toEqual(expected)
})
it("returns object without writeonly fields for parameter", function () {
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
writeOnlyDog: {
writeOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
var expected = {
id: 0
}
expect(sampleFromSchema(definition)).toEqual(expected)
})
it("returns object with writeonly fields for parameter, with includeWriteOnly", function () {
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
writeOnlyDog: {
writeOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
var expected = {
id: 0,
writeOnlyDog: "string"
}
expect(sampleFromSchema(definition, { includeWriteOnly: true })).toEqual(expected)
})
})
describe("createXMLExample", function () { describe("createXMLExample", function () {
var sut = createXMLExample var sut = createXMLExample
...@@ -554,6 +653,69 @@ describe("createXMLExample", function () { ...@@ -554,6 +653,69 @@ describe("createXMLExample", function () {
expect(sut(definition, { includeReadOnly: false })).toEqual(expected) expect(sut(definition, { includeReadOnly: false })).toEqual(expected)
}) })
it("returns object with readonly fields for parameter, with includeReadOnly", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<id>0</id>\n\t<dog>string</dog>\n</animals>"
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
dog: {
readOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
expect(sut(definition, { includeReadOnly: true })).toEqual(expected)
})
it("returns object without writeonly fields for parameter", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<id>0</id>\n</animals>"
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
dog: {
writeOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
expect(sut(definition)).toEqual(expected)
})
it("returns object with writeonly fields for parameter, with includeWriteOnly", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<id>0</id>\n\t<dog>string</dog>\n</animals>"
var definition = {
type: "object",
properties: {
id: {
type: "integer"
},
dog: {
writeOnly: true,
type: "string"
}
},
xml: {
name: "animals"
}
}
expect(sut(definition, { includeWriteOnly: true })).toEqual(expected)
})
it("returns object with passed property as attribute", function () { it("returns object with passed property as attribute", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals id=\"0\">\n\t<dog>string</dog>\n</animals>" var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals id=\"0\">\n\t<dog>string</dog>\n</animals>"
var definition = { var definition = {
......
{
"pet": [
{
"id": 1,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 2,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 3,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 4,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 5,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 6,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
},
{
"id": 7,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
}
]
}
\ No newline at end of file
{
"src_folders" : ["test/e2e/scenarios"],
"output_folder" : "reports",
"live_output": true,
"custom_commands_path" : "",
"custom_assertions_path" : "",
"page_objects_path" : "test/e2e/pages",
"globals_path" : "",
"test_workers" : {
"enabled" : true,
"workers" : "auto"
},
"test_runner" : {
"type" : "mocha",
"options" : {
"ui" : "bdd",
"reporter" : "list"
}
},
"selenium" : {
"start_process" : true,
"server_path" : "node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-3.4.0.jar",
"log_path" : "",
"host" : "127.0.0.1",
"port" : 4444,
"cli_args" : {
"webdriver.chrome.driver" : "node_modules/chromedriver/bin/chromedriver",
"webdriver.firefox.profile" : "",
"webdriver.ie.driver" : ""
}
},
"test_settings" : {
"default" : {
"launch_url" : "http://localhost",
"selenium_port" : 4444,
"selenium_host" : "localhost",
"silent": true,
"screenshots" : {
"enabled" : false,
"path" : ""
},
"desiredCapabilities": {
"browserName": "chrome",
"marionette": true
}
},
"chrome" : {
"desiredCapabilities": {
"browserName": "chrome"
}
},
"edge" : {
"desiredCapabilities": {
"browserName": "MicrosoftEdge"
}
}
}
}
\ No newline at end of file
此差异已折叠。
describe("render informationContainer", function () {
let mainPage
let informationContainer
beforeEach(function (client, done) {
mainPage = client
.url("localhost:3200")
.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")
.click("button.download-url-button")
.pause(1000)
informationContainer = mainPage.section.informationContainer
done()
})
it("renders section", function (client) {
mainPage.expect.section("@informationContainer").to.be.visible.before(5000)
client.end()
})
it("renders content", function (client) {
informationContainer.waitForElementVisible("@title", 5000)
.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.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/")
.assert.attributeEquals("@termsLink", "href", "http://swagger.io/terms/")
.assert.containsText("@termsLink", "Terms of service")
.assert.attributeEquals("@contactDevLink", "href", "mailto:apiteam@swagger.io")
.assert.containsText("@contactDevLink", "Contact the developer")
.assert.attributeEquals("@contactDevLink", "href", "mailto:apiteam@swagger.io")
.assert.containsText("@contactDevLink", "Contact the developer")
.assert.attributeEquals("@aboutSwaggerLink", "href", "http://swagger.io/")
.assert.containsText("@aboutSwaggerLink", "Find out more about Swagger")
client.end()
})
})
\ No newline at end of file
describe("Render Model Wrapper", function () {
let modelWrapper, mainPage
beforeEach(function (client, done) {
mainPage = client
.url("localhost:3200")
.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")
.click("button.download-url-button")
.pause(1000)
modelWrapper = mainPage.section.modelWrapper
done()
})
afterEach(function (client, done){
done()
})
it("Render model wrapper", function(client){
mainPage.expect.section("@modelWrapper").to.be.visible.before(5000)
client.end()
})
it("Render model wrapper collapse", function(client){
modelWrapper.waitForElementVisible("@modelContainer", 5000)
.click("@modelCollapse")
.assert.cssClassNotPresent("@modelContainer", "is-open")
client.end()
})
it("Testing order model", function(client){
modelWrapper.waitForElementVisible("@orderModel")
.click("@orderModelCallapse")
.assert.cssClassNotPresent("@orderModelCallapse", "callapsed")
client.end()
})
it("Testing category model", function(client){
modelWrapper.waitForElementVisible("@categoryModel")
.click("@categoryModelCallapse")
.assert.cssClassNotPresent("@categoryModelCallapse", "callapsed")
client.end()
})
it("Testing user model", function(client){
modelWrapper.waitForElementVisible("@userModel")
.click("@userModelCallapse")
.assert.cssClassNotPresent("@userModelCallapse", "callapsed")
client.end()
})
it("Testing tag model", function(client){
modelWrapper.waitForElementVisible("@tagModel")
.click("@tagModelCallapse")
.assert.cssClassNotPresent("@tagModelCallapse", "callapsed")
client.end()
})
it("Testing pet model", function(client){
modelWrapper.waitForElementVisible("@petModel")
.click("@petModelCallapse")
.assert.cssClassNotPresent("@petModelCallapse", "callapsed")
client.end()
})
it("Testing apiResponse model", function(client){
modelWrapper.waitForElementVisible("@apiResponseModel")
.click("@apiResponseModelCallapse")
.assert.cssClassNotPresent("@apiResponseModelCallapse", "callapsed")
client.end()
})
})
describe("render pet api container", function () {
let mainPage
let apiWrapper
beforeEach(function (client, done) {
mainPage = client
.url("localhost:3200")
.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")
.click("button.download-url-button")
.pause(1000)
apiWrapper = mainPage.section.apiWrapper
done()
})
afterEach(function (client, done) {
done()
})
it("render section", function (client) {
mainPage.expect.section("@apiWrapper").to.be.visible.before(10000)
client.end()
})
it("test rendered pet container", function (client) {
apiWrapper.waitForElementVisible("@petAPIWrapper", 5000)
.expect.element("@petAPIWrapper").to.be.visible
client.end()
})
it("collapse pet wrapper", function (client) {
apiWrapper.waitForElementVisible("@petAPIWrapper", 5000)
.click("@petAPIWrapperBar")
.assert.cssClassNotPresent("@petAPIWrapper", "is-open")
client.end()
})
it("render post /pet api container", function (client) {
apiWrapper.waitForElementVisible("@petOperationPostContainer", 10000)
.assert.containsText("@petOperationPostTitle", "/pet")
.click("@petOperationPostCollpase")
.waitForElementVisible("@petOperationPostCollapseContainer", 5000)
.click("@petOperationPostTryBtn")
.waitForElementVisible("@petOperationPostTryText", 1000)
.waitForElementVisible("@petOperationPostExecuteBtn", 1000)
.click("@petOperationPostTryBtn")
.assert.cssClassNotPresent("@petOperationPostTryBtn", "cancel")
client.end()
})
it("Testing post /pet api Mock data", function (client) {
apiWrapper.waitForElementVisible("@petOperationPostContainer", 5000)
.click("@petOperationPostCollpase")
.waitForElementVisible("@petOperationPostCollapseContainer", 5000)
.click("@petOperationPostTryBtn")
.waitForElementVisible("@petOperationPostExecuteBtn", 1000)
.click("@petOperationPostExecuteBtn")
.waitForElementVisible("@petOperationPostMockCategoryID", 2000)
.assert.containsText("@petOperationPostMockCategoryID", "0")
.assert.containsText("@petOperationPostMockCategoryName", "\"string\"")
.assert.containsText("@petOperationPostMockName", "\"doggie\"")
.assert.containsText("@petOperationPostTagID", "0")
.assert.containsText("@petOperationPostTagName", "\"string\"")
.assert.containsText("@petOperationPostStatus", "\"available\"")
.click("@petOperationPostTryBtn")
.assert.cssClassNotPresent("@petOperationPostTryBtn", "cancel")
client.end()
})
it("render put /pet api container", function (client) {
apiWrapper.waitForElementVisible("@petOperationPutContainer", 5000)
.assert.containsText("@petOperationPutTitle", "/pet")
.click("@petOperationPutCollpase")
.waitForElementVisible("@petOperationPutCollapseContainer", 3000)
.click("@petOperationPutTryBtn")
.waitForElementVisible("@petOperationPutTryText", 1000)
.waitForElementVisible("@petOperationPutExecuteBtn", 1000)
.click("@petOperationPutTryBtn")
.assert.cssClassNotPresent("@petOperationPutTryBtn", "cancel")
client.end()
})
it("Testing put /pet api Mock data", function (client) {
apiWrapper.waitForElementVisible("@petOperationPutContainer", 5000)
.click("@petOperationPutCollpase")
.waitForElementVisible("@petOperationPutCollapseContainer", 3000)
.click("@petOperationPutTryBtn")
.waitForElementVisible("@petOperationPutExecuteBtn", 1000)
.click("@petOperationPutExecuteBtn")
.waitForElementVisible("@petOperationPutMockCategoryID")
.assert.containsText("@petOperationPutMockCategoryID", "0")
.assert.containsText("@petOperationPutMockCategoryName", "\"string\"")
.assert.containsText("@petOperationPutMockName", "\"doggie\"")
.assert.containsText("@petOperationPutTagID", "0")
.assert.containsText("@petOperationPutTagName", "\"string\"")
.assert.containsText("@petOperationPutStatus", "\"available\"")
.click("@petOperationPutTryBtn")
.assert.cssClassNotPresent("@petOperationPutTryBtn", "Cancel")
client.end()
})
it("render get by tag /pet api container", function (client) {
apiWrapper.waitForElementVisible("@petOperationGetByTagContainer", 5000)
.assert.containsText("@petOperationGetByTagTitle", "/pet/findByTags")
.click("@petOperationGetByTagCollpase")
.waitForElementVisible("@petOperationGetByTagCollapseContainer", 3000)
.click("@petOperationGetByTagTryBtn")
.waitForElementVisible("@petOperationGetByTagTryAdded", 1000)
.waitForElementVisible("@petOperationGetByTagExecuteBtn", 1000)
.click("@petOperationGetByTagTryBtn")
.assert.cssClassNotPresent("@petOperationGetByTagTryBtn", "cancel")
client.end()
})
it("Testing get by tag /pet api Mock data", function (client) {
apiWrapper.waitForElementVisible("@petOperationGetByTagContainer", 5000)
.click("@petOperationGetByTagCollpase")
.waitForElementVisible("@petOperationGetByTagCollapseContainer", 3000)
.click("@petOperationGetByTagTryBtn")
.waitForElementVisible("@petOperationGetByTagExecuteBtn", 1000)
.click("@petOperationGetByTagExecuteBtn")
.waitForElementVisible("@petOperationGetByTagMockCategoryID")
.assert.containsText("@petOperationGetByTagMockCategoryID", "0")
.assert.containsText("@petOperationGetByTagMockCategoryName", "\"string\"")
.assert.containsText("@petOperationGetByTagMockName", "\"doggie\"")
.assert.containsText("@petOperationGetByTagTagID", "0")
.assert.containsText("@petOperationGetByTagTagName", "\"string\"")
.assert.containsText("@petOperationGetByTagStatus", "\"available\"")
.click("@petOperationGetByTagTryBtn")
.assert.cssClassNotPresent("@petOperationGetByTagTryBtn", "cancel")
client.end()
})
it("render delete /pet api container", function (client) {
apiWrapper.waitForElementVisible("@petOperationDeleteContainer")
.assert.containsText("@petOperationDeleteTitle", "/pet/{petId}")
.click("@petOperationDeleteCollpase")
.waitForElementVisible("@petOperationDeleteCollapseContainer", 3000)
.click("@petOperationDeleteTryBtn")
.waitForElementVisible("@petOperationDeleteExecuteBtn", 1000)
.click("@petOperationDeleteTryBtn")
.assert.cssClassNotPresent("@petOperationDeleteTryBtn", "cancel")
client.end()
})
it("Testing delete /pet api Mock data", function (client) {
apiWrapper.waitForElementVisible("@petOperationDeleteContainer", 3000)
.click("@petOperationDeleteCollpase")
.waitForElementVisible("@petOperationDeleteCollapseContainer", 3000)
.click("@petOperationDeleteTryBtn")
.waitForElementVisible("@petOperationDeleteExecuteBtn", 1000)
.click("@petOperationDeleteExecuteBtn")
.waitForElementVisible("@petOperationDeleteMockCategoryID")
.assert.containsText("@petOperationDeleteMockCategoryID", "0")
.assert.containsText("@petOperationDeleteMockCategoryName", "\"string\"")
.assert.containsText("@petOperationDeleteMockName", "\"doggie\"")
.assert.containsText("@petOperationDeleteTagID", "0")
.assert.containsText("@petOperationDeleteTagName", "\"string\"")
.assert.containsText("@petOperationDeleteStatus", "\"available\"")
.click("@petOperationDeleteTryBtn")
.assert.cssClassNotPresent("@petOperationDeleteTryBtn", "cancel")
client.end()
})
})
\ No newline at end of file
describe("render store api container", function(){
let mainPage
let apiWrapper
beforeEach( function(client, done){
mainPage = client
.url("localhost:3200")
.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")
.click("button.download-url-button")
.pause(1000)
apiWrapper = mainPage.section.apiWrapper
done()
})
afterEach(function (client, done) {
done()
})
it("test rendered store container", function(client){
apiWrapper.waitForElementVisible("@storeAPIWrapper", 5000)
.expect.element("@storeAPIWrapper").to.be.visible
client.end()
})
it("callapse store wrapper", function(client){
apiWrapper.waitForElementVisible("@storeAPIWrapper", 5000)
.click("@storeAPIWrapperBar")
.assert.cssClassNotPresent("@storeAPIWrapper", "is-open")
client.end()
})
it("render get /store/inventory api container", function (client) {
apiWrapper.waitForElementVisible("@storeOperationGetContainer", 5000)
.assert.containsText("@storeOperationGetTitle", "/store/inventory")
.click("@storeOperationGetCollpase")
.waitForElementVisible("@storeOperationGetCollapseContainer", 5000)
.click("@storeOperationGetTryBtn")
.waitForElementVisible("@storeOperationGetExecuteBtn", 1000)
.click("@storeOperationGetTryBtn")
.assert.cssClassNotPresent("@storeOperationGetTryBtn", "cancel")
client.end()
})
it("Testing get /store/inventory api Mock data ", function (client) {
apiWrapper.waitForElementVisible("@storeOperationGetContainer", 5000)
.assert.containsText("@storeOperationGetTitle", "/store/inventory")
.click("@storeOperationGetCollpase")
.waitForElementVisible("@storeOperationGetCollapseContainer", 3000)
.click("@storeOperationGetTryBtn")
.waitForElementVisible("@storeOperationGetExecuteBtn", 1000)
.click("@storeOperationGetExecuteBtn")
.waitForElementVisible("@storeOperationResponseProps1")
.assert.containsText("@storeOperationResponseProps1", "0")
.assert.containsText("@storeOperationResponseProps2", "0")
.assert.containsText("@storeOperationResponseProps3", "0")
.click("@storeOperationGetTryBtn")
.assert.cssClassNotPresent("@storeOperationGetTryBtn", "cancel")
client.end()
})
it("render post /store/order api container", function (client) {
apiWrapper.waitForElementVisible("@storeOperationPostContainer")
.assert.containsText("@storeOperationPostTitle", "/store/order")
.click("@storeOperationPostCollpase")
.waitForElementVisible("@storeOperationPostCollapseContainer", 3000)
.click("@storeOperationPostTryBtn")
.waitForElementVisible("@storeOperationPostExecuteBtn", 1000)
.click("@storeOperationPostTryBtn")
.assert.cssClassNotPresent("@storeOperationPostTryBtn", "cancel")
client.end()
})
it("Testing post /store/order api Mock Data", function (client) {
apiWrapper.waitForElementVisible("@storeOperationPostContainer")
.assert.containsText("@storeOperationPostTitle", "/store/order")
.click("@storeOperationPostCollpase")
.waitForElementVisible("@storeOperationPostCollapseContainer", 3000)
.click("@storeOperationPostTryBtn")
.waitForElementVisible("@storeOperationPostExecuteBtn", 1000)
.click("@storeOperationPostExecuteBtn")
.waitForElementVisible("@storeOperationPostResponseId")
.assert.containsText("@storeOperationPostResponseId", "0")
.assert.containsText("@storeOperationPostResponsePetId", "0")
.assert.containsText("@storeOperationPostResponseQuantity", "0")
.assert.containsText("@storeOperationPostResponseStatus", "placed")
.assert.containsText("@storeOperationPostResponseComplete", "false")
.click("@storeOperationPostTryBtn")
.assert.cssClassNotPresent("@storeOperationPostTryBtn", "cancel")
client.end()
})
it("render delete /store/order/{orderId} api container", function (client) {
apiWrapper.waitForElementVisible("@storeOperationDeleteContainer")
.assert.containsText("@storeOperationDeleteTitle", "/store/order/{orderId}")
.click("@storeOperationDeleteCollpase")
.waitForElementVisible("@storeOperationDeleteCollapseContainer", 3000)
.click("@storeOperationDeleteTryBtn")
.waitForElementVisible("@storeOperationDeleteExecuteBtn", 1000)
.click("@storeOperationDeleteExecuteBtn")
.waitForElementVisible("@storeOperationGetResponseHeaders", "content-type: application/xml")
.click("@storeOperationDeleteTryBtn")
.assert.cssClassNotPresent("@storeOperationDeleteTryBtn", "cancel")
client.end()
})
})
\ No newline at end of file
describe("render user api container", function(){
let mainPage
let apiWrapper
beforeEach( function(client, done){
mainPage = client
.url("localhost:3200")
.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")
.click("button.download-url-button")
.pause(1000)
apiWrapper = mainPage.section.apiWrapper
done()
})
afterEach(function (client, done) {
done()
})
it("test rendered user container", function(client){
apiWrapper.waitForElementVisible("@userAPIWrapper", 5000)
.expect.element("@userAPIWrapper").to.be.visible
client.end()
})
it("callapse user wrapper", function(client){
apiWrapper.waitForElementVisible("@userAPIWrapper", 5000)
.click("@userAPIWrapperBar")
.assert.cssClassNotPresent("@userAPIWrapper", "is-open")
client.end()
})
it("render put /user/{username} api container", function (client) {
apiWrapper.waitForElementVisible("@userOperationPutContainer", 5000)
.assert.containsText("@userOperationPutTitle", "/user/{username}")
.click("@userOperationPutCollpase")
.waitForElementVisible("@userOperationPutCollapseContainer", 3000)
.click("@userOperationPutTryBtn")
.waitForElementVisible("@userOperationPutExecuteBtn", 1000)
.click("@userOperationPutTryBtn")
.assert.cssClassNotPresent("@userOperationPutTryBtn", "cancel")
client.end()
})
it("Test put /user/{username} api Mock data", function (client) {
apiWrapper.waitForElementVisible("@userOperationPutContainer", 5000)
.assert.containsText("@userOperationPutTitle", "/user/{username}")
.click("@userOperationPutCollpase")
.waitForElementVisible("@userOperationPutCollapseContainer", 3000)
.click("@userOperationPutTryBtn")
.waitForElementVisible("@userOperationPutParameter")
.setValue("@userOperationPutParameter", "123")
.waitForElementVisible("@userOperationPutExecuteBtn", 1000)
.click("userOperationPutExecuteBtn")
.waitForElementVisible("@userOperationPutResponseHeader")
.assert.containsText("@userOperationPutResponseHeader", "content-type: application/xml")
.click("@userOperationPutTryBtn")
.assert.cssClassNotPresent("@userOperationPutTryBtn", "cancel")
client.end()
})
it("render delete /user/{username} api container", function (client) {
apiWrapper.waitForElementVisible("@userOperationDeleteContainer", 5000)
.assert.containsText("@userOperationDeleteTitle", "/user/{username}")
.click("@userOperationDeleteCollpase")
.waitForElementVisible("@userOperationDeleteCollapseContainer", 3000)
.click("@userOperationDeleteTryBtn")
.waitForElementVisible("@userOperationDeleteExecuteBtn", 1000)
.click("@userOperationDeleteTryBtn")
.assert.cssClassNotPresent("@userOperationDeleteTryBtn", "cancel")
client.end()
})
it("Test delete /user/{username} api Mock data", function (client) {
apiWrapper.waitForElementVisible("@userOperationDeleteContainer", 5000)
.assert.containsText("@userOperationDeleteTitle", "/user/{username}")
.click("@userOperationDeleteCollpase")
.waitForElementVisible("@userOperationDeleteCollapseContainer", 3000)
.click("@userOperationDeleteTryBtn")
.waitForElementVisible("@userOperationDeleteParameter")
.setValue("@userOperationDeleteParameter", "123")
.waitForElementVisible("@userOperationDeleteExecuteBtn", 1000)
.click("userOperationDeleteExecuteBtn")
.waitForElementVisible("@userOperationDeleteResponseHeader")
.assert.containsText("@userOperationDeleteResponseHeader", "content-type: application/xml")
.click("@userOperationDeleteTryBtn")
.assert.cssClassNotPresent("@userOperationDeleteTryBtn", "cancel")
client.end()
})
})
\ No newline at end of file
describe("Render scheme", function () {
let mainPage
let schemeContainer
beforeEach(function (client, done) {
mainPage = client
.url("localhost:3200")
.page.main()
schemeContainer = mainPage.section.schemeContainer
client.waitForElementVisible(".download-url-input", 5000)
.pause(5000)
.clearValue(".download-url-input")
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
.click("button.download-url-button")
.pause(1000)
done()
})
it("render section", function (client) {
mainPage.expect.section("@schemeContainer").to.be.visible.before(5000)
client.end()
})
it("render scheme option", function (client) {
schemeContainer.waitForElementVisible("@httpOption", 5000)
.expect.element("@httpOption").to.be.selected
client.end()
})
it("render authorized button", function (client) {
schemeContainer.waitForElementVisible("@btnAuthorize", 5000)
.expect.element("@btnAuthorize").to.be.visible
client.end()
})
it("render click event", function(client) {
schemeContainer.waitForElementVisible("@btnAuthorize", 5000)
.click("@btnAuthorize")
.assert.visible("@authorizationModal")
.assert.containsText("@appName", "Application: your-app-name")
.assert.containsText("@authorizationUrl", "http://petstore.swagger.io/oauth/dialog")
.assert.containsText("@flow", "implicit")
.assert.value("@inputClientID", "your-client-id")
client.end()
})
})
\ No newline at end of file
describe("initial render", function () {
let mainPage
describe("for topbar", function () {
let topbar
before(function (client, done) {
done()
})
after(function (client, done) {
client.end(function () {
done()
})
})
afterEach(function (client, done) {
done()
})
beforeEach(function (client, done) {
mainPage = client
.url("localhost:3200")
.page.main()
topbar = mainPage.section.topbar
client.waitForElementVisible(".download-url-input", 10000)
.pause(5000)
.clearValue(".download-url-input")
.setValue(".download-url-input", "http://localhost:3200/test-specs/petstore.json")
.click("button.download-url-button")
.pause(1000)
done()
})
it("renders section", function (client) {
mainPage.expect.section("@topbar").to.be.visible
client.end()
})
it("renders input box", function (client) {
topbar.expect.element("@inputBox").to.be.visible
client.end()
})
it("renders explore button", function (client) {
topbar.expect.element("@btnExplore").to.be.visible
client.end()
})
})
})
此差异已折叠。
const config = require("./webpack-dist.config.js") const config = require("./webpack-dist.config.js")
config.plugins = config.plugins.filter(plugin => {
// Disable minification
return plugin.constructor.name !== "UglifyJsPlugin"
})
module.exports = config module.exports = config
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册