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