mirror of
https://github.com/ditkrg/rswag.git
synced 2026-01-25 23:32:58 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e130e41843 | ||
|
|
5946b3c88b |
17
.github/ISSUE_TEMPLATE/bug_report.md
vendored
17
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,17 +0,0 @@
|
|||||||
## Describe the bug
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
## Steps to Test or Reproduce
|
|
||||||
Please provide an example repo or the steps to reproduce the behavior.
|
|
||||||
|
|
||||||
## Expected behavior
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
## Additional context
|
|
||||||
Add any other context about the problem here.
|
|
||||||
|
|
||||||
## Rswag Version
|
|
||||||
The version of rswag are you using.
|
|
||||||
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,11 +0,0 @@
|
|||||||
## Is your feature request related to a problem? Please describe.
|
|
||||||
A clear and concise description of what the problem is.
|
|
||||||
|
|
||||||
## Describe the solution you'd like
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
## Describe alternatives you've considered
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
## Additional context
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
## Problem
|
|
||||||
A clear and concise description of what the problem is.
|
|
||||||
|
|
||||||
## Solution
|
|
||||||
A clear and concise description of what the solution is.
|
|
||||||
|
|
||||||
### Related Issues
|
|
||||||
Links to any related issues.
|
|
||||||
|
|
||||||
### Checklist
|
|
||||||
- [ ] Added tests
|
|
||||||
- [ ] Changelog updated
|
|
||||||
|
|
||||||
### Steps to Test or Reproduce
|
|
||||||
Outline the steps to test or reproduce the PR here.
|
|
||||||
@@ -1 +1 @@
|
|||||||
2.6.3
|
2.6.4
|
||||||
|
|||||||
10
.travis.yml
10
.travis.yml
@@ -1,11 +1,11 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
|
|
||||||
dist: bionic
|
dist: xenial
|
||||||
services:
|
services:
|
||||||
- xvfb
|
- xvfb
|
||||||
|
|
||||||
rvm:
|
rvm:
|
||||||
- 2.6.3
|
- 2.6.4
|
||||||
|
|
||||||
env:
|
env:
|
||||||
- RAILS_VERSION=6.0.0
|
- RAILS_VERSION=6.0.0
|
||||||
@@ -19,7 +19,7 @@ addons:
|
|||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- /home/travis/.rvm/gems/ruby-2.6.3
|
- /home/travis/.rvm/gems/ruby-2.6.4
|
||||||
|
|
||||||
install: ./ci/build.sh
|
install: ./ci/build.sh
|
||||||
|
|
||||||
@@ -29,7 +29,6 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- stage: publish components
|
- stage: publish components
|
||||||
script: 'cd rswag-api'
|
script: 'cd rswag-api'
|
||||||
if: tag IS present
|
|
||||||
deploy:
|
deploy:
|
||||||
gemspec: rswag-api.gemspec
|
gemspec: rswag-api.gemspec
|
||||||
provider: rubygems
|
provider: rubygems
|
||||||
@@ -40,7 +39,6 @@ jobs:
|
|||||||
|
|
||||||
- stage: publish components
|
- stage: publish components
|
||||||
script: 'cd rswag-specs'
|
script: 'cd rswag-specs'
|
||||||
if: tag IS present
|
|
||||||
deploy:
|
deploy:
|
||||||
gemspec: rswag-specs.gemspec
|
gemspec: rswag-specs.gemspec
|
||||||
provider: rubygems
|
provider: rubygems
|
||||||
@@ -51,7 +49,6 @@ jobs:
|
|||||||
|
|
||||||
- stage: publish components
|
- stage: publish components
|
||||||
script: 'cd rswag-ui'
|
script: 'cd rswag-ui'
|
||||||
if: tag IS present
|
|
||||||
deploy:
|
deploy:
|
||||||
gemspec: rswag-ui.gemspec
|
gemspec: rswag-ui.gemspec
|
||||||
provider: rubygems
|
provider: rubygems
|
||||||
@@ -63,7 +60,6 @@ jobs:
|
|||||||
|
|
||||||
- stage: publish rswag
|
- stage: publish rswag
|
||||||
script: 'cd rswag'
|
script: 'cd rswag'
|
||||||
if: tag IS present
|
|
||||||
deploy:
|
deploy:
|
||||||
gemspec: rswag.gemspec
|
gemspec: rswag.gemspec
|
||||||
provider: rubygems
|
provider: rubygems
|
||||||
|
|||||||
@@ -12,12 +12,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
### Security
|
### Security
|
||||||
|
|
||||||
## [2.2.0] - 2019-11-01
|
|
||||||
### Added
|
|
||||||
- New swagger_format config option for setting YAML output [#251](https://github.com/rswag/rswag/pull/251)
|
|
||||||
### Changed
|
|
||||||
- rswag-api will serve yaml files as yaml [#251](https://github.com/rswag/rswag/pull/251)
|
|
||||||
|
|
||||||
## [2.1.1] - 2019-10-18
|
## [2.1.1] - 2019-10-18
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix incorrect require reference for swagger_generator [#248](https://github.com/rswag/rswag/issues/248)
|
- Fix incorrect require reference for swagger_generator [#248](https://github.com/rswag/rswag/issues/248)
|
||||||
|
|||||||
34
README.md
34
README.md
@@ -1,11 +1,10 @@
|
|||||||
rswag
|
rswag
|
||||||
=========
|
=========
|
||||||
[](https://travis-ci.org/rswag/rswag)
|
[](https://travis-ci.org/rswag/rswag)
|
||||||
[](https://codeclimate.com/github/rswag/rswag/maintainability)
|
|
||||||
|
|
||||||
[Swagger](http://swagger.io) tooling for Rails API's. Generate beautiful API documentation, including a UI to explore and test operations, directly from your rspec integration tests.
|
[Swagger](http://swagger.io) tooling for Rails API's. Generate beautiful API documentation, including a UI to explore and test operations, directly from your rspec integration tests.
|
||||||
|
|
||||||
Rswag extends rspec-rails "request specs" with a Swagger-based DSL for describing and testing API operations. You describe your API operations with a succinct, intuitive syntax, and it automaticaly runs the tests. Once you have green tests, run a rake task to auto-generate corresponding Swagger files and expose them as YAML or JSON endpoints. Rswag also provides an embedded version of the awesome [swagger-ui](https://github.com/swagger-api/swagger-ui) that's powered by the exposed file. This toolchain makes it seamless to go from integration specs, which youre probably doing in some form already, to living documentation for your API consumers.
|
Rswag extends rspec-rails "request specs" with a Swagger-based DSL for describing and testing API operations. You describe your API operations with a succinct, intuitive syntax, and it automaticaly runs the tests. Once you have green tests, run a rake task to auto-generate corresponding Swagger files and expose them as JSON endpoints. Rswag also provides an embedded version of the awesome [swagger-ui](https://github.com/swagger-api/swagger-ui) that's powered by the exposed JSON. This toolchain makes it seamless to go from integration specs, which youre probably doing in some form already, to living documentation for your API consumers.
|
||||||
|
|
||||||
And that's not all ...
|
And that's not all ...
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ Once you have an API that can describe itself in Swagger, you've opened the trea
|
|||||||
|Rswag Version|Swagger (OpenAPI) Spec.|swagger-ui|
|
|Rswag Version|Swagger (OpenAPI) Spec.|swagger-ui|
|
||||||
|----------|----------|----------|
|
|----------|----------|----------|
|
||||||
|[master](https://github.com/rswag/rswag/tree/master)|2.0|3.18.2|
|
|[master](https://github.com/rswag/rswag/tree/master)|2.0|3.18.2|
|
||||||
|[2.2.0](https://github.com/rswag/rswag/tree/2.2.0)|2.0|3.18.2|
|
|[2.0.6](https://github.com/rswag/rswag/tree/2.0.6)|2.0|3.17.3|
|
||||||
|[1.6.0](https://github.com/rswag/rswag/tree/1.6.0)|2.0|2.2.5|
|
|[1.6.0](https://github.com/rswag/rswag/tree/1.6.0)|2.0|2.2.5|
|
||||||
|
|
||||||
## Getting Started ##
|
## Getting Started ##
|
||||||
@@ -27,15 +26,14 @@ Once you have an API that can describe itself in Swagger, you've opened the trea
|
|||||||
gem 'rswag'
|
gem 'rswag'
|
||||||
```
|
```
|
||||||
|
|
||||||
or if you like to avoid loading rspec in other bundler groups load the rswag-specs component separately.
|
or if you like to avoid loading rspec in other bundler groups.
|
||||||
Note: Adding it to the :development group is not strictly necessary, but without it, generators and rake tasks must be preceded by RAILS_ENV=test.
|
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
# Gemfile
|
# Gemfile
|
||||||
gem 'rswag-api'
|
gem 'rswag-api'
|
||||||
gem 'rswag-ui'
|
gem 'rswag-ui'
|
||||||
|
|
||||||
group :development, :test do
|
group :test do
|
||||||
gem 'rspec-rails'
|
gem 'rspec-rails'
|
||||||
gem 'rswag-specs'
|
gem 'rswag-specs'
|
||||||
end
|
end
|
||||||
@@ -123,17 +121,12 @@ Once you have an API that can describe itself in Swagger, you've opened the trea
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
There is also a generator which can help get you started `rails generate rspec:swagger API::MyController`
|
|
||||||
|
|
||||||
|
|
||||||
4. Generate the Swagger JSON file(s)
|
4. Generate the Swagger JSON file(s)
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
rake rswag:specs:swaggerize
|
rake rswag:specs:swaggerize
|
||||||
```
|
```
|
||||||
|
|
||||||
This common command is also aliased as `rake rswag`.
|
|
||||||
|
|
||||||
5. Spin up your app and check out the awesome, auto-generated docs at _/api-docs_!
|
5. Spin up your app and check out the awesome, auto-generated docs at _/api-docs_!
|
||||||
|
|
||||||
## The rspec DSL ##
|
## The rspec DSL ##
|
||||||
@@ -193,7 +186,7 @@ describe 'Blogs API' do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
*Note:* OAI v3 has a nullable property. Rswag will work to support this soon. This may have an effect on the need/use of custom extension to the draft. Do not use this property if you don't understand the implications.
|
*Note:* the OAI v3 may be released soon(ish?) and include a nullable property. This may have an effect on the need/use of custom extension to the draft. Do not use this property if you don't understand the implications.
|
||||||
<https://github.com/OAI/OpenAPI-Specification/issues/229#issuecomment-280376087>
|
<https://github.com/OAI/OpenAPI-Specification/issues/229#issuecomment-280376087>
|
||||||
|
|
||||||
### Global Metadata ###
|
### Global Metadata ###
|
||||||
@@ -216,8 +209,8 @@ RSpec.configure do |config|
|
|||||||
basePath: '/api/v1'
|
basePath: '/api/v1'
|
||||||
},
|
},
|
||||||
|
|
||||||
'v2/swagger.yaml' => {
|
'v2/swagger.json' => {
|
||||||
openapi: '3.0.0',
|
swagger: '2.0',
|
||||||
info: {
|
info: {
|
||||||
title: 'API V2',
|
title: 'API V2',
|
||||||
version: 'v2',
|
version: 'v2',
|
||||||
@@ -234,7 +227,7 @@ By default, the paths, operations and responses defined in your spec files will
|
|||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
# spec/integration/v2/blogs_spec.rb
|
# spec/integration/v2/blogs_spec.rb
|
||||||
describe 'Blogs API', swagger_doc: 'v2/swagger.yaml' do
|
describe 'Blogs API', swagger_doc: 'v2/swagger.json' do
|
||||||
|
|
||||||
path '/blogs' do
|
path '/blogs' do
|
||||||
...
|
...
|
||||||
@@ -451,17 +444,6 @@ RSpec.configure do |config|
|
|||||||
config.swagger_dry_run = false
|
config.swagger_dry_run = false
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
### Running tests without documenting ###
|
|
||||||
|
|
||||||
If you want to use Rswag for testing without adding it to you swagger docs, you can simply nullify the response metadata after the test run.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
after do |example|
|
|
||||||
example.metadata[:response] = null
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Route Prefix for Swagger JSON Endpoints ###
|
### Route Prefix for Swagger JSON Endpoints ###
|
||||||
|
|
||||||
The functionality to expose Swagger files, such as those generated by rswag-specs, as JSON endpoints is implemented as a Rails Engine. As with any Engine, you can change it's mount prefix in _routes.rb_:
|
The functionality to expose Swagger files, such as those generated by rswag-specs, as JSON endpoints is implemented as a Rails Engine. As with any Engine, you can change it's mount prefix in _routes.rb_:
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
require 'json'
|
require 'json'
|
||||||
require 'yaml'
|
|
||||||
require 'rack/mime'
|
|
||||||
|
|
||||||
module Rswag
|
module Rswag
|
||||||
module Api
|
module Api
|
||||||
@@ -16,15 +14,13 @@ module Rswag
|
|||||||
filename = "#{@config.resolve_swagger_root(env)}/#{path}"
|
filename = "#{@config.resolve_swagger_root(env)}/#{path}"
|
||||||
|
|
||||||
if env['REQUEST_METHOD'] == 'GET' && File.file?(filename)
|
if env['REQUEST_METHOD'] == 'GET' && File.file?(filename)
|
||||||
swagger = parse_file(filename)
|
swagger = load_json(filename)
|
||||||
@config.swagger_filter.call(swagger, env) unless @config.swagger_filter.nil?
|
@config.swagger_filter.call(swagger, env) unless @config.swagger_filter.nil?
|
||||||
mime = Rack::Mime.mime_type(::File.extname(path), 'text/plain')
|
|
||||||
body = unload_swagger(filename, swagger)
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'200',
|
'200',
|
||||||
{ 'Content-Type' => mime },
|
{ 'Content-Type' => 'application/json' },
|
||||||
[ body ]
|
[ JSON.dump(swagger) ]
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -33,29 +29,9 @@ module Rswag
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def parse_file(filename)
|
|
||||||
if /\.ya?ml$/ === filename
|
|
||||||
load_yaml(filename)
|
|
||||||
else
|
|
||||||
load_json(filename)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_yaml(filename)
|
|
||||||
YAML.safe_load(File.read(filename))
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_json(filename)
|
def load_json(filename)
|
||||||
JSON.parse(File.read(filename))
|
JSON.parse(File.read(filename))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unload_swagger(filename, swagger)
|
|
||||||
if /\.ya?ml$/ === filename
|
|
||||||
YAML.dump(swagger)
|
|
||||||
else
|
|
||||||
JSON.dump(swagger)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: API V1
|
|
||||||
version: v1
|
|
||||||
paths: {}
|
|
||||||
@@ -76,21 +76,6 @@ module Rswag
|
|||||||
expect(response[2].join).to include('"host":"tempuri.org"')
|
expect(response[2].join).to include('"host":"tempuri.org"')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when a path maps to a yaml swagger file' do
|
|
||||||
let(:env) { env_defaults.merge('PATH_INFO' => 'v1/swagger.yml') }
|
|
||||||
|
|
||||||
it 'returns a 200 status' do
|
|
||||||
expect(response.length).to eql(3)
|
|
||||||
expect(response.first).to eql('200')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns contents of the swagger file' do
|
|
||||||
expect(response.length).to eql(3)
|
|
||||||
expect(response[1]).to include( 'Content-Type' => 'text/yaml')
|
|
||||||
expect(response[2].join).to include('title: API V1')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ RSpec.configure do |config|
|
|||||||
# document below. You can override this behavior by adding a swagger_doc tag to the
|
# document below. You can override this behavior by adding a swagger_doc tag to the
|
||||||
# the root example_group in your specs, e.g. describe '...', swagger_doc: 'v2/swagger.json'
|
# the root example_group in your specs, e.g. describe '...', swagger_doc: 'v2/swagger.json'
|
||||||
config.swagger_docs = {
|
config.swagger_docs = {
|
||||||
'v1/swagger.yaml' => {
|
'v1/swagger.json' => {
|
||||||
openapi: '3.0.1',
|
swagger: '2.0',
|
||||||
info: {
|
info: {
|
||||||
title: 'API V1',
|
title: 'API V1',
|
||||||
version: 'v1'
|
version: 'v1'
|
||||||
@@ -22,10 +22,4 @@ RSpec.configure do |config|
|
|||||||
paths: {}
|
paths: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Specify the format of the output Swagger file when running 'rswag:specs:swaggerize'.
|
|
||||||
# The swagger_docs configuration option has the filename including format in
|
|
||||||
# the key, this may want to be changed to avoid putting yaml in json files.
|
|
||||||
# Defaults to json. Accepts ':json' and ':yaml'.
|
|
||||||
config.swagger_format = :yaml
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ module Rswag
|
|||||||
c.add_setting :swagger_root
|
c.add_setting :swagger_root
|
||||||
c.add_setting :swagger_docs
|
c.add_setting :swagger_docs
|
||||||
c.add_setting :swagger_dry_run
|
c.add_setting :swagger_dry_run
|
||||||
c.add_setting :swagger_format
|
|
||||||
c.extend ExampleGroupHelpers, type: :request
|
c.extend ExampleGroupHelpers, type: :request
|
||||||
c.include ExampleHelpers, type: :request
|
c.include ExampleHelpers, type: :request
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,14 +31,6 @@ module Rswag
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def swagger_format
|
|
||||||
@swagger_format ||= begin
|
|
||||||
@rspec_config.swagger_format = :json if @rspec_config.swagger_format.nil? || @rspec_config.swagger_format.empty?
|
|
||||||
raise ConfigurationError, "Unknown swagger_format '#{@rspec_config.swagger_format}'" unless [:json, :yaml].include?(@rspec_config.swagger_format)
|
|
||||||
@rspec_config.swagger_format
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_swagger_doc(name)
|
def get_swagger_doc(name)
|
||||||
return swagger_docs.values.first if name.nil?
|
return swagger_docs.values.first if name.nil?
|
||||||
raise ConfigurationError, "Unknown swagger_doc '#{name}'" unless swagger_docs[name]
|
raise ConfigurationError, "Unknown swagger_doc '#{name}'" unless swagger_docs[name]
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ module Rswag
|
|||||||
FileUtils.mkdir_p dirname unless File.exists?(dirname)
|
FileUtils.mkdir_p dirname unless File.exists?(dirname)
|
||||||
|
|
||||||
File.open(file_path, 'w') do |file|
|
File.open(file_path, 'w') do |file|
|
||||||
file.write(pretty_generate(doc))
|
file.write(JSON.pretty_generate(doc))
|
||||||
end
|
end
|
||||||
|
|
||||||
@output.puts "Swagger doc generated at #{file_path}"
|
@output.puts "Swagger doc generated at #{file_path}"
|
||||||
@@ -46,20 +46,6 @@ module Rswag
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def pretty_generate(doc)
|
|
||||||
if @config.swagger_format == :yaml
|
|
||||||
clean_doc = yaml_prepare(doc)
|
|
||||||
YAML.dump(clean_doc)
|
|
||||||
else # config errors are thrown in 'def swagger_format', no throw needed here
|
|
||||||
JSON.pretty_generate(doc)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def yaml_prepare(doc)
|
|
||||||
json_doc = JSON.pretty_generate(doc)
|
|
||||||
clean_doc = JSON.parse(json_doc)
|
|
||||||
end
|
|
||||||
|
|
||||||
def metadata_to_swagger(metadata)
|
def metadata_to_swagger(metadata)
|
||||||
response_code = metadata[:response][:code]
|
response_code = metadata[:response][:code]
|
||||||
response = metadata[:response].reject { |k,v| k == :code }
|
response = metadata[:response].reject { |k,v| k == :code }
|
||||||
|
|||||||
@@ -16,6 +16,3 @@ namespace :rswag do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
task :rswag => ['rswag:specs:swaggerize']
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ require 'generators/rswag/specs/install/install_generator'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe InstallGenerator do
|
describe InstallGenerator do
|
||||||
include GeneratorSpec::TestCase
|
include GeneratorSpec::TestCase
|
||||||
destination File.expand_path('../tmp', __FILE__)
|
destination File.expand_path('../tmp', __FILE__)
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ require 'rswag/specs/configuration'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe Configuration do
|
describe Configuration do
|
||||||
subject { described_class.new(rspec_config) }
|
subject { described_class.new(rspec_config) }
|
||||||
|
|
||||||
let(:rspec_config) do
|
let(:rspec_config) { OpenStruct.new(swagger_root: swagger_root, swagger_docs: swagger_docs) }
|
||||||
OpenStruct.new(swagger_root: swagger_root, swagger_docs: swagger_docs, swagger_format: swagger_format)
|
|
||||||
end
|
|
||||||
let(:swagger_root) { 'foobar' }
|
let(:swagger_root) { 'foobar' }
|
||||||
let(:swagger_docs) do
|
let(:swagger_docs) do
|
||||||
{
|
{
|
||||||
@@ -16,7 +14,6 @@ module Rswag
|
|||||||
'v2/swagger.json' => { info: { title: 'v2' } }
|
'v2/swagger.json' => { info: { title: 'v2' } }
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
let(:swagger_format) { :yaml }
|
|
||||||
|
|
||||||
describe '#swagger_root' do
|
describe '#swagger_root' do
|
||||||
let(:response) { subject.swagger_root }
|
let(:response) { subject.swagger_root }
|
||||||
@@ -49,26 +46,6 @@ module Rswag
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#swagger_format' do
|
|
||||||
let(:response) { subject.swagger_format }
|
|
||||||
|
|
||||||
context 'provided in rspec config' do
|
|
||||||
it { expect(response).to be_an_instance_of(Symbol) }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'unsupported format provided' do
|
|
||||||
let(:swagger_format) { :xml }
|
|
||||||
|
|
||||||
it { expect { response }.to raise_error ConfigurationError }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'not provided' do
|
|
||||||
let(:swagger_format) { nil }
|
|
||||||
|
|
||||||
it { expect(response).to eq(:json) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#get_swagger_doc(tag=nil)' do
|
describe '#get_swagger_doc(tag=nil)' do
|
||||||
let(:swagger_doc) { subject.get_swagger_doc(tag) }
|
let(:swagger_doc) { subject.get_swagger_doc(tag) }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rswag/specs/example_group_helpers'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe ExampleGroupHelpers do
|
describe ExampleGroupHelpers do
|
||||||
subject { double('example_group') }
|
subject { double('example_group') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rswag/specs/example_helpers'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe ExampleHelpers do
|
describe ExampleHelpers do
|
||||||
subject { double('example') }
|
subject { double('example') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rswag/specs/request_factory'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe RequestFactory do
|
describe RequestFactory do
|
||||||
subject { RequestFactory.new(config) }
|
subject { RequestFactory.new(config) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rswag/specs/response_validator'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe ResponseValidator do
|
describe ResponseValidator do
|
||||||
subject { ResponseValidator.new(config) }
|
subject { ResponseValidator.new(config) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ require 'ostruct'
|
|||||||
module Rswag
|
module Rswag
|
||||||
module Specs
|
module Specs
|
||||||
|
|
||||||
RSpec.describe SwaggerFormatter do
|
describe SwaggerFormatter do
|
||||||
subject { described_class.new(output, config) }
|
subject { described_class.new(output, config) }
|
||||||
|
|
||||||
# Mock out some infrastructure
|
# Mock out some infrastructure
|
||||||
@@ -53,30 +53,14 @@ module Rswag
|
|||||||
'v1/swagger.json' => { info: { version: 'v1' } },
|
'v1/swagger.json' => { info: { version: 'v1' } },
|
||||||
'v2/swagger.json' => { info: { version: 'v2' } }
|
'v2/swagger.json' => { info: { version: 'v2' } }
|
||||||
)
|
)
|
||||||
allow(config).to receive(:swagger_format).and_return(swagger_format)
|
|
||||||
subject.stop(notification)
|
subject.stop(notification)
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:notification) { double('notification') }
|
let(:notification) { double('notification') }
|
||||||
context 'with default format' do
|
|
||||||
let(:swagger_format) { :json }
|
|
||||||
|
|
||||||
it 'writes the swagger_doc(s) to file' do
|
it 'writes the swagger_doc(s) to file' do
|
||||||
expect(File).to exist("#{swagger_root}/v1/swagger.json")
|
expect(File).to exist("#{swagger_root}/v1/swagger.json")
|
||||||
expect(File).to exist("#{swagger_root}/v2/swagger.json")
|
expect(File).to exist("#{swagger_root}/v2/swagger.json")
|
||||||
expect { JSON.parse(File.read("#{swagger_root}/v2/swagger.json")) }.not_to raise_error
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with yaml format' do
|
|
||||||
let(:swagger_format) { :yaml }
|
|
||||||
|
|
||||||
it 'writes the swagger_doc(s) as yaml' do
|
|
||||||
expect(File).to exist("#{swagger_root}/v1/swagger.json")
|
|
||||||
expect { JSON.parse(File.read("#{swagger_root}/v1/swagger.json")) }.to raise_error(JSON::ParserError)
|
|
||||||
# Psych::DisallowedClass would be raised if we do not pre-process ruby symbols
|
|
||||||
expect { YAML.safe_load(File.read("#{swagger_root}/v1/swagger.json")) }.not_to raise_error
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
after do
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ Rswag::Ui.configure do |c|
|
|||||||
|
|
||||||
# List the Swagger endpoints that you want to be documented through the swagger-ui
|
# List the Swagger endpoints that you want to be documented through the swagger-ui
|
||||||
# The first parameter is the path (absolute or relative to the UI host) to the corresponding
|
# The first parameter is the path (absolute or relative to the UI host) to the corresponding
|
||||||
# endpoint and the second is a title that will be displayed in the document selector
|
# JSON endpoint and the second is a title that will be displayed in the document selector
|
||||||
# NOTE: If you're using rspec-api to expose Swagger files (under swagger_root) as JSON or YAML endpoints,
|
# NOTE: If you're using rspec-api to expose Swagger files (under swagger_root) as JSON endpoints,
|
||||||
# then the list below should correspond to the relative paths for those endpoints
|
# then the list below should correspond to the relative paths for those endpoints
|
||||||
|
|
||||||
c.swagger_endpoint '/api-docs/v1/swagger.yaml', 'API V1 Docs'
|
c.swagger_endpoint '/api-docs/v1/swagger.json', 'API V1 Docs'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.feature 'swagger-ui', js: true do
|
feature 'swagger-ui', js: true do
|
||||||
|
|
||||||
scenario 'browsing api-docs' do
|
scenario 'browsing api-docs' do
|
||||||
visit '/api-docs'
|
visit '/api-docs'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
require 'swagger_helper'
|
require 'swagger_helper'
|
||||||
|
|
||||||
RSpec.describe 'Auth Tests API', type: :request, swagger_doc: 'v1/swagger.json' do
|
describe 'Auth Tests API', type: :request, swagger_doc: 'v1/swagger.json' do
|
||||||
|
|
||||||
path '/auth-tests/basic' do
|
path '/auth-tests/basic' do
|
||||||
post 'Authenticates with basic auth' do
|
post 'Authenticates with basic auth' do
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
require 'swagger_helper'
|
require 'swagger_helper'
|
||||||
|
|
||||||
RSpec.describe 'Blogs API', type: :request, swagger_doc: 'v1/swagger.json' do
|
describe 'Blogs API', type: :request, swagger_doc: 'v1/swagger.json' do
|
||||||
let(:api_key) { 'fake_key' }
|
let(:api_key) { 'fake_key' }
|
||||||
|
|
||||||
path '/blogs' do
|
path '/blogs' do
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
require 'rake'
|
require 'rake'
|
||||||
|
|
||||||
RSpec.describe 'rswag:specs:swaggerize' do
|
describe 'rswag:specs:swaggerize' do
|
||||||
let(:swagger_root) { Rails.root.to_s + '/swagger' }
|
let(:swagger_root) { Rails.root.to_s + '/swagger' }
|
||||||
before do
|
before do
|
||||||
TestApp::Application.load_tasks
|
TestApp::Application.load_tasks
|
||||||
|
|||||||
Reference in New Issue
Block a user