api-tester 0.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +15 -0
  3. data/.github/workflows/push.yml +39 -0
  4. data/.github/workflows/test.yml +31 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +61 -0
  7. data/Gemfile +2 -0
  8. data/Guardfile +70 -0
  9. data/README.md +106 -74
  10. data/Rakefile +8 -3
  11. data/api-tester.gemspec +31 -23
  12. data/changelog.txt +35 -0
  13. data/lib/api-tester.rb +15 -0
  14. data/lib/api-tester/config.rb +43 -0
  15. data/lib/api-tester/definition/boundary_case.rb +16 -0
  16. data/lib/api-tester/definition/contract.rb +20 -0
  17. data/lib/api-tester/definition/endpoint.rb +84 -0
  18. data/lib/api-tester/definition/fields/array_field.rb +47 -0
  19. data/lib/api-tester/definition/fields/boolean_field.rb +23 -0
  20. data/lib/api-tester/definition/fields/email_field.rb +25 -0
  21. data/lib/api-tester/definition/fields/enum_field.rb +32 -0
  22. data/lib/api-tester/definition/fields/field.rb +50 -0
  23. data/lib/api-tester/definition/fields/number_field.rb +22 -0
  24. data/lib/api-tester/definition/fields/object_field.rb +47 -0
  25. data/lib/api-tester/definition/fields/plain_array_field.rb +25 -0
  26. data/lib/api-tester/definition/method.rb +22 -0
  27. data/lib/api-tester/definition/request.rb +96 -0
  28. data/lib/api-tester/definition/response.rb +39 -0
  29. data/lib/api-tester/method_case_test.rb +83 -0
  30. data/lib/api-tester/modules/extra_verbs.rb +53 -0
  31. data/lib/api-tester/modules/format.rb +47 -0
  32. data/lib/api-tester/modules/good_case.rb +46 -0
  33. data/lib/api-tester/modules/injection_module.rb +81 -0
  34. data/lib/api-tester/modules/required_fields.rb +51 -0
  35. data/lib/api-tester/modules/server_information.rb +42 -0
  36. data/lib/api-tester/modules/typo.rb +70 -0
  37. data/lib/api-tester/modules/unexpected_fields.rb +61 -0
  38. data/lib/api-tester/modules/unused_fields.rb +31 -0
  39. data/lib/api-tester/reporter/api_report.rb +47 -0
  40. data/lib/api-tester/reporter/missing_field_report.rb +24 -0
  41. data/lib/api-tester/reporter/report.rb +30 -0
  42. data/lib/api-tester/reporter/status_code_report.rb +21 -0
  43. data/lib/api-tester/test_helper.rb +12 -0
  44. data/lib/api-tester/util/response_evaluator.rb +88 -0
  45. data/lib/api-tester/util/supported_verbs.rb +39 -0
  46. data/lib/api-tester/version.rb +5 -0
  47. metadata +159 -42
  48. data/.travis.yml +0 -6
  49. data/lib/tester.rb +0 -7
  50. data/lib/tester/api_tester.rb +0 -50
  51. data/lib/tester/definition/api_contract.rb +0 -13
  52. data/lib/tester/definition/api_method.rb +0 -11
  53. data/lib/tester/definition/boundary_case.rb +0 -11
  54. data/lib/tester/definition/endpoint.rb +0 -57
  55. data/lib/tester/definition/fields/array_field.rb +0 -44
  56. data/lib/tester/definition/fields/boolean_field.rb +0 -18
  57. data/lib/tester/definition/fields/email_field.rb +0 -20
  58. data/lib/tester/definition/fields/enum_field.rb +0 -27
  59. data/lib/tester/definition/fields/field.rb +0 -47
  60. data/lib/tester/definition/fields/number_field.rb +0 -17
  61. data/lib/tester/definition/fields/object_field.rb +0 -42
  62. data/lib/tester/definition/request.rb +0 -49
  63. data/lib/tester/definition/response.rb +0 -34
  64. data/lib/tester/method_case_test.rb +0 -67
  65. data/lib/tester/modules/extra_verbs.rb +0 -25
  66. data/lib/tester/modules/format.rb +0 -26
  67. data/lib/tester/modules/good_case.rb +0 -29
  68. data/lib/tester/modules/module.rb +0 -18
  69. data/lib/tester/modules/typo.rb +0 -41
  70. data/lib/tester/modules/unused_fields.rb +0 -22
  71. data/lib/tester/reporter/api_report.rb +0 -33
  72. data/lib/tester/reporter/missing_field_report.rb +0 -23
  73. data/lib/tester/reporter/missing_response_field_report.rb +0 -19
  74. data/lib/tester/reporter/report.rb +0 -25
  75. data/lib/tester/reporter/status_code_report.rb +0 -12
  76. data/lib/tester/test_helper.rb +0 -10
  77. data/lib/tester/util/response_evaluator.rb +0 -73
  78. data/lib/tester/util/supported_verbs.rb +0 -34
  79. data/lib/tester/version.rb +0 -3
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'api-tester/reporter/report'
4
+
5
+ module ApiTester
6
+ # Report for when status code is different than expected
7
+ class StatusCodeReport < Report
8
+ attr_accessor :expected_status_code
9
+ attr_accessor :actual_status_code
10
+
11
+ def initialize(description:, url:, request:, expected_status_code:, actual_status_code:)
12
+ super description: description,
13
+ url: url,
14
+ request: request,
15
+ expected_response: expected_status_code,
16
+ actual_response: actual_status_code
17
+ self.expected_status_code = expected_status_code
18
+ self.actual_status_code = actual_status_code
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApiTester
4
+ # Interface for when things need to be done before or after an api call
5
+ class TestHelper
6
+ def before; end
7
+
8
+ def retrieve_param(key); end
9
+
10
+ def after; end
11
+ end
12
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApiTester
4
+ # Class for evaluating responses against what is expected
5
+ class ResponseEvaluator
6
+ attr_accessor :response_body
7
+ attr_accessor :expected_response
8
+
9
+ def initialize(actual_body:, expected_fields:)
10
+ self.response_body = actual_body
11
+ self.expected_response = expected_fields
12
+ end
13
+
14
+ def response_field_array
15
+ field_array response_body
16
+ end
17
+
18
+ def expected_fields
19
+ expected_fields_hash.keys
20
+ end
21
+
22
+ def seen_fields
23
+ seen = []
24
+ fields = response_field_array - extra_fields
25
+ expected = expected_fields_hash
26
+ fields.each do |field_key|
27
+ seen << expected[field_key]
28
+ end
29
+ seen
30
+ end
31
+
32
+ def expected_fields_hash
33
+ expected_field_array expected_response.body
34
+ end
35
+
36
+ def extra_fields
37
+ response_field_array - expected_fields
38
+ end
39
+
40
+ def missing_fields
41
+ expected_fields - response_field_array
42
+ end
43
+
44
+ def expected_field_array(expected_fields)
45
+ fields = {}
46
+ expected_fields.each do |field|
47
+ fields[field.name] = field
48
+ fields = fields.merge inner_expected_field(expected_fields: field.fields,
49
+ name: field.name)
50
+ end
51
+ fields
52
+ end
53
+
54
+ def inner_expected_field(expected_fields:, name:)
55
+ fields = {}
56
+ expected_fields.each do |field|
57
+ inner_name = "#{name}.#{field.name}"
58
+ fields[inner_name] = field
59
+ fields = fields.merge inner_expected_field(expected_fields: field.fields,
60
+ name: inner_name)
61
+ end
62
+ fields
63
+ end
64
+
65
+ def field_array(object)
66
+ fields = []
67
+
68
+ object.each do |key, value|
69
+ if key.respond_to?('each')
70
+ fields.concat(field_array(key))
71
+ elsif value == nil || value == 0 || value == false
72
+ fields << key.to_s
73
+ fields.concat(field_array(value).map { |i| "#{key}.#{i}" })
74
+ elsif value.to_s[0] == '[' && value.to_s[-1] == ']' && !value.to_s.include?('=>')
75
+ fields << key.to_s
76
+ elsif value
77
+ fields << key.to_s
78
+ fields.concat(field_array(value).map { |i| "#{key}.#{i}" })
79
+ else
80
+ fields.concat(field_array(key))
81
+ end
82
+ end
83
+ fields
84
+ rescue NoMethodError
85
+ fields
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApiTester
4
+ # Class defining the verbs this tool supports
5
+ class SupportedVerbs
6
+ def self.add_item(key, value)
7
+ @hash ||= {}
8
+ @hash[key] = value
9
+ end
10
+
11
+ def self.const_missing(key)
12
+ @hash[key]
13
+ end
14
+
15
+ def self.each
16
+ @hash.each { |key, value| yield(key, value) }
17
+ end
18
+
19
+ def self.all
20
+ @hash.values
21
+ end
22
+
23
+ SupportedVerbs.add_item :COPY, :copy
24
+ SupportedVerbs.add_item :DELETE, :delete
25
+ SupportedVerbs.add_item :GET, :get
26
+ SupportedVerbs.add_item :HEAD, :head
27
+ SupportedVerbs.add_item :LOCK, :lock
28
+ SupportedVerbs.add_item :MKCOL, :mkcol
29
+ SupportedVerbs.add_item :MOVE, :move
30
+ SupportedVerbs.add_item :OPTIONS, :options
31
+ SupportedVerbs.add_item :PATCH, :patch
32
+ SupportedVerbs.add_item :POST, :post
33
+ SupportedVerbs.add_item :PROPFIND, :propfind
34
+ SupportedVerbs.add_item :PROPPATCH, :proppatch
35
+ SupportedVerbs.add_item :PUT, :put
36
+ SupportedVerbs.add_item :TRACE, :trace
37
+ SupportedVerbs.add_item :UNLOCK, :unlock
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApiTester
4
+ VERSION = '1.1.1'
5
+ end
metadata CHANGED
@@ -1,43 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-tester
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - arane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-22 00:00:00.000000000 Z
11
+ date: 2020-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler-audit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 4.7.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
16
51
  requirements:
17
52
  - - "~>"
18
53
  - !ruby/object:Gem::Version
19
- version: '1.13'
54
+ version: 4.7.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.11'
20
62
  type: :development
21
63
  prerelease: false
22
64
  version_requirements: !ruby/object:Gem::Requirement
23
65
  requirements:
24
66
  - - "~>"
25
67
  - !ruby/object:Gem::Version
26
- version: '1.13'
68
+ version: '0.11'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: rake
29
71
  requirement: !ruby/object:Gem::Requirement
30
72
  requirements:
31
73
  - - "~>"
32
74
  - !ruby/object:Gem::Version
33
- version: '10.0'
75
+ version: 13.0.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 13.0.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: require_all
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.0.0
34
90
  type: :development
35
91
  prerelease: false
36
92
  version_requirements: !ruby/object:Gem::Requirement
37
93
  requirements:
38
94
  - - "~>"
39
95
  - !ruby/object:Gem::Version
40
- version: '10.0'
96
+ version: 3.0.0
41
97
  - !ruby/object:Gem::Dependency
42
98
  name: rspec
43
99
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +108,48 @@ dependencies:
52
108
  - - "~>"
53
109
  - !ruby/object:Gem::Version
54
110
  version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.93.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.93.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: terminal-notifier
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 2.0.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 2.0.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: terminal-notifier-guard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.7.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.7.0
55
153
  - !ruby/object:Gem::Dependency
56
154
  name: webmock
57
155
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +164,20 @@ dependencies:
66
164
  - - "~>"
67
165
  - !ruby/object:Gem::Version
68
166
  version: '3.4'
167
+ - !ruby/object:Gem::Dependency
168
+ name: injection_vulnerability_library
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.0.2
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 0.0.2
69
181
  - !ruby/object:Gem::Dependency
70
182
  name: rest-client
71
183
  requirement: !ruby/object:Gem::Requirement
@@ -88,10 +200,14 @@ executables: []
88
200
  extensions: []
89
201
  extra_rdoc_files: []
90
202
  files:
203
+ - ".github/dependabot.yml"
204
+ - ".github/workflows/push.yml"
205
+ - ".github/workflows/test.yml"
91
206
  - ".gitignore"
92
207
  - ".rspec"
93
- - ".travis.yml"
208
+ - ".rubocop.yml"
94
209
  - Gemfile
210
+ - Guardfile
95
211
  - LICENSE.txt
96
212
  - README.md
97
213
  - Rakefile
@@ -99,42 +215,44 @@ files:
99
215
  - bin/console
100
216
  - bin/setup
101
217
  - changelog.txt
102
- - lib/tester.rb
103
- - lib/tester/api_tester.rb
104
- - lib/tester/definition/api_contract.rb
105
- - lib/tester/definition/api_method.rb
106
- - lib/tester/definition/boundary_case.rb
107
- - lib/tester/definition/endpoint.rb
108
- - lib/tester/definition/fields/array_field.rb
109
- - lib/tester/definition/fields/boolean_field.rb
110
- - lib/tester/definition/fields/email_field.rb
111
- - lib/tester/definition/fields/enum_field.rb
112
- - lib/tester/definition/fields/field.rb
113
- - lib/tester/definition/fields/number_field.rb
114
- - lib/tester/definition/fields/object_field.rb
115
- - lib/tester/definition/request.rb
116
- - lib/tester/definition/response.rb
117
- - lib/tester/method_case_test.rb
118
- - lib/tester/modules/extra_verbs.rb
119
- - lib/tester/modules/format.rb
120
- - lib/tester/modules/good_case.rb
121
- - lib/tester/modules/module.rb
122
- - lib/tester/modules/typo.rb
123
- - lib/tester/modules/unused_fields.rb
124
- - lib/tester/reporter/api_report.rb
125
- - lib/tester/reporter/missing_field_report.rb
126
- - lib/tester/reporter/missing_response_field_report.rb
127
- - lib/tester/reporter/report.rb
128
- - lib/tester/reporter/status_code_report.rb
129
- - lib/tester/test_helper.rb
130
- - lib/tester/util/response_evaluator.rb
131
- - lib/tester/util/supported_verbs.rb
132
- - lib/tester/version.rb
218
+ - lib/api-tester.rb
219
+ - lib/api-tester/config.rb
220
+ - lib/api-tester/definition/boundary_case.rb
221
+ - lib/api-tester/definition/contract.rb
222
+ - lib/api-tester/definition/endpoint.rb
223
+ - lib/api-tester/definition/fields/array_field.rb
224
+ - lib/api-tester/definition/fields/boolean_field.rb
225
+ - lib/api-tester/definition/fields/email_field.rb
226
+ - lib/api-tester/definition/fields/enum_field.rb
227
+ - lib/api-tester/definition/fields/field.rb
228
+ - lib/api-tester/definition/fields/number_field.rb
229
+ - lib/api-tester/definition/fields/object_field.rb
230
+ - lib/api-tester/definition/fields/plain_array_field.rb
231
+ - lib/api-tester/definition/method.rb
232
+ - lib/api-tester/definition/request.rb
233
+ - lib/api-tester/definition/response.rb
234
+ - lib/api-tester/method_case_test.rb
235
+ - lib/api-tester/modules/extra_verbs.rb
236
+ - lib/api-tester/modules/format.rb
237
+ - lib/api-tester/modules/good_case.rb
238
+ - lib/api-tester/modules/injection_module.rb
239
+ - lib/api-tester/modules/required_fields.rb
240
+ - lib/api-tester/modules/server_information.rb
241
+ - lib/api-tester/modules/typo.rb
242
+ - lib/api-tester/modules/unexpected_fields.rb
243
+ - lib/api-tester/modules/unused_fields.rb
244
+ - lib/api-tester/reporter/api_report.rb
245
+ - lib/api-tester/reporter/missing_field_report.rb
246
+ - lib/api-tester/reporter/report.rb
247
+ - lib/api-tester/reporter/status_code_report.rb
248
+ - lib/api-tester/test_helper.rb
249
+ - lib/api-tester/util/response_evaluator.rb
250
+ - lib/api-tester/util/supported_verbs.rb
251
+ - lib/api-tester/version.rb
133
252
  homepage: https://github.com/araneforseti/api-tester
134
253
  licenses:
135
254
  - MIT
136
- metadata:
137
- allowed_push_host: https://rubygems.org/
255
+ metadata: {}
138
256
  post_install_message:
139
257
  rdoc_options: []
140
258
  require_paths:
@@ -150,8 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
268
  - !ruby/object:Gem::Version
151
269
  version: '0'
152
270
  requirements: []
153
- rubyforge_project:
154
- rubygems_version: 2.6.12
271
+ rubygems_version: 3.0.3
155
272
  signing_key:
156
273
  specification_version: 4
157
274
  summary: Tool to help test APIs
@@ -1,6 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.2.1
5
-
6
- before_install: gem install bundler -v 1.13.6