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
@@ -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
@@ -1,67 +0,0 @@
1
- require 'tester/util/response_evaluator.rb'
2
-
3
- class MethodCaseTest
4
- attr_accessor :expected_response
5
- attr_accessor :payload
6
- attr_accessor :response
7
- attr_accessor :reports
8
- attr_accessor :url
9
- attr_accessor :module_name
10
-
11
- def initialize response, payload, expected_response, url, verb, module_name
12
- self.payload = payload
13
- self.response = response
14
- self.expected_response = expected_response
15
- self.reports = []
16
- self.url = "#{verb} #{url}"
17
- self.module_name = module_name
18
- end
19
-
20
- def response_code_report
21
- report = StatusCodeReport.new "#{module_name} - Incorrect response code", self.url, self.payload, self.expected_response.code, self.response.code
22
- self.reports << report
23
- nil
24
- end
25
-
26
- def missing_field_report field
27
- report = Report.new "#{module_name} - Missing field #{field}", self.url, self.payload, self.expected_response, self.response
28
- self.reports << report
29
- nil
30
- end
31
-
32
- def extra_field_report field
33
- report = Report.new "#{module_name} - Found extra field #{field}", self.url, self.payload, self.expected_response, self.response
34
- self.reports << report
35
- nil
36
- end
37
-
38
- def check
39
- if check_response_code
40
- evaluator = ResponseEvaluator.new json_parse(self.response.body), self.expected_response
41
- evaluator.missing_fields.map{|field| missing_field_report(field)}
42
- evaluator.extra_fields.map{|field| extra_field_report(field)}
43
- increment_fields evaluator.seen_fields
44
- end
45
- return self.reports
46
- end
47
-
48
- def check_response_code
49
- if response.code != expected_response.code
50
- response_code_report
51
- return false
52
- end
53
- return true
54
- end
55
-
56
- def increment_fields seen_fields
57
- seen_fields.each do |field|
58
- field.seen
59
- end
60
- end
61
-
62
- def json_parse body
63
- JSON.parse!(body)
64
- rescue JSON::ParserError
65
- body
66
- end
67
- end
@@ -1,25 +0,0 @@
1
- require 'tester/modules/module'
2
- require 'tester/util/supported_verbs'
3
-
4
- class ExtraVerbs < Module
5
- def go(endpoint, report)
6
- super
7
-
8
- extras = SupportedVerbs.all - endpoint.verbs
9
- extras.each do |verb|
10
- verb_case = BoundaryCase.new("Verb check with #{verb} for #{endpoint.name}", {}, {})
11
- method = ApiMethod.new verb, Response.new, Request.new
12
- response = endpoint.call method, verb_case.payload, verb_case.headers
13
- test = VerbClass.new response, verb_case.payload, endpoint.not_allowed_response, endpoint.url, verb
14
- reports = test.check
15
- self.report.reports.concat reports
16
- end
17
- self.report.reports == []
18
- end
19
- end
20
-
21
- class VerbClass < MethodCaseTest
22
- def initialize response, payload, expected_response, url, verb
23
- super response, payload, expected_response, url, verb, "VerbModule"
24
- end
25
- end
@@ -1,26 +0,0 @@
1
- require 'tester/reporter/status_code_report'
2
- require 'tester/modules/module'
3
- require 'tester/method_case_test'
4
-
5
- class Format < Module
6
- def go definition, report
7
- super
8
-
9
- definition.methods.each do |method|
10
- cases = method.request.cases
11
- cases.each do |format_case|
12
- response = definition.call method, format_case.payload, format_case.headers
13
- test = FormatTest.new response, format_case.payload, definition.bad_request_response, definition.url, method.verb
14
- self.report.reports.concat test.check
15
- end
16
- end
17
-
18
- report.reports == []
19
- end
20
- end
21
-
22
- class FormatTest < MethodCaseTest
23
- def initialize response, payload, expected_response, url, verb
24
- super response, payload, expected_response, url, verb, "FormatModule"
25
- end
26
- end
@@ -1,29 +0,0 @@
1
- require 'tester/reporter/status_code_report'
2
- require 'tester/modules/module'
3
- require 'tester/method_case_test'
4
-
5
- class GoodCase < Module
6
- def go endpoint, report
7
- super
8
-
9
- endpoint.methods.each do |method|
10
- default_case = BoundaryCase.new endpoint.url, method.request.default_payload, method.request.default_headers
11
- response = endpoint.call method, default_case.payload, default_case.headers
12
- test = GoodCaseTest.new response, endpoint.url, method
13
- self.report.reports.concat test.check
14
- end
15
-
16
- self.report.reports == []
17
- end
18
-
19
- def order
20
- 1
21
- end
22
- end
23
-
24
-
25
- class GoodCaseTest < MethodCaseTest
26
- def initialize response, url, method
27
- super response, method.request.default_payload, method.expected_response, url, method.verb, "GoodCaseModule"
28
- end
29
- end
@@ -1,18 +0,0 @@
1
- require 'tester/reporter/status_code_report'
2
- require 'tester/test_helper'
3
-
4
- class Module
5
- attr_accessor :report
6
-
7
- def set_report report
8
- self.report = report
9
- end
10
-
11
- def go definition, report
12
- set_report report
13
- end
14
-
15
- def order
16
- 5
17
- end
18
- end
@@ -1,41 +0,0 @@
1
- require 'tester/reporter/status_code_report'
2
- require 'tester/modules/module'
3
- require 'tester/util/supported_verbs'
4
-
5
- class Typo < Module
6
- def go(endpoint, report)
7
- super
8
-
9
- allowances(endpoint).each do |verbs|
10
- check_typo_url endpoint
11
- end
12
-
13
- report.reports == []
14
- end
15
-
16
- def check_typo_url endpoint
17
- bad_url = "#{endpoint.url}gibberishadsfasdf"
18
- bad_endpoint = Endpoint.new "Bad URL", bad_url
19
- typo_case = BoundaryCase.new("Typo URL check", {}, {})
20
- method = ApiMethod.new SupportedVerbs::GET, Response.new(200), Request.new
21
- response = bad_endpoint.call method, typo_case.payload, typo_case.headers
22
-
23
- test = TypoClass.new response, typo_case.payload, endpoint.not_found_response, bad_url, SupportedVerbs::GET
24
- reports = test.check
25
- self.report.reports.concat reports
26
- end
27
-
28
- def allowances(endpoint)
29
- allowances = []
30
- endpoint.methods.each do |method|
31
- allowances << method.verb
32
- end
33
- allowances.uniq
34
- end
35
- end
36
-
37
- class TypoClass < MethodCaseTest
38
- def initialize response, payload, expected_response, url, verb
39
- super response, payload, expected_response, url, verb, "TypoModule"
40
- end
41
- end