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.
- checksums.yaml +4 -4
- data/README.md +12 -12
- data/api-tester.gemspec +2 -2
- data/changelog.txt +5 -0
- data/lib/api-tester.rb +14 -0
- data/lib/api-tester/config.rb +40 -0
- data/lib/api-tester/definition/api_contract.rb +15 -0
- data/lib/api-tester/definition/api_method.rb +13 -0
- data/lib/api-tester/definition/boundary_case.rb +13 -0
- data/lib/api-tester/definition/endpoint.rb +61 -0
- data/lib/api-tester/definition/fields/array_field.rb +46 -0
- data/lib/api-tester/definition/fields/boolean_field.rb +20 -0
- data/lib/api-tester/definition/fields/email_field.rb +22 -0
- data/lib/api-tester/definition/fields/enum_field.rb +29 -0
- data/lib/api-tester/definition/fields/field.rb +49 -0
- data/lib/api-tester/definition/fields/number_field.rb +19 -0
- data/lib/api-tester/definition/fields/object_field.rb +44 -0
- data/lib/api-tester/definition/request.rb +51 -0
- data/lib/api-tester/definition/response.rb +36 -0
- data/lib/api-tester/method_case_test.rb +69 -0
- data/lib/api-tester/modules/extra_verbs.rb +27 -0
- data/lib/api-tester/modules/format.rb +28 -0
- data/lib/api-tester/modules/good_case.rb +31 -0
- data/lib/api-tester/modules/module.rb +20 -0
- data/lib/api-tester/modules/typo.rb +43 -0
- data/lib/api-tester/modules/unused_fields.rb +24 -0
- data/lib/api-tester/reporter/api_report.rb +35 -0
- data/lib/api-tester/reporter/missing_field_report.rb +25 -0
- data/lib/api-tester/reporter/missing_response_field_report.rb +21 -0
- data/lib/api-tester/reporter/report.rb +27 -0
- data/lib/api-tester/reporter/status_code_report.rb +14 -0
- data/lib/api-tester/test_helper.rb +12 -0
- data/lib/api-tester/util/response_evaluator.rb +75 -0
- data/lib/api-tester/util/supported_verbs.rb +36 -0
- data/lib/api-tester/version.rb +3 -0
- metadata +33 -33
- data/lib/tester.rb +0 -7
- data/lib/tester/api_tester.rb +0 -50
- data/lib/tester/definition/api_contract.rb +0 -13
- data/lib/tester/definition/api_method.rb +0 -11
- data/lib/tester/definition/boundary_case.rb +0 -11
- data/lib/tester/definition/endpoint.rb +0 -57
- data/lib/tester/definition/fields/array_field.rb +0 -44
- data/lib/tester/definition/fields/boolean_field.rb +0 -18
- data/lib/tester/definition/fields/email_field.rb +0 -20
- data/lib/tester/definition/fields/enum_field.rb +0 -27
- data/lib/tester/definition/fields/field.rb +0 -47
- data/lib/tester/definition/fields/number_field.rb +0 -17
- data/lib/tester/definition/fields/object_field.rb +0 -42
- data/lib/tester/definition/request.rb +0 -49
- data/lib/tester/definition/response.rb +0 -34
- data/lib/tester/method_case_test.rb +0 -67
- data/lib/tester/modules/extra_verbs.rb +0 -25
- data/lib/tester/modules/format.rb +0 -26
- data/lib/tester/modules/good_case.rb +0 -29
- data/lib/tester/modules/module.rb +0 -18
- data/lib/tester/modules/typo.rb +0 -41
- data/lib/tester/modules/unused_fields.rb +0 -22
- data/lib/tester/reporter/api_report.rb +0 -33
- data/lib/tester/reporter/missing_field_report.rb +0 -23
- data/lib/tester/reporter/missing_response_field_report.rb +0 -19
- data/lib/tester/reporter/report.rb +0 -25
- data/lib/tester/reporter/status_code_report.rb +0 -12
- data/lib/tester/test_helper.rb +0 -10
- data/lib/tester/util/response_evaluator.rb +0 -73
- data/lib/tester/util/supported_verbs.rb +0 -34
- data/lib/tester/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7fd0c363094e175b8c3a28f0b208c6a5202f496
|
4
|
+
data.tar.gz: fd8349e6d3f62ab34f34f95f6dd82c1c77dcd62a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
```
|
data/api-tester.gemspec
CHANGED
@@ -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 =
|
8
|
+
spec.version = ApiTester::VERSION
|
9
9
|
spec.authors = ["arane"]
|
10
10
|
spec.email = ["arane9@gmail.com"]
|
11
11
|
|
data/changelog.txt
CHANGED
data/lib/api-tester.rb
ADDED
@@ -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,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
|