api-tester 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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