api-tester 0.1.0 → 0.2.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -12
  3. data/api-tester.gemspec +2 -2
  4. data/changelog.txt +5 -0
  5. data/lib/api-tester.rb +14 -0
  6. data/lib/api-tester/config.rb +40 -0
  7. data/lib/api-tester/definition/api_contract.rb +15 -0
  8. data/lib/api-tester/definition/api_method.rb +13 -0
  9. data/lib/api-tester/definition/boundary_case.rb +13 -0
  10. data/lib/api-tester/definition/endpoint.rb +61 -0
  11. data/lib/api-tester/definition/fields/array_field.rb +46 -0
  12. data/lib/api-tester/definition/fields/boolean_field.rb +20 -0
  13. data/lib/api-tester/definition/fields/email_field.rb +22 -0
  14. data/lib/api-tester/definition/fields/enum_field.rb +29 -0
  15. data/lib/api-tester/definition/fields/field.rb +49 -0
  16. data/lib/api-tester/definition/fields/number_field.rb +19 -0
  17. data/lib/api-tester/definition/fields/object_field.rb +44 -0
  18. data/lib/api-tester/definition/request.rb +51 -0
  19. data/lib/api-tester/definition/response.rb +36 -0
  20. data/lib/api-tester/method_case_test.rb +69 -0
  21. data/lib/api-tester/modules/extra_verbs.rb +27 -0
  22. data/lib/api-tester/modules/format.rb +28 -0
  23. data/lib/api-tester/modules/good_case.rb +31 -0
  24. data/lib/api-tester/modules/module.rb +20 -0
  25. data/lib/api-tester/modules/typo.rb +43 -0
  26. data/lib/api-tester/modules/unused_fields.rb +24 -0
  27. data/lib/api-tester/reporter/api_report.rb +35 -0
  28. data/lib/api-tester/reporter/missing_field_report.rb +25 -0
  29. data/lib/api-tester/reporter/missing_response_field_report.rb +21 -0
  30. data/lib/api-tester/reporter/report.rb +27 -0
  31. data/lib/api-tester/reporter/status_code_report.rb +14 -0
  32. data/lib/api-tester/test_helper.rb +12 -0
  33. data/lib/api-tester/util/response_evaluator.rb +75 -0
  34. data/lib/api-tester/util/supported_verbs.rb +36 -0
  35. data/lib/api-tester/version.rb +3 -0
  36. metadata +33 -33
  37. data/lib/tester.rb +0 -7
  38. data/lib/tester/api_tester.rb +0 -50
  39. data/lib/tester/definition/api_contract.rb +0 -13
  40. data/lib/tester/definition/api_method.rb +0 -11
  41. data/lib/tester/definition/boundary_case.rb +0 -11
  42. data/lib/tester/definition/endpoint.rb +0 -57
  43. data/lib/tester/definition/fields/array_field.rb +0 -44
  44. data/lib/tester/definition/fields/boolean_field.rb +0 -18
  45. data/lib/tester/definition/fields/email_field.rb +0 -20
  46. data/lib/tester/definition/fields/enum_field.rb +0 -27
  47. data/lib/tester/definition/fields/field.rb +0 -47
  48. data/lib/tester/definition/fields/number_field.rb +0 -17
  49. data/lib/tester/definition/fields/object_field.rb +0 -42
  50. data/lib/tester/definition/request.rb +0 -49
  51. data/lib/tester/definition/response.rb +0 -34
  52. data/lib/tester/method_case_test.rb +0 -67
  53. data/lib/tester/modules/extra_verbs.rb +0 -25
  54. data/lib/tester/modules/format.rb +0 -26
  55. data/lib/tester/modules/good_case.rb +0 -29
  56. data/lib/tester/modules/module.rb +0 -18
  57. data/lib/tester/modules/typo.rb +0 -41
  58. data/lib/tester/modules/unused_fields.rb +0 -22
  59. data/lib/tester/reporter/api_report.rb +0 -33
  60. data/lib/tester/reporter/missing_field_report.rb +0 -23
  61. data/lib/tester/reporter/missing_response_field_report.rb +0 -19
  62. data/lib/tester/reporter/report.rb +0 -25
  63. data/lib/tester/reporter/status_code_report.rb +0 -12
  64. data/lib/tester/test_helper.rb +0 -10
  65. data/lib/tester/util/response_evaluator.rb +0 -73
  66. data/lib/tester/util/supported_verbs.rb +0 -34
  67. data/lib/tester/version.rb +0 -3
@@ -0,0 +1,21 @@
1
+ module ApiTester
2
+ class MissingResponseFieldReport
3
+ attr_accessor :url
4
+ attr_accessor :verb
5
+ attr_accessor :expected_field
6
+ attr_accessor :description
7
+
8
+ def initialize(url, verb, expected_field, description)
9
+ self.url = url
10
+ self.verb = verb
11
+ self.expected_field = expected_field
12
+ self.description = description
13
+ end
14
+
15
+ def print
16
+ puts "#{self.description}:"
17
+ puts " #{self.verb} #{self.url} is missing response field:"
18
+ puts " #{self.expected_field}"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module ApiTester
2
+ class Report
3
+ attr_accessor :description
4
+ attr_accessor :url
5
+ attr_accessor :request
6
+ attr_accessor :expected_response
7
+ attr_accessor :actual_response
8
+
9
+ def initialize description, url, request, expected_response, actual_response
10
+ self.description = description
11
+ self.url = url
12
+ self.request = request
13
+ self.expected_response = expected_response
14
+ self.actual_response = actual_response
15
+ end
16
+
17
+ def print
18
+ puts "#{self.description}: "
19
+ puts " Requested #{self.url} with payload:"
20
+ puts " #{self.request.to_json}"
21
+ puts " Expecting: "
22
+ puts " " + self.expected_response.to_s
23
+ puts " Receiving: "
24
+ puts " #{self.actual_response}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'api-tester/reporter/report'
2
+
3
+ module ApiTester
4
+ class StatusCodeReport < Report
5
+ attr_accessor :expected_status_code
6
+ attr_accessor :actual_status_code
7
+
8
+ def initialize description, url, request, expected_status_code, actual_status_code
9
+ super description, url, request, expected_status_code, actual_status_code
10
+ self.expected_status_code = expected_status_code
11
+ self.actual_status_code = actual_status_code
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module ApiTester
2
+ class TestHelper
3
+ def before
4
+ end
5
+
6
+ def retrieve_param key
7
+ end
8
+
9
+ def after
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,75 @@
1
+ module ApiTester
2
+ class ResponseEvaluator
3
+ attr_accessor :response_body
4
+ attr_accessor :expected_response
5
+
6
+ def initialize(actual_response_body, expected_response_fields)
7
+ self.response_body = actual_response_body
8
+ self.expected_response = expected_response_fields
9
+ end
10
+
11
+ def response_field_array
12
+ field_array self.response_body
13
+ end
14
+
15
+ def expected_fields
16
+ expected_fields_hash.keys
17
+ end
18
+
19
+ def seen_fields
20
+ seen = []
21
+ fields = response_field_array - extra_fields
22
+ expected = expected_fields_hash
23
+ fields.each do |field_key|
24
+ seen << expected[field_key]
25
+ end
26
+ seen
27
+ end
28
+
29
+ def expected_fields_hash
30
+ expected_field_array self.expected_response.body
31
+ end
32
+
33
+ def extra_fields
34
+ response_field_array - expected_fields
35
+ end
36
+
37
+ def missing_fields
38
+ expected_fields - response_field_array
39
+ end
40
+
41
+ def expected_field_array expected_fields
42
+ fields = {}
43
+ expected_fields.each do |field|
44
+ fields[field.name] = field
45
+ fields = fields.merge inner_expected_field(field.fields, field.name)
46
+ end
47
+ fields
48
+ end
49
+
50
+ def inner_expected_field expected_fields, name
51
+ fields = {}
52
+ expected_fields.each do |field|
53
+ inner_name = "#{name}.#{field.name}"
54
+ fields[inner_name] = field
55
+ fields = fields.merge inner_expected_field(field.fields, inner_name)
56
+ end
57
+ fields
58
+ end
59
+
60
+ def field_array object
61
+ fields = []
62
+ object.each do |key, value|
63
+ if(value)
64
+ fields << key.to_s
65
+ fields.concat(field_array(value).map{|i| "#{key}.#{i}"})
66
+ else
67
+ fields.concat(field_array(key))
68
+ end
69
+ end
70
+ fields
71
+ rescue NoMethodError
72
+ fields
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,36 @@
1
+ module ApiTester
2
+ class SupportedVerbs
3
+ def SupportedVerbs.add_item(key, value)
4
+ @hash ||= {}
5
+ @hash[key] = value
6
+ end
7
+
8
+ def SupportedVerbs.const_missing(key)
9
+ @hash[key]
10
+ end
11
+
12
+ def SupportedVerbs.each
13
+ @hash.each {|key,value| yield(key,value)}
14
+ end
15
+
16
+ def SupportedVerbs.all
17
+ @hash.values
18
+ end
19
+
20
+ SupportedVerbs.add_item :COPY, :copy
21
+ SupportedVerbs.add_item :DELETE, :delete
22
+ SupportedVerbs.add_item :GET, :get
23
+ SupportedVerbs.add_item :HEAD, :head
24
+ SupportedVerbs.add_item :LOCK, :lock
25
+ SupportedVerbs.add_item :MKCOL, :mkcol
26
+ SupportedVerbs.add_item :MOVE, :move
27
+ SupportedVerbs.add_item :OPTIONS, :options
28
+ SupportedVerbs.add_item :PATCH, :patch
29
+ SupportedVerbs.add_item :POST, :post
30
+ SupportedVerbs.add_item :PROPFIND, :propfind
31
+ SupportedVerbs.add_item :PROPPATCH, :proppatch
32
+ SupportedVerbs.add_item :PUT, :put
33
+ SupportedVerbs.add_item :TRACE, :trace
34
+ SupportedVerbs.add_item :UNLOCK, :unlock
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module ApiTester
2
+ VERSION = "0.2.0"
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
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: 0.2.0
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: 2018-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,37 +99,37 @@ files:
99
99
  - bin/console
100
100
  - bin/setup
101
101
  - 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
102
+ - lib/api-tester.rb
103
+ - lib/api-tester/config.rb
104
+ - lib/api-tester/definition/api_contract.rb
105
+ - lib/api-tester/definition/api_method.rb
106
+ - lib/api-tester/definition/boundary_case.rb
107
+ - lib/api-tester/definition/endpoint.rb
108
+ - lib/api-tester/definition/fields/array_field.rb
109
+ - lib/api-tester/definition/fields/boolean_field.rb
110
+ - lib/api-tester/definition/fields/email_field.rb
111
+ - lib/api-tester/definition/fields/enum_field.rb
112
+ - lib/api-tester/definition/fields/field.rb
113
+ - lib/api-tester/definition/fields/number_field.rb
114
+ - lib/api-tester/definition/fields/object_field.rb
115
+ - lib/api-tester/definition/request.rb
116
+ - lib/api-tester/definition/response.rb
117
+ - lib/api-tester/method_case_test.rb
118
+ - lib/api-tester/modules/extra_verbs.rb
119
+ - lib/api-tester/modules/format.rb
120
+ - lib/api-tester/modules/good_case.rb
121
+ - lib/api-tester/modules/module.rb
122
+ - lib/api-tester/modules/typo.rb
123
+ - lib/api-tester/modules/unused_fields.rb
124
+ - lib/api-tester/reporter/api_report.rb
125
+ - lib/api-tester/reporter/missing_field_report.rb
126
+ - lib/api-tester/reporter/missing_response_field_report.rb
127
+ - lib/api-tester/reporter/report.rb
128
+ - lib/api-tester/reporter/status_code_report.rb
129
+ - lib/api-tester/test_helper.rb
130
+ - lib/api-tester/util/response_evaluator.rb
131
+ - lib/api-tester/util/supported_verbs.rb
132
+ - lib/api-tester/version.rb
133
133
  homepage: https://github.com/araneforseti/api-tester
134
134
  licenses:
135
135
  - MIT
@@ -1,7 +0,0 @@
1
- require "tester/version"
2
- require 'rest-client'
3
- require 'json'
4
-
5
- module Tester
6
-
7
- end
@@ -1,50 +0,0 @@
1
- require "tester/modules/format"
2
- require 'tester/modules/good_case'
3
- require 'tester/modules/unused_fields'
4
- require 'tester/modules/typo'
5
- require 'rest-client'
6
- require 'tester/reporter/api_report'
7
- require 'json'
8
-
9
- class ApiTester
10
- attr_accessor :report
11
- attr_accessor :modules
12
- attr_accessor :definition
13
- attr_accessor :test_helper
14
-
15
- def initialize(definition)
16
- self.report = ApiReport.new
17
- self.modules = []
18
- self.definition = definition
19
- self.test_helper = TestHelper.new
20
- end
21
-
22
- def with_module(new_module)
23
- self.modules << new_module
24
- self
25
- end
26
-
27
- def with_reporter(reporter)
28
- self.report = reporter
29
- self
30
- end
31
-
32
- def with_default_modules
33
- self.modules << Format.new
34
- self.modules << GoodCase.new
35
- self.modules << Typo.new
36
- self.modules << UnusedFields.new
37
- self
38
- end
39
-
40
- def go
41
- self.definition.endpoints.each do |endpoint|
42
- self.modules.sort_by{ |mod| mod.order }.each do |mod|
43
- mod.go endpoint, self.report
44
- end
45
- end
46
-
47
- self.report.print
48
- self.report.reports.size == 0
49
- end
50
- end
@@ -1,13 +0,0 @@
1
- class ApiContract
2
- attr_accessor :name
3
- attr_accessor :endpoints
4
-
5
- def initialize name
6
- self.name = name
7
- self.endpoints = []
8
- end
9
-
10
- def add_endpoint endpoint
11
- self.endpoints << endpoint
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- class ApiMethod
2
- attr_accessor :request
3
- attr_accessor :expected_response
4
- attr_accessor :verb
5
-
6
- def initialize verb, response, request
7
- self.verb = verb
8
- self.request = request
9
- self.expected_response = response
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- class BoundaryCase
2
- attr_accessor :payload
3
- attr_accessor :headers
4
- attr_accessor :description
5
-
6
- def initialize description, payload, headers
7
- self.description = description
8
- self.payload = payload
9
- self.headers = headers
10
- end
11
- end
@@ -1,57 +0,0 @@
1
- require 'tester/definition/response'
2
- require 'tester/definition/api_method'
3
-
4
- class Endpoint
5
- attr_accessor :name
6
- attr_accessor :base_url
7
- attr_accessor :path_params
8
- attr_accessor :methods
9
- attr_accessor :test_helper
10
- attr_accessor :bad_request_response
11
- attr_accessor :not_allowed_response
12
- attr_accessor :not_found_response
13
-
14
- def initialize name, url
15
- self.base_url = url
16
- self.name = name
17
- self.methods = []
18
- self.path_params = []
19
- self.test_helper = TestHelper.new
20
- self.bad_request_response = Response.new 400
21
- self.not_allowed_response = Response.new 415
22
- self.not_found_response = Response.new 404
23
- end
24
-
25
- def url
26
- temp_url = self.base_url
27
- self.path_params.each do |param|
28
- temp_url.sub! "{#{param}}", self.test_helper.retrieve_param(param)
29
- end
30
- temp_url
31
- end
32
-
33
- def call method, payload={}, headers={}
34
- self.test_helper.before
35
- begin
36
- response = RestClient::Request.execute(method: method.verb, url: self.url, payload: payload, headers: headers)
37
- rescue RestClient::ExceptionWithResponse => e
38
- response = e.response
39
- end
40
- self.test_helper.after
41
- response
42
- end
43
-
44
- def add_method verb, response, request=Request.new()
45
- self.methods << ApiMethod.new(verb, response, request)
46
- self
47
- end
48
-
49
- def add_path_param param
50
- self.path_params << param
51
- self
52
- end
53
-
54
- def verbs
55
- self.methods.map(&:verb)
56
- end
57
- end
@@ -1,44 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class ArrayField < Field
4
- attr_accessor :fields
5
-
6
- def initialize name
7
- super(name)
8
- self.fields = []
9
- end
10
-
11
- def with_field(newField)
12
- self.fields << newField
13
- self
14
- end
15
-
16
- def has_subfields?
17
- true
18
- end
19
-
20
- def default_value
21
- if self.fields.size == 0
22
- return []
23
- end
24
-
25
- obj = Hash.new
26
- self.fields.each do |field|
27
- obj[field.name] = field.default_value
28
- end
29
- [obj]
30
- end
31
-
32
- def negative_boundary_values
33
- super +
34
- [
35
- "string",
36
- 123,
37
- 0,
38
- 1,
39
- true,
40
- false,
41
- {}
42
- ]
43
- end
44
- end