rack-rest-rspec 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +107 -40
- data/VERSION +1 -1
- data/lib/rack-rest-rspec/lib/rest_service.rb +4 -0
- data/lib/rack-rest-rspec/matchers/respond_a_collection_of_record.rb +12 -5
- data/lib/rack-rest-rspec/matchers/respond_a_record.rb +10 -4
- data/lib/rack-rest-rspec/matchers/respond_with_collection_size.rb +13 -5
- data/lib/rack-rest-rspec/matchers/respond_with_data.rb +9 -9
- data/lib/rack-rest-rspec/matchers/respond_with_status.rb +8 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71ef01252294ee9e868956d7022e23990f81557cc4025940da96b2783b4c2d04
|
4
|
+
data.tar.gz: ab4553953c6cb4bc1f428741133889fa3defd63fa4309be087db6ba95b7f9cb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e2fe753acd7375aa77f1672768b6c150e68df0a1f2ff5d58f68fba12c0290ea7906510b6ca29d2d877aaf4b185e80a0a50e78955c62b867b8e538445a434bfb
|
7
|
+
data.tar.gz: f6b5c79124bcf35173281e7b66ce0a22348d3892b7b8ff547d15c3ed1018541550712fdf97102e30e0f55fe013b10e5aca8204f67844c7ff6c282c2e083dc49e
|
data/README.md
CHANGED
@@ -19,55 +19,122 @@ or
|
|
19
19
|
|
20
20
|
### Basic usage : sample of spec matchers usage
|
21
21
|
|
22
|
-
|
23
|
-
before :all do
|
24
|
-
$service = RestService::new :service => MYRack::ModularApp
|
25
|
-
end
|
26
|
-
|
27
|
-
subject { $service }
|
28
|
-
context "GET /api/v1/posts : test for a collections of Post (empty)" do
|
29
|
-
it { expect(subject.get('/api/v1/posts')).to be_correctly_sent }
|
30
|
-
it { expect(subject).to respond_with_status 200 }
|
31
|
-
it { expect(subject).to respond_a_collection_of_record }
|
32
|
-
it { expect(subject).to respond_with_collection_size 0 }
|
33
|
-
end
|
34
|
-
|
35
|
-
context "POST /api/v1/post : create a new record" do
|
36
|
-
it { expect(subject.post('/api/v1/post',{id: 1, title: "test", body: "content"}.to_json)).to be_correctly_sent }
|
37
|
-
it { expect(subject).to respond_with_status 201 }
|
38
|
-
end
|
39
|
-
|
40
|
-
context "GET /api/v1/posts : test for a collections of Post" do
|
41
|
-
it { expect(subject.get('/api/v1/posts')).to be_correctly_sent }
|
42
|
-
it { expect(subject).to respond_with_status 200 }
|
43
|
-
it { expect(subject).to respond_a_collection_of_record }
|
44
|
-
it { expect(subject).to respond_with_collection_size 1 }
|
45
|
-
end
|
46
|
-
|
47
|
-
context "GET /api/v1/post/:id : get a record by code" do
|
48
|
-
it { expect(subject.get("/api/v1/post/1")).to be_correctly_sent }
|
49
|
-
it { expect(subject).to respond_with_status 200 }
|
50
|
-
it { expect(subject).to respond_a_record }
|
51
|
-
it { expect(subject).to respond_with_data({id: 1, title: "test", body: "content"}) }
|
52
|
-
end
|
53
|
-
|
54
|
-
context "DELETE /api/v1/post/:id : delete a pots by id" do
|
55
|
-
it{ expect(subject.delete("/api/v1/post/1")).to be_correctly_sent }
|
56
|
-
it { expect(subject).to respond_with_status 204 }
|
57
|
-
end
|
22
|
+
Considering this API made with [Sinatra](https://sinatrarb.com/) :
|
58
23
|
|
59
24
|
|
25
|
+
```ruby
|
26
|
+
class Application < Sinatra::Base
|
60
27
|
|
28
|
+
|
29
|
+
before do
|
30
|
+
content_type 'application/json'
|
31
|
+
end
|
32
|
+
|
33
|
+
get '/status' do
|
34
|
+
status 208
|
35
|
+
return {name: "Sample App", version: "0.0.1", status: 'OK'}.to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
get '/embeded_status' do
|
39
|
+
status 208
|
40
|
+
return {code: 208, data: {name: "Sample App", version: "0.0.1", status: 'OK'}}.to_json
|
41
|
+
end
|
42
|
+
|
43
|
+
get '/collection' do
|
44
|
+
return [{one: 1}, {two: 2}, {three: 3}].to_json
|
45
|
+
end
|
46
|
+
|
47
|
+
get '/embeded_collection' do
|
48
|
+
return {code: 200, data: [{one: 1}, {two: 2}, {three: 3}]}.to_json
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
You could test this with rack-rest-rspec :
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
describe 'Test REST API' do
|
58
|
+
before :all do
|
59
|
+
$service = RestService::new :service => Application
|
60
|
+
$data = {name: "Sample App", version: "0.0.1", status: 'OK'}
|
61
|
+
$collection = [{one: 1}, {two: 2}, {three: 3}]
|
62
|
+
end
|
63
|
+
|
64
|
+
subject { $service }
|
65
|
+
context "GET /status : test for status" do
|
66
|
+
it { expect(subject.get('/status')).to be_correctly_sent }
|
67
|
+
it { expect(subject).to respond_with_status code: 208 }
|
68
|
+
it { expect(subject).to respond_a_record }
|
69
|
+
it { expect(subject).to respond_with data: $data }
|
70
|
+
end
|
71
|
+
|
72
|
+
context "GET /embeded_status : test for status" do
|
73
|
+
it { expect(subject.get('/embeded_status')).to be_correctly_sent }
|
74
|
+
it { expect(subject).to respond_with_status code: 208 }
|
75
|
+
it { expect(subject).to respond_a_record root: :data }
|
76
|
+
it { expect(subject).to respond_with data: $data, root: :data }
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
context "GET /collection : test for Array" do
|
81
|
+
it { expect(subject.get('/collection')).to be_correctly_sent }
|
82
|
+
it { expect(subject).to respond_with_status code: 200 }
|
83
|
+
it { expect(subject).to respond_a_collection_of_record }
|
84
|
+
it { expect(subject).to respond_with_collection size: 3 }
|
85
|
+
it { expect(subject).to respond_with data: $collection }
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
context "GET /embeded_collection : test for Array" do
|
90
|
+
it { expect(subject.get('/embeded_collection')).to be_correctly_sent }
|
91
|
+
it { expect(subject).to respond_with_status code: 200 }
|
92
|
+
it { expect(subject).to respond_a_collection_of_record root: :data}
|
93
|
+
it { expect(subject).to respond_with_collection size: 3,root: :data }
|
94
|
+
it { expect(subject).to respond_with data: $collection, root: :data }
|
61
95
|
end
|
62
96
|
|
97
|
+
|
98
|
+
end
|
99
|
+
```
|
100
|
+
Output :
|
101
|
+
|
102
|
+
```
|
103
|
+
Test REST API
|
104
|
+
GET /status : test for status
|
105
|
+
is expected to be a valid HTTP verb request with a valid response return
|
106
|
+
is expected to respond with status code equal to 208
|
107
|
+
is expected to respond with a record (Hash)
|
108
|
+
is expected to respond with corresponding data
|
109
|
+
GET /embeded_status : test for status
|
110
|
+
is expected to be a valid HTTP verb request with a valid response return
|
111
|
+
is expected to respond with status code equal to 208
|
112
|
+
is expected to respond with a record (Hash)
|
113
|
+
is expected to respond with corresponding data
|
114
|
+
GET /collection : test for Array
|
115
|
+
is expected to be a valid HTTP verb request with a valid response return
|
116
|
+
is expected to respond with status code equal to 200
|
117
|
+
is expected to respond with a records collection (Array)
|
118
|
+
is expected to respond with a collection of records size of 3
|
119
|
+
is expected to respond with corresponding data
|
120
|
+
GET /embeded_collection : test for Array
|
121
|
+
is expected to be a valid HTTP verb request with a valid response return
|
122
|
+
is expected to respond with status code equal to 200
|
123
|
+
is expected to respond with a records collection (Array)
|
124
|
+
is expected to respond with a collection of records size of 3
|
125
|
+
is expected to respond with corresponding data
|
126
|
+
|
127
|
+
Finished in 0.01585 seconds (files took 0.25845 seconds to load)
|
128
|
+
18 examples, 0 failures
|
129
|
+
```
|
63
130
|
|
64
131
|
## Available matchers :
|
65
132
|
|
66
133
|
* be_correctly_send : check if return is HTTP valid
|
67
|
-
* respond_with_a_collection_of_record : check if the return is a JSON Array
|
68
|
-
* respond_a_record : check if the return is a JSON Hash
|
69
|
-
*
|
70
|
-
*
|
134
|
+
* respond_with_a_collection_of_record OPTIONAL[root: <:symbol>] : check if the return is a JSON Array, could be chroot with root:
|
135
|
+
* respond_a_record OPTIONAL[root: <:symbol>] : check if the return is a JSON Hash, could be chroot with root:
|
136
|
+
* respond_with_collection size: <Integer> OPTIONAL[root: <:symbol>] : check if the collection have the good size, could be chroot with root:
|
137
|
+
* respond_with data: <Object> OPTIONAL[root: <:symbol>] : check if the return match the given object, could be chroot with root:
|
71
138
|
* respond_with_status <Integer> : check if the HTTP response code is the good.
|
72
139
|
|
73
140
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
@@ -1,14 +1,21 @@
|
|
1
|
-
RSpec::Matchers.define :respond_a_collection_of_record do
|
1
|
+
RSpec::Matchers.define :respond_a_collection_of_record do |options= {}|
|
2
|
+
|
2
3
|
match do |actual|
|
3
|
-
JSON::parse(actual.browser.last_response.body
|
4
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
5
|
+
result = result[options[:root]] unless options[:root].nil?
|
6
|
+
result.class == Array
|
4
7
|
end
|
5
8
|
description do
|
6
|
-
"respond with a
|
9
|
+
"respond with a records collection (Array)"
|
7
10
|
end
|
8
11
|
failure_message do |actual|
|
9
|
-
|
12
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
13
|
+
result = result[options[:root]] unless options[:oot].nil?
|
14
|
+
"expected #{actual} response body would be a collection \nneed : Array, \ngot : #{result.class}"
|
10
15
|
end
|
11
16
|
failure_message_when_negated do |actual|
|
12
|
-
|
17
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
18
|
+
result = result[options[:root]] unless options[:root].nil?
|
19
|
+
"expected #{actual} response body would not be a collection \nneed : Array, \ngot : #{result.class}"
|
13
20
|
end
|
14
21
|
end
|
@@ -1,14 +1,20 @@
|
|
1
|
-
RSpec::Matchers.define :respond_a_record do
|
1
|
+
RSpec::Matchers.define :respond_a_record do |options={}|
|
2
2
|
match do |actual|
|
3
|
-
JSON::parse(actual.browser.last_response.body
|
3
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
4
|
+
result = result[options[:root]] unless options[:root].nil?
|
5
|
+
result.class == Hash
|
4
6
|
end
|
5
7
|
description do
|
6
8
|
"respond with a record (Hash)"
|
7
9
|
end
|
8
10
|
failure_message do |actual|
|
9
|
-
|
11
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
12
|
+
result = result[options[:root]] unless options[:root].nil?
|
13
|
+
"expected #{actual} response body would be a record \nneed : Hash, \ngot : #{result.class}"
|
10
14
|
end
|
11
15
|
failure_message_when_negated do |actual|
|
12
|
-
|
16
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
17
|
+
result = result[options[:root]] unless options[:root].nil?
|
18
|
+
"expected #{actual} response body would not be a record \nneed : Hash, \ngot : #{result.class}"
|
13
19
|
end
|
14
20
|
end
|
@@ -1,14 +1,22 @@
|
|
1
|
-
RSpec::Matchers.define :
|
1
|
+
RSpec::Matchers.define :respond_with_collection do |options={}|
|
2
|
+
expected = options[:size]
|
2
3
|
match do |actual|
|
3
|
-
JSON::parse(actual.browser.last_response.body
|
4
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
5
|
+
result = result[options[:root]] unless options[:root].nil?
|
6
|
+
result.size == expected
|
4
7
|
end
|
5
8
|
description do
|
6
|
-
"respond with a collection of
|
9
|
+
"respond with a collection of records size of #{expected}"
|
7
10
|
end
|
11
|
+
|
8
12
|
failure_message do |actual|
|
9
|
-
|
13
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
14
|
+
result = result[options[:root]] unless options[:root].nil?
|
15
|
+
"expected #{actual} response body collection would have a size of #{expected}, \ngot #{result.size}"
|
10
16
|
end
|
11
17
|
failure_message_when_negated do |actual|
|
12
|
-
|
18
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
19
|
+
result = result[options[:root]] unless options[:root].nil?
|
20
|
+
"expected #{actual} response body collection would not have a size of #{expected}, \ngot #{result.size}"
|
13
21
|
end
|
14
22
|
end
|
@@ -11,22 +11,18 @@ def compare_array_of_hash expected, actual
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def prepare_array data
|
14
|
-
|
15
|
-
data.each do |ahash|
|
16
|
-
ahash.symbolize!
|
17
|
-
end
|
18
|
-
return data
|
14
|
+
return (data.class == Hash)? [data] : data
|
19
15
|
end
|
20
16
|
|
21
17
|
|
22
|
-
RSpec::Matchers.define :
|
23
|
-
|
18
|
+
RSpec::Matchers.define :respond_with do |options={}|
|
19
|
+
expected = options[:data]
|
24
20
|
match do |actual|
|
25
|
-
result = actual.browser.last_response.body
|
21
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
22
|
+
result = result[options[:root]] unless options[:root].nil?
|
26
23
|
if result.empty? then
|
27
24
|
false
|
28
25
|
else
|
29
|
-
result = JSON::parse(result)
|
30
26
|
result = prepare_array result
|
31
27
|
expected = prepare_array expected
|
32
28
|
compare_array_of_hash expected,result
|
@@ -36,9 +32,13 @@ RSpec::Matchers.define :respond_with_data do |expected|
|
|
36
32
|
"respond with corresponding data"
|
37
33
|
end
|
38
34
|
failure_message do |actual|
|
35
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
36
|
+
result = result[options[:root]] unless options[:root].nil?
|
39
37
|
"expected #{actual} response body would be equal \nto : #{expected}, \ngot : #{result}"
|
40
38
|
end
|
41
39
|
failure_message_when_negated do |actual|
|
40
|
+
result = JSON::parse(actual.browser.last_response.body, symbolize_names: true)
|
41
|
+
result = result[options[:root]] unless options[:root].nil?
|
42
42
|
"expected #{actual} response body would not be equal \nto : #{expected}, \ngot : #{result}"
|
43
43
|
end
|
44
44
|
end
|
@@ -1,14 +1,18 @@
|
|
1
|
-
RSpec::Matchers.define :respond_with_status do |
|
1
|
+
RSpec::Matchers.define :respond_with_status do |options={}|
|
2
|
+
expected = options[:code]
|
2
3
|
match do |actual|
|
3
|
-
actual.browser.last_response
|
4
|
+
result = actual.browser.last_response
|
5
|
+
result.status == expected
|
4
6
|
end
|
5
7
|
description do
|
6
8
|
"respond with status code equal to #{expected}"
|
7
9
|
end
|
8
10
|
failure_message do |actual|
|
9
|
-
|
11
|
+
result = actual.browser.last_response
|
12
|
+
"expected #{actual} response would be equal \nto : #{expected} \ngot : #{result.status}"
|
10
13
|
end
|
11
14
|
failure_message_when_negated do |actual|
|
12
|
-
|
15
|
+
result = actual.browser.last_response
|
16
|
+
"expected #{actual} response would not be equal \nto : #{expected} \ngot : #{result.status}"
|
13
17
|
end
|
14
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-rest-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Romain GEORGES
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roodi
|
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: '0'
|
155
155
|
requirements: []
|
156
|
-
rubygems_version: 3.
|
156
|
+
rubygems_version: 3.4.19
|
157
157
|
signing_key:
|
158
158
|
specification_version: 4
|
159
159
|
summary: 'Rack-rest-rspec: RSpec Matchers for REST Rack webservice'
|