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