apipie-rails 0.9.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 }