api-tester 0.1.0 → 1.1.1

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 (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