apipie-rails 0.9.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -14
  3. data/.rubocop_todo.yml +102 -213
  4. data/CHANGELOG.md +17 -6
  5. data/README.rst +12 -12
  6. data/app/controllers/apipie/apipies_controller.rb +4 -4
  7. data/lib/apipie/apipie_module.rb +4 -4
  8. data/lib/apipie/application.rb +70 -54
  9. data/lib/apipie/configuration.rb +19 -26
  10. data/lib/apipie/dsl_definition.rb +4 -5
  11. data/lib/apipie/extractor/collector.rb +2 -2
  12. data/lib/apipie/extractor.rb +1 -1
  13. data/lib/apipie/generator/config.rb +12 -0
  14. data/lib/apipie/generator/swagger/computed_interface_id.rb +23 -0
  15. data/lib/apipie/generator/swagger/config.rb +78 -0
  16. data/lib/apipie/generator/swagger/context.rb +12 -1
  17. data/lib/apipie/generator/swagger/method_description/api_decorator.rb +20 -0
  18. data/lib/apipie/generator/swagger/method_description/api_schema_service.rb +86 -0
  19. data/lib/apipie/generator/swagger/method_description/decorator.rb +22 -0
  20. data/lib/apipie/generator/swagger/method_description/parameters_service.rb +139 -0
  21. data/lib/apipie/generator/swagger/method_description/response_schema_service.rb +46 -0
  22. data/lib/apipie/generator/swagger/method_description/response_service.rb +58 -0
  23. data/lib/apipie/generator/swagger/method_description.rb +2 -0
  24. data/lib/apipie/generator/swagger/operation_id.rb +1 -1
  25. data/lib/apipie/generator/swagger/param_description/builder.rb +4 -4
  26. data/lib/apipie/generator/swagger/param_description/composite.rb +9 -1
  27. data/lib/apipie/generator/swagger/param_description/in.rb +1 -1
  28. data/lib/apipie/generator/swagger/param_description/path_params_composite.rb +61 -0
  29. data/lib/apipie/generator/swagger/param_description/referenced_composite.rb +36 -0
  30. data/lib/apipie/generator/swagger/param_description/type.rb +9 -2
  31. data/lib/apipie/generator/swagger/path_decorator.rb +36 -0
  32. data/lib/apipie/generator/swagger/referenced_definitions.rb +17 -0
  33. data/lib/apipie/generator/swagger/resource_description_collection.rb +30 -0
  34. data/lib/apipie/generator/swagger/resource_description_composite.rb +56 -0
  35. data/lib/apipie/generator/swagger/schema.rb +63 -0
  36. data/lib/apipie/generator/swagger/type_extractor.rb +0 -19
  37. data/lib/apipie/generator/swagger/warning.rb +3 -6
  38. data/lib/apipie/generator/swagger/warning_writer.rb +7 -1
  39. data/lib/apipie/method_description.rb +4 -2
  40. data/lib/apipie/param_description.rb +4 -2
  41. data/lib/apipie/resource_description.rb +1 -1
  42. data/lib/apipie/swagger_generator.rb +27 -551
  43. data/lib/apipie/validator.rb +7 -3
  44. data/lib/apipie/version.rb +1 -1
  45. data/lib/apipie-rails.rb +17 -0
  46. data/lib/tasks/apipie.rake +15 -10
  47. data/spec/controllers/api/v2/nested/resources_controller_spec.rb +2 -2
  48. data/spec/controllers/pets_controller_spec.rb +10 -16
  49. data/spec/controllers/users_controller_spec.rb +2 -2
  50. data/spec/dummy/app/controllers/pets_controller.rb +4 -4
  51. data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +2 -2
  52. data/spec/dummy/app/controllers/twitter_example_controller.rb +2 -2
  53. data/spec/dummy/app/controllers/users_controller.rb +5 -5
  54. data/spec/lib/apipie/application_spec.rb +16 -7
  55. data/spec/lib/apipie/configuration_spec.rb +15 -0
  56. data/spec/lib/apipie/generator/swagger/config_spec.rb +19 -0
  57. data/spec/lib/apipie/generator/swagger/context_spec.rb +22 -2
  58. data/spec/lib/apipie/generator/swagger/method_description/api_schema_service_spec.rb +106 -0
  59. data/spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb +105 -0
  60. data/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +1 -1
  61. data/spec/lib/apipie/generator/swagger/param_description/composite_spec.rb +2 -2
  62. data/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +7 -7
  63. data/spec/lib/apipie/generator/swagger/path_decorator_spec.rb +57 -0
  64. data/spec/lib/apipie/generator/swagger/referenced_definitions_spec.rb +35 -0
  65. data/spec/lib/apipie/generator/swagger/resource_description_composite_spec.rb +37 -0
  66. data/spec/lib/apipie/generator/swagger/resource_descriptions_collection_spec.rb +57 -0
  67. data/spec/lib/apipie/generator/swagger/schema_spec.rb +89 -0
  68. data/spec/lib/apipie/generator/swagger/type_extractor_spec.rb +0 -43
  69. data/spec/lib/apipie/generator/swagger/warning_spec.rb +1 -1
  70. data/spec/lib/apipie/generator/swagger/warning_writer_spec.rb +19 -7
  71. data/spec/lib/apipie/method_description_spec.rb +101 -66
  72. data/spec/lib/apipie/param_description_spec.rb +209 -49
  73. data/spec/lib/apipie/param_group_spec.rb +1 -0
  74. data/spec/lib/apipie/resource_description_spec.rb +1 -1
  75. data/spec/lib/apipie/swagger_generator_spec.rb +94 -0
  76. data/spec/lib/apipie/validator_spec.rb +47 -11
  77. data/spec/lib/swagger/rake_swagger_spec.rb +4 -4
  78. data/spec/lib/swagger/swagger_dsl_spec.rb +7 -7
  79. data/spec/lib/validators/array_validator_spec.rb +1 -1
  80. metadata +28 -2
@@ -195,10 +195,15 @@ namespace :apipie do
195
195
  end
196
196
 
197
197
  def generate_swagger_using_args(args, out)
198
- args.with_defaults(:version => Apipie.configuration.default_version,
199
- :swagger_content_type_input => Apipie.configuration.swagger_content_type_input || :form_data,
200
- :filename_suffix => nil)
201
- Apipie.configuration.swagger_content_type_input = args[:swagger_content_type_input].to_sym
198
+ args.with_defaults(
199
+ version: Apipie.configuration.default_version,
200
+ swagger_content_type_input: Apipie.configuration.generator.swagger.content_type_input,
201
+ filename_suffix: nil
202
+ )
203
+
204
+ Apipie.configuration.generator.swagger.content_type_input =
205
+ args[:swagger_content_type_input].to_sym
206
+
202
207
  count = 0
203
208
 
204
209
  sfx = args[:filename_suffix] || "_#{args[:swagger_content_type_input]}"
@@ -254,11 +259,11 @@ namespace :apipie do
254
259
  end
255
260
 
256
261
  def generate_resource_pages(version, file_base, doc, include_json = false, lang = nil)
257
- doc[:docs][:resources].each do |resource_name, _|
258
- resource_file_base = File.join(file_base, resource_name.to_s)
262
+ doc[:docs][:resources].each do |resource_id, _|
263
+ resource_file_base = File.join(file_base, resource_id.to_s)
259
264
  FileUtils.mkdir_p(File.dirname(resource_file_base)) unless File.exist?(File.dirname(resource_file_base))
260
265
 
261
- doc = Apipie.to_json(version, resource_name, nil, lang)
266
+ doc = Apipie.to_json(version, resource_id, nil, lang)
262
267
  doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
263
268
  render_page("#{resource_file_base}#{lang_ext(lang)}.html", "resource", {:doc => doc[:docs],
264
269
  :resource => doc[:docs][:resources].first, :language => lang, :languages => Apipie.configuration.languages})
@@ -267,12 +272,12 @@ namespace :apipie do
267
272
  end
268
273
 
269
274
  def generate_method_pages(version, file_base, doc, include_json = false, lang = nil)
270
- doc[:docs][:resources].each do |resource_name, resource_params|
275
+ doc[:docs][:resources].each do |resource_id, resource_params|
271
276
  resource_params[:methods].each do |method|
272
- method_file_base = File.join(file_base, resource_name.to_s, method[:name].to_s)
277
+ method_file_base = File.join(file_base, resource_id.to_s, method[:name].to_s)
273
278
  FileUtils.mkdir_p(File.dirname(method_file_base)) unless File.exist?(File.dirname(method_file_base))
274
279
 
275
- doc = Apipie.to_json(version, resource_name, method[:name], lang)
280
+ doc = Apipie.to_json(version, resource_id, method[:name], lang)
276
281
  doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
277
282
  render_page("#{method_file_base}#{lang_ext(lang)}.html", "method", {:doc => doc[:docs],
278
283
  :resource => doc[:docs][:resources].first,
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Api::V2::Nested::ResourcesController do
4
- describe "resource id" do
5
- subject { Apipie.get_resource_name(Api::V2::Nested::ResourcesController) }
4
+ describe '.get_resource_id' do
5
+ subject { Apipie.get_resource_id(Api::V2::Nested::ResourcesController) }
6
6
 
7
7
  it "should have resource_id set" do
8
8
  expect(subject).to eq("resource")
@@ -5,10 +5,6 @@ require 'apipie/rspec/response_validation_helper'
5
5
  require "json-schema"
6
6
 
7
7
  RSpec.describe PetsController, :type => :controller do
8
- before :each do
9
- Apipie.configuration.swagger_allow_additional_properties_in_response = false
10
- end
11
-
12
8
  it "does not raise error when rendered output matches the described response" do
13
9
  response = get :return_and_validate_expected_response, format: :json
14
10
  expect(response).to match_declared_responses
@@ -39,7 +35,7 @@ RSpec.describe PetsController, :type => :controller do
39
35
  expect(response).not_to match_declared_responses
40
36
  end
41
37
 
42
- it "raises error when a response has an extra property and 'swagger_allow_additional_properties_in_response' is false" do
38
+ it "raises error when a response has an extra property and 'swagger.allow_additional_properties_in_response' is false" do
43
39
  response = get :return_and_validate_extra_property, format: :json
44
40
  expect(response).not_to match_declared_responses
45
41
  end
@@ -50,26 +46,28 @@ RSpec.describe PetsController, :type => :controller do
50
46
  expect(response).not_to match_declared_responses
51
47
  end
52
48
 
53
- it "does not raise error when a response has an extra property and 'swagger_allow_additional_properties_in_response' is true" do
54
- Apipie.configuration.swagger_allow_additional_properties_in_response = true
55
- response = get :return_and_validate_extra_property, format: :json
56
- expect(response).to match_declared_responses
49
+ context "when allow_additional_properties_in_response is true'" do
50
+ before do
51
+ Apipie.configuration.generator.swagger.allow_additional_properties_in_response = true
52
+ end
53
+
54
+ it "does not raise error when a response has an extra property" do
55
+ response = get :return_and_validate_extra_property, format: :json
56
+ expect(response).to match_declared_responses
57
+ end
57
58
  end
58
59
 
59
60
  it "does not raise error when a response has an extra field and 'additional_properties' is specified in the response" do
60
- Apipie.configuration.swagger_allow_additional_properties_in_response = false
61
61
  response = get :return_and_validate_allowed_extra_property, format: :json
62
62
  expect(response).to match_declared_responses
63
63
  end
64
64
 
65
65
  it "raises error when a response sub-object has an extra field and 'additional_properties' is not specified on it, but specified on the top level of the response" do
66
- Apipie.configuration.swagger_allow_additional_properties_in_response = false
67
66
  response = get :sub_object_invalid_extra_property, format: :json
68
67
  expect(response).not_to match_declared_responses
69
68
  end
70
69
 
71
70
  it "does not raise error when a response sub-object has an extra field and 'additional_properties' is specified on it" do
72
- Apipie.configuration.swagger_allow_additional_properties_in_response = false
73
71
  response = get :sub_object_allowed_extra_property, format: :json
74
72
  expect(response).to match_declared_responses
75
73
  end
@@ -86,7 +84,6 @@ RSpec.describe PetsController, :type => :controller do
86
84
 
87
85
  end
88
86
 
89
-
90
87
  describe "with array field" do
91
88
  it "no error for valid response" do
92
89
  response = get :returns_response_with_valid_array, format: :json
@@ -98,7 +95,4 @@ RSpec.describe PetsController, :type => :controller do
98
95
  expect(response).not_to match_declared_responses
99
96
  end
100
97
  end
101
-
102
-
103
-
104
98
  end
@@ -412,7 +412,7 @@ describe UsersController do
412
412
  expect(b.resource._id).to eq('users')
413
413
 
414
414
  expect(b.apis.count).to eq(1)
415
- expect(b.formats).to eq(['json', 'jsonp'])
415
+ expect(b.formats).to eq(%w[json jsonp])
416
416
  api = b.apis.first
417
417
  expect(api.short_description).to eq("Show user profile")
418
418
  expect(api.path).to eq("/users/:id")
@@ -708,7 +708,7 @@ EOS2
708
708
  param = a.params[:array_param]
709
709
  expect(param.desc).to eq("\n<p>array validator</p>\n")
710
710
  expect(param.validator.class).to be(Apipie::Validator::EnumValidator)
711
- expect(param.validator.instance_variable_get("@array")).to eq(["100", "one", "two", "1", "2"])
711
+ expect(param.validator.instance_variable_get("@array")).to eq(%w[100 one two 1 2])
712
712
 
713
713
  param = a.params[:proc_param]
714
714
  expect(param.desc).to eq("\n<p>proc validator</p>\n")
@@ -24,7 +24,7 @@ class PetsController < ApplicationController
24
24
  api :GET, "/pets/:id/as_properties", "Get a pet record"
25
25
  returns :code => 200 do
26
26
  property :pet_name, String, :desc => "Name of pet", :required => false
27
- property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # required by default, because this is a 'property'
27
+ property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # required by default, because this is a 'property'
28
28
  end
29
29
  returns :code => 404 do
30
30
  property :another_error_message, String, :desc => "Overriding the response description from the Pets resource"
@@ -40,7 +40,7 @@ class PetsController < ApplicationController
40
40
  #-----------------------------------------------------------
41
41
  def_param_group :pet do
42
42
  property :pet_name, String, :desc => "Name of pet", :required => false
43
- property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # required by default, because this is a 'property'
43
+ property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # required by default, because this is a 'property'
44
44
  end
45
45
 
46
46
  api :GET, "/pets/:id/as_param_group_of_properties", "Get a pet record"
@@ -70,7 +70,7 @@ class PetsController < ApplicationController
70
70
  param :pet_id, Integer, :desc => "id of pet", :required => true
71
71
  param :pet_name, String, :desc => "Name of pet", :required => false, :only_in => :response
72
72
  param :partial_match_allowed, [true, false], :desc => "Partial match allowed?", :required => false, :only_in => :request
73
- property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # this is implicitly :only_in => :response
73
+ property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # this is implicitly :only_in => :response
74
74
  end
75
75
 
76
76
  api :GET, "/pets/pet_by_id", "Get a pet record with the pet id in the body of the request"
@@ -142,7 +142,7 @@ class PetsController < ApplicationController
142
142
  end
143
143
  returns :code => 204 do
144
144
  property :int_array, :array_of => Integer
145
- property :enum_array, :array_of => ['v1','v2','v3']
145
+ property :enum_array, :array_of => %w[v1 v2 v3]
146
146
  end
147
147
  returns :code => :unprocessable_entity, :desc => "Fleas were discovered on the pet" do
148
148
  param_group :pet
@@ -14,7 +14,7 @@ class Pet
14
14
  def self.describe_own_properties
15
15
  [
16
16
  Apipie::prop(:pet_name, 'string', {:description => 'Name of pet', :required => false}),
17
- Apipie::prop(:animal_type, 'string', {:description => 'Type of pet', :values => ["dog", "cat", "iguana", "kangaroo"]}),
17
+ Apipie::prop(:animal_type, 'string', {:description => 'Type of pet', :values => %w[dog cat iguana kangaroo]}),
18
18
  Apipie::additional_properties(false)
19
19
  ]
20
20
  end
@@ -27,7 +27,7 @@ class PetWithMeasurements
27
27
  def self.describe_own_properties
28
28
  [
29
29
  Apipie::prop(:pet_name, 'string', {:description => 'Name of pet', :required => false}),
30
- Apipie::prop('animal_type', 'string', {:description => 'Type of pet', :values => ["dog", "cat", "iguana", "kangaroo"]}),
30
+ Apipie::prop('animal_type', 'string', {:description => 'Type of pet', :values => %w[dog cat iguana kangaroo]}),
31
31
  Apipie::prop(:pet_measurements, 'object', {}, [
32
32
  Apipie::prop(:weight, 'number', {:description => "Weight in pounds" }),
33
33
  Apipie::prop(:height, 'number', {:description => "Height in inches" }),
@@ -31,7 +31,7 @@ class TwitterExampleController < ApplicationController
31
31
 
32
32
  api :GET, '/twitter_example/profile_image/:screen_name', 'Access the profile image in various sizes for the user with the indicated screen_name.'
33
33
  param :screen_name, String, :required => true, :desc => 'The screen name of the user for whom to return results for. Helpful for disambiguating when a valid screen name is also a user ID.'
34
- param :size, ['bigger','normal','mini','original'], :desc => <<-EOS
34
+ param :size, %w[bigger normal mini original], :desc => <<-EOS
35
35
  Specifies the size of image to fetch. Not specifying a size will give the default, normal size of 48px by 48px. Valid options include:
36
36
 
37
37
  * bigger - 73px by 73px
@@ -166,7 +166,7 @@ class TwitterExampleController < ApplicationController
166
166
  param :user_id, Integer, :desc => 'The ID of the user for whom to return results for. Helpful for disambiguating when a valid user ID is also a valid screen name.'
167
167
  param :screen_name, String, :desc => 'The screen name of the user for whom to return results for. Helpful for disambiguating when a valid screen name is also a user ID.'
168
168
  param :include_entities, String
169
- param :skip_status, ['t','true','1'],
169
+ param :skip_status, %w[t true 1],
170
170
  :description => 'When set to either true, t or 1 statuses will not be included in the returned user objects.'
171
171
 
172
172
  description "Look at examples."
@@ -170,14 +170,14 @@ class UsersController < ApplicationController
170
170
  eos
171
171
  api :GET, "/users/:id", "Show user profile"
172
172
  show false
173
- formats ['json', 'jsonp']
173
+ formats %w[json jsonp]
174
174
  error 401, "Unauthorized"
175
175
  error :code => 404, :description => "Not Found"
176
176
  param :id, Integer, :desc => "user id", :required => true
177
177
  param :session, String, :desc => "user is logged in", :required => true, :missing_message => lambda { "session_parameter_is_required" }
178
178
  param :regexp_param, /^[0-9]* years/, :desc => "regexp param"
179
179
  param :regexp2, /\b[A-Z0-9._%+-=]+@[A-Z0-9.-]+.[A-Z]{2,}\b/i, :desc => "email regexp"
180
- param :array_param, ["100", "one", "two", "1", "2"], :desc => "array validator"
180
+ param :array_param, %w[100 one two 1 2], :desc => "array validator"
181
181
  param :boolean_param, [true, false], :desc => "array validator with boolean"
182
182
  param :proc_param, lambda { |val|
183
183
  val == "param value" ? true : "The only good value is 'param value'."
@@ -211,7 +211,7 @@ class UsersController < ApplicationController
211
211
  def_param_group :user do
212
212
  param :user, Hash, :desc => "User info", :required => true, :action_aware => true do
213
213
  param_group :credentials
214
- param :membership, ["standard","premium"], :desc => "User membership", :allow_nil => false
214
+ param :membership, %w[standard premium], :desc => "User membership", :allow_nil => false
215
215
  end
216
216
  end
217
217
 
@@ -269,13 +269,13 @@ class UsersController < ApplicationController
269
269
  end
270
270
 
271
271
  api :GET, '/users/by_department', 'show users from a specific department'
272
- param :department, ["finance", "operations", "sales", "marketing", "HR"], required: false, default_value: "sales"
272
+ param :department, %w[finance operations sales marketing HR], required: false, default_value: "sales"
273
273
  def get_by_department
274
274
  render :plain => 'nothing to see here'
275
275
  end
276
276
 
277
277
  api :GET, '/users/in_departments', 'show users from specific departments'
278
- param :departments, Array, in: ["finance", "operations", "sales", "marketing", "HR"], default_value: ['sales']
278
+ param :departments, Array, in: %w[finance operations sales marketing HR], default_value: ['sales']
279
279
  def get_in_departments
280
280
  render :plain => 'nothing to see here'
281
281
  end
@@ -16,14 +16,11 @@ describe Apipie::Application do
16
16
 
17
17
  end
18
18
 
19
- describe '.get_resource_name' do
20
- subject(:get_resource_name) do
21
- Apipie.get_resource_name(Api::V2::Nested::ArchitecturesController)
22
- end
23
-
19
+ shared_examples 'resource id' do
20
+ let(:resource_class) { Api::V2::Nested::ArchitecturesController }
24
21
  let(:base_url) { '/some-api' }
25
22
 
26
- before { allow(Apipie.app).to receive(:get_base_url).and_return(base_url) }
23
+ before { allow(described_class).to receive(:get_base_url).and_return(base_url) }
27
24
 
28
25
  context "with namespaced_resources enabled" do
29
26
  before { Apipie.configuration.namespaced_resources = true }
@@ -37,7 +34,7 @@ describe Apipie::Application do
37
34
  let(:base_url) { nil }
38
35
 
39
36
  it "should not raise an error" do
40
- expect { get_resource_name }.not_to raise_error
37
+ expect { method_call }.not_to raise_error
41
38
  end
42
39
  end
43
40
  end
@@ -50,4 +47,16 @@ describe Apipie::Application do
50
47
  end
51
48
  end
52
49
  end
50
+
51
+ describe '.get_resource_id' do
52
+ subject(:method_call) { Apipie.get_resource_id(resource_class) }
53
+
54
+ it_behaves_like 'resource id'
55
+ end
56
+
57
+ describe '.get_resource_name' do
58
+ subject(:method_call) { Apipie.get_resource_name(resource_class) }
59
+
60
+ it_behaves_like 'resource id'
61
+ end
53
62
  end
@@ -20,4 +20,19 @@ describe 'Apipie::Configuration' do
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ describe 'generator configuration' do
25
+ let(:generator_config) { configuration.generator }
26
+
27
+ describe '#swagger' do
28
+ subject(:setter) { generator_config.swagger.include_warning_tags = true }
29
+
30
+ it 'assigns the correct value' do
31
+ expect { setter }
32
+ .to change(configuration.generator.swagger, :include_warning_tags?)
33
+ .from(false)
34
+ .to(true)
35
+ end
36
+ end
37
+ end
23
38
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Apipie::Generator::Swagger::Config do
4
+ let(:config) { described_class.clone.instance }
5
+
6
+ before { Singleton.__init__(described_class) }
7
+
8
+ describe 'deprecation warnings' do
9
+ context 'when a deprecated method is call' do
10
+ subject(:deprecated_method_call) { config.swagger_include_warning_tags? }
11
+
12
+ it 'returns a deprecations warning' do
13
+ expect { deprecated_method_call }
14
+ .to output(/DEPRECATION WARNING: config.swagger_include_warning_tags is deprecated/)
15
+ .to_stderr
16
+ end
17
+ end
18
+ end
19
+ end
@@ -4,17 +4,21 @@ describe Apipie::Generator::Swagger::Context do
4
4
  let(:allow_null) { true }
5
5
  let(:in_schema) { true }
6
6
  let(:http_method) { 'get' }
7
+ let(:prefix) { nil }
7
8
 
8
- subject do
9
+ let(:context_instance) do
9
10
  described_class.new(
10
11
  allow_null: allow_null,
11
12
  http_method: http_method,
12
13
  in_schema: in_schema,
13
- controller_method: 'show'
14
+ controller_method: 'show',
15
+ prefix: prefix
14
16
  )
15
17
  end
16
18
 
17
19
  describe '#in_schema?' do
20
+ subject { context_instance }
21
+
18
22
  it { is_expected.to be_in_schema }
19
23
 
20
24
  context 'when in_schema is false' do
@@ -25,6 +29,8 @@ describe Apipie::Generator::Swagger::Context do
25
29
  end
26
30
 
27
31
  describe '#allow_null?' do
32
+ subject { context_instance }
33
+
28
34
  it { is_expected.to be_allow_null }
29
35
 
30
36
  context 'when allow_null is false' do
@@ -33,4 +39,18 @@ describe Apipie::Generator::Swagger::Context do
33
39
  it { is_expected.not_to be_allow_null }
34
40
  end
35
41
  end
42
+
43
+ describe '#add_to_prefix!' do
44
+ before { context_instance.add_to_prefix!('some-prefix') }
45
+
46
+ subject { context_instance.prefix }
47
+
48
+ it { is_expected.to eq('some-prefix') }
49
+
50
+ context 'when context has already a prefix' do
51
+ let(:prefix) { 'existing-prefix' }
52
+
53
+ it { is_expected.to eq('existing-prefix[some-prefix]') }
54
+ end
55
+ end
36
56
  end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Apipie::Generator::Swagger::MethodDescription::ApiSchemaService do
4
+ let(:path) { '/api' }
5
+ let(:http_method) { 'get' }
6
+ let(:resource_id) { 'users' }
7
+ let(:method_description_description) { nil }
8
+ let(:tags) { [] }
9
+
10
+ let(:dsl_data) do
11
+ ActionController::Base
12
+ .send(:_apipie_dsl_data_init)
13
+ .merge(
14
+ {
15
+ description: method_description_description,
16
+ api_args: [[http_method, path, 'Some api description', { deprecated: true }]],
17
+ tag_list: tags
18
+ }
19
+ )
20
+ end
21
+
22
+ let(:resource_desc) do
23
+ Apipie::ResourceDescription.new(UsersController, resource_id)
24
+ end
25
+
26
+ let(:method_description) do
27
+ Apipie::Generator::Swagger::MethodDescription::Decorator.new(
28
+ Apipie::MethodDescription.new(:show, resource_desc, dsl_data)
29
+ )
30
+ end
31
+
32
+ let(:service) { described_class.new(method_description) }
33
+
34
+ describe '#call' do
35
+ subject(:schema) { service.call }
36
+
37
+ it 'returns the path' do
38
+ expect(schema).to include(path)
39
+ end
40
+
41
+ it 'returns the http method' do
42
+ expect(schema[path]).to include(http_method)
43
+ end
44
+
45
+ it 'returns the correct attributes' do
46
+ expect(schema[path][http_method].keys).to include(
47
+ :tags,
48
+ :consumes,
49
+ :operationId,
50
+ :parameters,
51
+ :responses
52
+ )
53
+ end
54
+ end
55
+
56
+ describe 'tags' do
57
+ subject { service.call[path][http_method][:tags] }
58
+
59
+ it { is_expected.to eq([resource_id]) }
60
+
61
+ context 'when tags are available' do
62
+ let(:tags) { ['Tag 1', 'Tag 2'] }
63
+
64
+ it { is_expected.to include(*tags) }
65
+ end
66
+
67
+ context 'when Apipie.configuration.generator.swagger.include_warning_tags is enabled' do
68
+ before { Apipie.configuration.generator.swagger.include_warning_tags = true }
69
+
70
+ context 'when warnings are issued' do
71
+ before do
72
+ Apipie::Generator::Swagger::Warning.for_code(
73
+ Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE,
74
+ 'some_method'
75
+ ).warn_through_writer
76
+ end
77
+
78
+ it { is_expected.to include('warnings issued') }
79
+ end
80
+ end
81
+ end
82
+
83
+ describe 'consumes' do
84
+ subject { service.call[path]['get'][:consumes] }
85
+
86
+ it { is_expected.to eq(['application/x-www-form-urlencoded', 'multipart/form-data']) }
87
+
88
+ context 'when content type input is json' do
89
+ before { Apipie.configuration.generator.swagger.content_type_input = :json }
90
+
91
+ it { is_expected.to eq(['application/json']) }
92
+ end
93
+ end
94
+
95
+ describe 'description' do
96
+ subject { service.call[path]['get'][:description] }
97
+
98
+ it { is_expected.to be_blank }
99
+
100
+ context 'when description for method description exists' do
101
+ let(:method_description_description) { 'Some description' }
102
+
103
+ it { is_expected.to eq(method_description_description) }
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ describe Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService do
4
+ let(:http_method) { nil }
5
+ let(:controller_method) { nil }
6
+ let(:allow_null) { false }
7
+
8
+ let(:resource_description) do
9
+ Apipie::ResourceDescription.new(PetsController, 'pets')
10
+ end
11
+
12
+ let(:method_description) do
13
+ Apipie::MethodDescription.new(
14
+ 'create',
15
+ resource_description,
16
+ ActionController::Base.send(:_apipie_dsl_data_init)
17
+ )
18
+ end
19
+
20
+ let(:response_description_dsl) do
21
+ proc do
22
+ property :a_number, Integer
23
+ property :an_optional_number, Integer, required: false
24
+ end
25
+ end
26
+
27
+ let(:options) { {} }
28
+
29
+ let(:response_description) do
30
+ Apipie::ResponseDescription.new(
31
+ method_description,
32
+ 204,
33
+ options,
34
+ PetsController,
35
+ response_description_dsl,
36
+ nil
37
+ )
38
+ end
39
+
40
+ let(:service) do
41
+ described_class.new(
42
+ response_description,
43
+ allow_null: allow_null,
44
+ http_method: http_method,
45
+ controller_method: controller_method
46
+ )
47
+ end
48
+
49
+ describe '#to_swagger' do
50
+ let(:swagger_response) { service.to_swagger }
51
+
52
+ describe 'properties' do
53
+ subject(:properties) { swagger_response[:properties] }
54
+
55
+ it 'returns correct properties' do
56
+ expect(properties).to eq(
57
+ {
58
+ a_number: {
59
+ type: 'number'
60
+ },
61
+ an_optional_number: {
62
+ type: 'number'
63
+ }
64
+ }
65
+ )
66
+ end
67
+
68
+ context 'when nulls are allowed' do
69
+ let(:allow_null) { true }
70
+
71
+ it 'returns correct properties' do
72
+ expect(properties).to eq(
73
+ {
74
+ a_number: {
75
+ type: %w[number null]
76
+ },
77
+ an_optional_number: {
78
+ type: %w[number null]
79
+ }
80
+ }
81
+ )
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'when responses_use_refs is set to true' do
87
+ subject(:response) { swagger_response }
88
+
89
+ before { Apipie.configuration.generator.swagger.responses_use_refs = true }
90
+ after { Apipie.configuration.generator.swagger.responses_use_refs = false }
91
+
92
+ context 'when typename is given' do
93
+ let(:options) { { param_group: :some_param_group } }
94
+
95
+ it 'returns the reference' do
96
+ expect(response).to eq(
97
+ {
98
+ '$ref' => '#/definitions/some_param_group'
99
+ }
100
+ )
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -10,7 +10,7 @@ describe Apipie::Generator::Swagger::ParamDescription::Builder do
10
10
  described_class.new(
11
11
  param_description,
12
12
  in_schema: in_schema,
13
- controller_method: 'show'
13
+ controller_method: method_desc
14
14
  )
15
15
  end
16
16
  let(:generated_block) { builder.to_swagger }
@@ -13,7 +13,7 @@ describe Apipie::Generator::Swagger::ParamDescription::Composite do
13
13
  Apipie::Generator::Swagger::Context.new(
14
14
  allow_null: true,
15
15
  http_method: 'get',
16
- controller_method: 'show'
16
+ controller_method: method_description
17
17
  )
18
18
  end
19
19
 
@@ -50,7 +50,7 @@ describe Apipie::Generator::Swagger::ParamDescription::Composite do
50
50
 
51
51
  context 'when additional properties in response allowed' do
52
52
  before do
53
- Apipie.configuration.swagger_allow_additional_properties_in_response = true
53
+ Apipie.configuration.generator.swagger.allow_additional_properties_in_response = true
54
54
  end
55
55
 
56
56
  it { is_expected.to be_blank }