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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41988c02130d7463e08e3d41c50f17a60fc3e562
4
- data.tar.gz: 19dc7c39a0156c600029ba34d2f533ffe0934bde
3
+ metadata.gz: d7fd0c363094e175b8c3a28f0b208c6a5202f496
4
+ data.tar.gz: fd8349e6d3f62ab34f34f95f6dd82c1c77dcd62a
5
5
  SHA512:
6
- metadata.gz: 7e7d21836ff7dc8928b68f50b3d6e117f3823bd24fff3e2145dbaee0a0f0367fc7b317bf365a2ae41657ab636b214e9a73b909023f88a8f471c6ed8a6b11140b
7
- data.tar.gz: d2b4ccb62ee4907c327a45a5bde32fbc8e6f8a0afe7d1d936725a77e6acbcb39c4911ea480240d933986399d23bff43d1cc3ad262dfe4227f34b3eaa8328168f
6
+ metadata.gz: 0f99743ce48fb7157e50d6cb2fac17ab7256a6dffb8c3abaf370ae85c6866385087684932899d973388a23758da73079f55eb87946fa39267783db19f533d77d
7
+ data.tar.gz: c74c4a8c90395deeed9f2a3520a67e3a279f5e011a54fbcdad13be5aa1c799e81f70d519a9fe63e3e9bc4e0306ddc990ff8e9d5cb333a850bda303bc2fab5ffc
data/README.md CHANGED
@@ -73,22 +73,22 @@ stable release
73
73
 
74
74
  Define your contract and endpoints using
75
75
  ```ruby
76
- require 'tester/definition/api_contract'
77
- require 'tester/definition/endpoint'
76
+ require 'api-tester/definition/api_contract'
77
+ require 'api-tester/definition/endpoint'
78
78
  contract = ApiContract.new "API Name"
79
- endpoint = Endpoint.new "Some name which is currently unused", "http://yourbase.com/api/endpoint"
79
+ endpoint = ApiTester::Endpoint.new "Some name which is currently unused", "http://yourbase.com/api/endpoint"
80
80
  ```
81
81
 
82
82
  Define methods on endpoints
83
83
 
84
84
  ```ruby
85
- endpoint.add_method SupportedVerbs::GET, expected_response, expected_request
85
+ endpoint.add_method ApiTester::SupportedVerbs::GET, expected_response, expected_request
86
86
  ```
87
- Note: While an extensive list of verbs exists in SupportedVerbs, you can define your own (with the caveat they have to be supported by RestClient)
87
+ Note: While an extensive list of verbs exists in ApiTester::SupportedVerbs, you can define your own (with the caveat they have to be supported by RestClient)
88
88
 
89
89
  Define fields used by the method (both Request and Response)
90
90
  ```ruby
91
- expected_request = Request.new.add_field(Field.new "fieldName")
91
+ expected_request = Request.new.add_field(ApiTester::Field.new "fieldName")
92
92
  ```
93
93
  Note: Similar to methods, you can create your own fields.
94
94
  They need to repond to:
@@ -99,10 +99,10 @@ values_array = field.negative_boundary_values
99
99
 
100
100
  Put them together and call go and off you go!
101
101
  ```ruby
102
- request = Request.new.add_field(Field.new "fieldName")
103
- expected_response = Response.new(200).add_field(Field.new "fieldName")
104
- endpoint = Endpoint.new "Unused Name", "http://yourbase.com/api/endpoint"
105
- endpoint.add_method SupportedVerbs::GET, expected_response, request
102
+ request = Request.new.add_field(ApiTester::Field.new "fieldName")
103
+ expected_response = ApiTester::Response.new(200).add_field(ApiTester::Field.new "fieldName")
104
+ endpoint = ApiTester::Endpoint.new "Unused Name", "http://yourbase.com/api/endpoint"
105
+ endpoint.add_method ApiTester::SupportedVerbs::GET, expected_response, request
106
106
  contract = ApiContract.new "API Name"
107
107
  contract.add_endpoint endpoint
108
108
  tester = ApiTester.new(contract).with_module(Format.new)
@@ -115,7 +115,7 @@ expect(tester.go).to be true
115
115
  If any of your API endpoints have some setup which needs to happen before or after each call (eg, path param represents resource which needs to be created), you can use the TestHelper interface:
116
116
 
117
117
  ```ruby
118
- class InfoCreator < TestHelper
118
+ class InfoCreator < ApiTester::TestHelper
119
119
  def before
120
120
  puts "This code runs before every call"
121
121
  end
@@ -129,7 +129,7 @@ class InfoCreator < TestHelper
129
129
  end
130
130
  end
131
131
 
132
- endpoint = Endpoint.new "Endpoint Name", "www.endpoint-url.com"
132
+ endpoint = ApiTester::Endpoint.new "Endpoint Name", "www.endpoint-url.com"
133
133
  endpoint.test_helper = InfoCreator.new
134
134
  expect(tester.go).to be true
135
135
  ```
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'tester/version'
4
+ require 'api-tester/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "api-tester"
8
- spec.version = Tester::VERSION
8
+ spec.version = ApiTester::VERSION
9
9
  spec.authors = ["arane"]
10
10
  spec.email = ["arane9@gmail.com"]
11
11
 
@@ -1,3 +1,8 @@
1
+ 0.2.0
2
+
3
+ - Finally fixing the naming scheme
4
+ - Splitting configuration into its own class
5
+
1
6
  0.1.0
2
7
 
3
8
  - Moving call to endpoint for path param support
@@ -0,0 +1,14 @@
1
+ module ApiTester
2
+ def self.go definition, config
3
+ reporter = config.reporter
4
+
5
+ definition.endpoints.each do |endpoint|
6
+ config.modules.sort_by{ |mod| mod.order }.each do |mod|
7
+ mod.go endpoint, reporter
8
+ end
9
+ end
10
+
11
+ reporter.print
12
+ reporter.reports.size == 0
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ require 'api-tester/reporter/api_report'
2
+
3
+ module ApiTester
4
+ class Config
5
+ attr_accessor :reporter
6
+ attr_accessor :modules
7
+
8
+ def initialize reporter=ApiTester::ApiReport.new
9
+ self.reporter = reporter
10
+ self.modules = []
11
+ end
12
+
13
+ def with_reporter reporter
14
+ self.reporter = reporter
15
+ self
16
+ end
17
+
18
+ def with_module new_module
19
+ self.modules << new_module
20
+ self
21
+ end
22
+
23
+ def with_default_modules
24
+ self.modules << Format.new
25
+ self.modules << GoodCase.new
26
+ self.modules << Typo.new
27
+ self.modules << UnusedFields.new
28
+ self
29
+ end
30
+
31
+ def with_all_modules
32
+ self.modules << Format.new
33
+ self.modules << ExtraVerbs.new
34
+ self.modules << GoodCase.new
35
+ self.modules << Typo.new
36
+ self.modules << UnusedFields.new
37
+ self
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ module ApiTester
2
+ class ApiContract
3
+ attr_accessor :name
4
+ attr_accessor :endpoints
5
+
6
+ def initialize name
7
+ self.name = name
8
+ self.endpoints = []
9
+ end
10
+
11
+ def add_endpoint endpoint
12
+ self.endpoints << endpoint
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module ApiTester
2
+ class ApiMethod
3
+ attr_accessor :request
4
+ attr_accessor :expected_response
5
+ attr_accessor :verb
6
+
7
+ def initialize verb, response, request
8
+ self.verb = verb
9
+ self.request = request
10
+ self.expected_response = response
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module ApiTester
2
+ class BoundaryCase
3
+ attr_accessor :payload
4
+ attr_accessor :headers
5
+ attr_accessor :description
6
+
7
+ def initialize description, payload, headers
8
+ self.description = description
9
+ self.payload = payload
10
+ self.headers = headers
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,61 @@
1
+ require 'api-tester/definition/response'
2
+ require 'api-tester/definition/api_method'
3
+ require 'api-tester/test_helper'
4
+ require 'rest-client'
5
+
6
+ module ApiTester
7
+ class Endpoint
8
+ attr_accessor :name
9
+ attr_accessor :base_url
10
+ attr_accessor :path_params
11
+ attr_accessor :methods
12
+ attr_accessor :test_helper
13
+ attr_accessor :bad_request_response
14
+ attr_accessor :not_allowed_response
15
+ attr_accessor :not_found_response
16
+
17
+ def initialize name, url
18
+ self.base_url = url
19
+ self.name = name
20
+ self.methods = []
21
+ self.path_params = []
22
+ self.test_helper = ApiTester::TestHelper.new
23
+ self.bad_request_response = ApiTester::Response.new 400
24
+ self.not_allowed_response = ApiTester::Response.new 415
25
+ self.not_found_response = ApiTester::Response.new 404
26
+ end
27
+
28
+ def url
29
+ temp_url = self.base_url
30
+ self.path_params.each do |param|
31
+ temp_url.sub! "{#{param}}", self.test_helper.retrieve_param(param)
32
+ end
33
+ temp_url
34
+ end
35
+
36
+ def call method, payload={}, headers={}
37
+ self.test_helper.before
38
+ begin
39
+ response = RestClient::Request.execute(method: method.verb, url: self.url, payload: payload, headers: headers)
40
+ rescue RestClient::ExceptionWithResponse => e
41
+ response = e.response
42
+ end
43
+ self.test_helper.after
44
+ response
45
+ end
46
+
47
+ def add_method verb, response, request=Request.new()
48
+ self.methods << ApiTester::ApiMethod.new(verb, response, request)
49
+ self
50
+ end
51
+
52
+ def add_path_param param
53
+ self.path_params << param
54
+ self
55
+ end
56
+
57
+ def verbs
58
+ self.methods.map(&:verb)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ require 'api-tester/definition/fields/field'
2
+
3
+ module ApiTester
4
+ class ArrayField < Field
5
+ attr_accessor :fields
6
+
7
+ def initialize name
8
+ super(name)
9
+ self.fields = []
10
+ end
11
+
12
+ def with_field(newField)
13
+ self.fields << newField
14
+ self
15
+ end
16
+
17
+ def has_subfields?
18
+ true
19
+ end
20
+
21
+ def default_value
22
+ if self.fields.size == 0
23
+ return []
24
+ end
25
+
26
+ obj = Hash.new
27
+ self.fields.each do |field|
28
+ obj[field.name] = field.default_value
29
+ end
30
+ [obj]
31
+ end
32
+
33
+ def negative_boundary_values
34
+ super +
35
+ [
36
+ "string",
37
+ 123,
38
+ 0,
39
+ 1,
40
+ true,
41
+ false,
42
+ {}
43
+ ]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,20 @@
1
+ require 'api-tester/definition/fields/field'
2
+
3
+ module ApiTester
4
+ class BooleanField < Field
5
+ def initialize(name, default_value=true)
6
+ super(name, default_value)
7
+ end
8
+
9
+ def negative_boundary_values
10
+ super +
11
+ [
12
+ "string",
13
+ 123,
14
+ 0,
15
+ 1,
16
+ {}
17
+ ]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require 'api-tester/definition/fields/field'
2
+
3
+ module ApiTester
4
+ class EmailField < Field
5
+ def initialize(name, default_value="test@test.com")
6
+ super(name, default_value)
7
+ end
8
+
9
+ def negative_boundary_values
10
+ super +
11
+ [
12
+ "string",
13
+ 123,
14
+ 1,
15
+ 0,
16
+ true,
17
+ false,
18
+ {}
19
+ ]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require 'api-tester/definition/fields/field'
2
+
3
+ module ApiTester
4
+ class EnumField < Field
5
+ attr_accessor :acceptable_values
6
+
7
+ def initialize name, acceptable_values, default_value=nil
8
+ if default_value
9
+ super name, default_value
10
+ else
11
+ super name, acceptable_values[0]
12
+ end
13
+
14
+ self.acceptable_values = acceptable_values
15
+ end
16
+
17
+ def negative_boundary_values
18
+ super +
19
+ [
20
+ 123,
21
+ 0,
22
+ 1,
23
+ true,
24
+ false,
25
+ {}
26
+ ]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,49 @@
1
+ module ApiTester
2
+ class Field
3
+ attr_accessor :name
4
+ attr_accessor :default_value
5
+ attr_accessor :required
6
+ attr_accessor :is_seen
7
+
8
+ def initialize name, default_value="string"
9
+ self.name = name
10
+ self.default_value = default_value
11
+ self.required = false
12
+ self.is_seen = 0
13
+ end
14
+
15
+ def is_required
16
+ self.required = true
17
+ self
18
+ end
19
+
20
+ def is_not_required
21
+ self.required = false
22
+ self
23
+ end
24
+
25
+ def has_subfields?
26
+ false
27
+ end
28
+
29
+ def fields
30
+ []
31
+ end
32
+
33
+ def negative_boundary_values
34
+ cases = []
35
+ if self.required
36
+ cases << nil
37
+ end
38
+ cases
39
+ end
40
+
41
+ def seen
42
+ self.is_seen += 1
43
+ end
44
+
45
+ def display_class
46
+ self.class
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ require 'api-tester/definition/fields/field'
2
+
3
+ module ApiTester
4
+ class NumberField < Field
5
+ def initialize(name, default_value=5)
6
+ super(name, default_value)
7
+ end
8
+
9
+ def negative_boundary_values
10
+ super +
11
+ [
12
+ "string",
13
+ true,
14
+ false,
15
+ {}
16
+ ]
17
+ end
18
+ end
19
+ end