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
@@ -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
@@ -1,18 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class BooleanField < Field
4
- def initialize(name, default_value=true)
5
- super(name, default_value)
6
- end
7
-
8
- def negative_boundary_values
9
- super +
10
- [
11
- "string",
12
- 123,
13
- 0,
14
- 1,
15
- {}
16
- ]
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class EmailField < Field
4
- def initialize(name, default_value="test@test.com")
5
- super(name, default_value)
6
- end
7
-
8
- def negative_boundary_values
9
- super +
10
- [
11
- "string",
12
- 123,
13
- 1,
14
- 0,
15
- true,
16
- false,
17
- {}
18
- ]
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class EnumField < Field
4
- attr_accessor :acceptable_values
5
-
6
- def initialize name, acceptable_values, default_value=nil
7
- if default_value
8
- super name, default_value
9
- else
10
- super name, acceptable_values[0]
11
- end
12
-
13
- self.acceptable_values = acceptable_values
14
- end
15
-
16
- def negative_boundary_values
17
- super +
18
- [
19
- 123,
20
- 0,
21
- 1,
22
- true,
23
- false,
24
- {}
25
- ]
26
- end
27
- end
@@ -1,47 +0,0 @@
1
- class Field
2
- attr_accessor :name
3
- attr_accessor :default_value
4
- attr_accessor :required
5
- attr_accessor :is_seen
6
-
7
- def initialize name, default_value="string"
8
- self.name = name
9
- self.default_value = default_value
10
- self.required = false
11
- self.is_seen = 0
12
- end
13
-
14
- def is_required
15
- self.required = true
16
- self
17
- end
18
-
19
- def is_not_required
20
- self.required = false
21
- self
22
- end
23
-
24
- def has_subfields?
25
- false
26
- end
27
-
28
- def fields
29
- []
30
- end
31
-
32
- def negative_boundary_values
33
- cases = []
34
- if self.required
35
- cases << nil
36
- end
37
- cases
38
- end
39
-
40
- def seen
41
- self.is_seen += 1
42
- end
43
-
44
- def display_class
45
- self.class
46
- end
47
- end
@@ -1,17 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class NumberField < Field
4
- def initialize(name, default_value=5)
5
- super(name, default_value)
6
- end
7
-
8
- def negative_boundary_values
9
- super +
10
- [
11
- "string",
12
- true,
13
- false,
14
- {}
15
- ]
16
- end
17
- end
@@ -1,42 +0,0 @@
1
- require 'tester/definition/fields/field'
2
-
3
- class ObjectField < 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
- obj = Hash.new
22
-
23
- self.fields.each do |field|
24
- obj[field.name] = field.default_value
25
- end
26
-
27
- obj
28
- end
29
-
30
- def negative_boundary_values
31
- super +
32
- [
33
- "string",
34
- [],
35
- 123,
36
- 1,
37
- 0,
38
- true,
39
- false
40
- ]
41
- end
42
- end
@@ -1,49 +0,0 @@
1
- require 'tester/definition/boundary_case'
2
-
3
- class Request
4
- attr_accessor :definition
5
- attr_accessor :headers
6
- attr_accessor :fields
7
-
8
- def initialize
9
- self.fields = []
10
- end
11
-
12
- def add_field(new_field)
13
- self.fields << new_field
14
- self
15
- end
16
-
17
- def payload
18
- response = Hash.new
19
- self.fields.each do |field|
20
- response[field.name] = field.default_value
21
- end
22
- response
23
- end
24
-
25
- def default_payload
26
- payload
27
- end
28
-
29
- def default_headers
30
- {content_type: :json, accept: :json}
31
- end
32
-
33
- def cases
34
- boundary_cases = Array.new
35
- self.fields.each do |field|
36
- field.negative_boundary_values.each do |value|
37
- bcase = BoundaryCase.new("Setting #{field.name} to #{value}", altered_payload(field.name, value), default_headers)
38
- boundary_cases.push(bcase)
39
- end
40
- end
41
- boundary_cases
42
- end
43
-
44
- def altered_payload field_name, value
45
- body = payload
46
- body[field_name] = value
47
- body
48
- end
49
- end
@@ -1,34 +0,0 @@
1
- class Response
2
- attr_accessor :code
3
- attr_accessor :body
4
-
5
- def initialize(status_code=200)
6
- self.code = status_code
7
- self.body = []
8
- end
9
-
10
- def add_field(new_field)
11
- self.body << new_field
12
- self
13
- end
14
-
15
- def to_s
16
- des = {}
17
- self.body.map do |f|
18
- des[f.name] = field_display f
19
- end
20
- des.to_json
21
- end
22
-
23
- def field_display field
24
- des = field.display_class
25
- if field.has_subfields?
26
- des = {}
27
- field.fields.map do |f|
28
- des[f.name] = field_display f
29
- end
30
- des.to_json
31
- end
32
- des
33
- end
34
- end