rest-assured 0.2.0.rc4 → 0.2.0.rc5
Sign up to get free protection for your applications and to get access to all the features.
- data/Guardfile +1 -1
- data/db/migrate/20111021113953_add_status_to_doubles.rb +9 -0
- data/features/doubles_via_api.feature +18 -15
- data/features/step_definitions/doubles_steps.rb +9 -8
- data/lib/rest-assured/models/double.rb +13 -4
- data/lib/rest-assured/routes/double.rb +1 -1
- data/lib/rest-assured/routes/response.rb +1 -0
- data/lib/rest-assured/version.rb +1 -1
- data/spec/custom_matchers.rb +7 -0
- data/spec/functional/double_routes_spec.rb +8 -8
- data/spec/functional/response_spec.rb +25 -14
- data/spec/models/double_spec.rb +18 -3
- data/spec/models/redirect_spec.rb +3 -0
- data/spec/spec_helper.rb +1 -0
- metadata +7 -4
data/Guardfile
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
guard 'spork', :cucumber_env => { 'RACK_ENV' => 'test' }, :rspec_env => { 'RACK_ENV' => 'test' } do
|
5
5
|
watch('Gemfile')
|
6
6
|
watch('Gemfile.lock')
|
7
|
-
watch(
|
7
|
+
watch(%r{spec/.+\.rb})
|
8
8
|
watch(%r{features/support/.+\.rb$})
|
9
9
|
watch(%r{^lib/.+\.rb$})
|
10
10
|
end
|
@@ -3,29 +3,32 @@ Feature: use doubles via api
|
|
3
3
|
As a developer
|
4
4
|
I want to mock rest services my app is consuming from
|
5
5
|
|
6
|
+
@now
|
6
7
|
Scenario Outline: create double
|
7
|
-
When I create a double with "<fullpath>" as fullpath, "<content>" as response content
|
8
|
-
Then there should be 1 double with "<fullpath>" as fullpath, "<content>" as response content
|
8
|
+
When I create a double with "<fullpath>" as fullpath, "<content>" as response content, "<verb>" as request verb and status as "<status>"
|
9
|
+
Then there should be 1 double with "<fullpath>" as fullpath, "<content>" as response content, "<result_verb>" as request verb and status as "<result_status>"
|
9
10
|
|
10
11
|
Examples:
|
11
|
-
| fullpath | content | verb
|
12
|
-
| /api/something | created | POST | POST
|
13
|
-
| /api/sss | changed | PUT | PUT |
|
14
|
-
| /api/asdfsf | removed | DELETE | DELETE
|
15
|
-
| /api/some | text content | GET | GET |
|
16
|
-
| /api/some?a=3&b=dd | more content | | GET |
|
12
|
+
| fullpath | content | verb | result_verb | status | result_status |
|
13
|
+
| /api/something | created | POST | POST | 200 | 200 |
|
14
|
+
| /api/sss | changed | PUT | PUT | 201 | 201 |
|
15
|
+
| /api/asdfsf | removed | DELETE | DELETE | 300 | 300 |
|
16
|
+
| /api/some | text content | GET | GET | 303 | 303 |
|
17
|
+
| /api/some?a=3&b=dd | more content | | GET | | 200 |
|
18
|
+
| /api/empty | | POST | POST | | 200 |
|
17
19
|
|
18
20
|
Scenario Outline: request fullpath that matches double
|
19
|
-
Given there is double with "<fullpath>" as fullpath, "<content>" as response content
|
21
|
+
Given there is double with "<fullpath>" as fullpath, "<content>" as response content, "<verb>" as request verb and "<status>" as status
|
20
22
|
When I "<verb>" "<fullpath>"
|
21
|
-
Then I should get "<content>" in response content
|
23
|
+
Then I should get "<status>" as response status and "<content>" in response content
|
22
24
|
|
23
25
|
Examples:
|
24
|
-
| fullpath | content | verb |
|
25
|
-
| /api/something | created | POST |
|
26
|
-
| /api/sss | changed | PUT |
|
27
|
-
| /api/asdfsf | removed | DELETE |
|
28
|
-
| /api/some?a=3&b=dd | more content | GET |
|
26
|
+
| fullpath | content | verb | status |
|
27
|
+
| /api/something | created | POST | 200 |
|
28
|
+
| /api/sss | changed | PUT | 201 |
|
29
|
+
| /api/asdfsf | removed | DELETE | 202 |
|
30
|
+
| /api/some?a=3&b=dd | more content | GET | 203 |
|
31
|
+
| /other/api | | GET | 303 |
|
29
32
|
|
30
33
|
# current rule: last added double gets picked
|
31
34
|
Scenario Outline: request fullpath that matches multiple doubles
|
@@ -9,25 +9,25 @@ When /^I create a double with "([^"]*)" as fullpath and "([^"]*)" as response co
|
|
9
9
|
last_response.should be_ok
|
10
10
|
end
|
11
11
|
|
12
|
-
When /^I create a double with "([^"]*)" as fullpath, "([^"]*)" as response content
|
13
|
-
post '/doubles', { :fullpath => fullpath, :content => content, :verb => verb }
|
12
|
+
When /^I create a double with "([^""]*)" as fullpath, "([^""]*)" as response content, "([^""]*)" as request verb and status as "([^""]*)"$/ do |fullpath, content, verb, status|
|
13
|
+
post '/doubles', { :fullpath => fullpath, :content => content, :verb => verb, :status => status }
|
14
14
|
last_response.should be_ok
|
15
15
|
end
|
16
16
|
|
17
17
|
Then /^there should be (#{CAPTURE_A_NUMBER}) double with "([^"]*)" as fullpath and "([^"]*)" as response content$/ do |n, fullpath, content|
|
18
|
-
Double.where(:fullpath => fullpath, :content => content).count.should ==
|
18
|
+
Double.where(:fullpath => fullpath, :content => content).count.should == n
|
19
19
|
end
|
20
20
|
|
21
|
-
Then /^there should be (#{CAPTURE_A_NUMBER}) double with "([^"]*)" as fullpath, "([^"]*)" as response content
|
22
|
-
Double.where(:fullpath => fullpath, :content => content, :verb => verb).count.should == n
|
21
|
+
Then /^there should be (#{CAPTURE_A_NUMBER}) double with "([^""]*)" as fullpath, "([^""]*)" as response content, "([^""]*)" as request verb and status as "(#{CAPTURE_A_NUMBER})"$/ do |n, fullpath, content, verb, status|
|
22
|
+
Double.where(:fullpath => fullpath, :content => content, :verb => verb, :status => status).count.should == n
|
23
23
|
end
|
24
24
|
|
25
25
|
Given /^there is double with "([^"]*)" as fullpath and "([^"]*)" as response content$/ do |fullpath, content|
|
26
26
|
Double.create(:fullpath => fullpath, :content => content)
|
27
27
|
end
|
28
28
|
|
29
|
-
Given /^there is double with "([^"]*)" as fullpath, "([^"]*)" as response content
|
30
|
-
Double.create(:fullpath => fullpath, :content => content, :verb => verb)
|
29
|
+
Given /^there is double with "([^"]*)" as fullpath, "([^"]*)" as response content, "([^"]*)" as request verb and "([^"]*)" as status$/ do |fullpath, content, verb, status|
|
30
|
+
Double.create(:fullpath => fullpath, :content => content, :verb => verb, :status => status)
|
31
31
|
end
|
32
32
|
|
33
33
|
Given /^I register "([^"]*)" as fullpath and "([^"]*)" as response content$/ do |fullpath, content|
|
@@ -43,7 +43,8 @@ When /^I "([^"]*)" "([^"]*)"$/ do |verb, fullpath|
|
|
43
43
|
send(verb.downcase, fullpath)
|
44
44
|
end
|
45
45
|
|
46
|
-
Then /^I should get "([^"]*)" in response content$/ do |content|
|
46
|
+
Then /^I should get (?:"(#{CAPTURE_A_NUMBER})" as response status and )?"([^"]*)" in response content$/ do |status, content|
|
47
|
+
last_response.status.should == status if status.present?
|
47
48
|
last_response.body.should == content
|
48
49
|
end
|
49
50
|
|
@@ -1,13 +1,18 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
1
3
|
class Double < ActiveRecord::Base
|
2
|
-
attr_accessible :fullpath, :content, :description, :verb
|
4
|
+
attr_accessible :fullpath, :content, :description, :verb, :status
|
3
5
|
|
4
|
-
|
6
|
+
VERBS = %w{GET POST PUT DELETE}
|
7
|
+
STATUSES = Net::HTTPResponse::CODE_TO_OBJ.keys.map(&:to_i)
|
5
8
|
|
6
|
-
validates_presence_of :fullpath
|
7
|
-
validates_inclusion_of :verb, :in =>
|
9
|
+
validates_presence_of :fullpath
|
10
|
+
validates_inclusion_of :verb, :in => VERBS
|
11
|
+
validates_inclusion_of :status, :in => STATUSES
|
8
12
|
|
9
13
|
before_save :toggle_active
|
10
14
|
before_validation :set_verb
|
15
|
+
before_validation :set_status
|
11
16
|
after_destroy :set_active
|
12
17
|
|
13
18
|
has_many :requests
|
@@ -25,6 +30,10 @@ class Double < ActiveRecord::Base
|
|
25
30
|
self.verb = 'GET' unless verb.present?
|
26
31
|
end
|
27
32
|
|
33
|
+
def set_status
|
34
|
+
self.status = 200 unless status.present?
|
35
|
+
end
|
36
|
+
|
28
37
|
def set_active
|
29
38
|
if active && f = Double.where(:fullpath => fullpath).last
|
30
39
|
f.active = true
|
@@ -27,7 +27,7 @@ module RestAssured
|
|
27
27
|
end
|
28
28
|
|
29
29
|
router.post /^\/doubles(\.json)?$/ do |passes_json|
|
30
|
-
f = { :fullpath => params['fullpath'], :content => params['content'], :description => params['description'], :verb => params['verb'] }
|
30
|
+
f = { :fullpath => params['fullpath'], :content => params['content'], :description => params['description'], :verb => params['verb'], :status => params['status'] }
|
31
31
|
|
32
32
|
@double = Double.create(passes_json ? JSON.parse(request.body.read)['double'] : ( params['double'] || f ))
|
33
33
|
|
@@ -10,6 +10,7 @@ class Response
|
|
10
10
|
d.requests.create!(:rack_env => env.to_json, :body => body, :params => request.params.to_json)
|
11
11
|
|
12
12
|
app.body d.content
|
13
|
+
app.status d.status
|
13
14
|
elsif r = Redirect.ordered.find { |r| request.fullpath =~ /#{r.pattern}/ }
|
14
15
|
app.redirect( "#{r.to}#{request.fullpath}" )
|
15
16
|
else
|
data/lib/rest-assured/version.rb
CHANGED
@@ -2,13 +2,13 @@ require File.expand_path('../../spec_helper', __FILE__)
|
|
2
2
|
|
3
3
|
describe 'Double routes' do
|
4
4
|
let :test_double do
|
5
|
-
{ :fullpath => '/api/google?a=5', :content => 'some awesome content', :verb => 'POST' }
|
5
|
+
{ :fullpath => '/api/google?a=5', :content => 'some awesome content', :verb => 'POST', :status => '201' }
|
6
6
|
end
|
7
7
|
let :valid_params do
|
8
|
-
{ 'double[fullpath]' => test_double[:fullpath], 'double[content]' => test_double[:content], 'double[verb]' => test_double[:verb] }
|
8
|
+
{ 'double[fullpath]' => test_double[:fullpath], 'double[content]' => test_double[:content], 'double[verb]' => test_double[:verb], 'double[status]' => test_double[:status] }
|
9
9
|
end
|
10
10
|
let :invalid_params do
|
11
|
-
|
11
|
+
valid_params.except('double[fullpath]')
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "through ui", :ui => true do
|
@@ -46,7 +46,7 @@ describe 'Double routes' do
|
|
46
46
|
post '/doubles', invalid_params
|
47
47
|
|
48
48
|
last_response.should be_ok
|
49
|
-
last_response.body.should =~ /Crumps!.*
|
49
|
+
last_response.body.should =~ /Crumps!.*Fullpath can't be blank/
|
50
50
|
end
|
51
51
|
|
52
52
|
it "brings up double edit form" do
|
@@ -99,10 +99,10 @@ describe 'Double routes' do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
it "reports failure when creating with invalid parameters" do
|
102
|
-
post '/doubles', test_double.except(:
|
102
|
+
post '/doubles', test_double.except(:fullpath)
|
103
103
|
|
104
104
|
last_response.should_not be_ok
|
105
|
-
last_response.body.should =~ /\{"
|
105
|
+
last_response.body.should =~ /\{"fullpath":\["can't be blank"\]\}/
|
106
106
|
end
|
107
107
|
|
108
108
|
it "deletes all doubles" do
|
@@ -125,10 +125,10 @@ describe 'Double routes' do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it "reports failure when creating with invalid parameters" do
|
128
|
-
post '/doubles.json', { :double => test_double.except(:
|
128
|
+
post '/doubles.json', { :double => test_double.except(:fullpath) }.to_json, 'CONTENT_TYPE' => 'Application/json'
|
129
129
|
|
130
130
|
last_response.should_not be_ok
|
131
|
-
last_response.body.should =~ /\{"
|
131
|
+
last_response.body.should =~ /\{"fullpath":\["can't be blank"\]\}/
|
132
132
|
end
|
133
133
|
|
134
134
|
it 'loads double as AR resource' do
|
@@ -22,12 +22,32 @@ describe Response do
|
|
22
22
|
}
|
23
23
|
let(:rest_assured_app) { double('App', :request => request).as_null_object }
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
context 'when double matches request' do
|
26
|
+
before do
|
27
|
+
@double = Double.create :fullpath => '/some/path', :content => 'content', :status => 201
|
28
|
+
request.stub(:fullpath).and_return(@double.fullpath)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
+
it "returns double content" do
|
32
|
+
rest_assured_app.should_receive(:body).with(@double.content)
|
33
|
+
|
34
|
+
Response.perform(rest_assured_app)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'sets response status to the one from double' do
|
38
|
+
rest_assured_app.should_receive(:status).with(@double.status)
|
39
|
+
|
40
|
+
Response.perform(rest_assured_app)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'records request' do
|
44
|
+
requests = double
|
45
|
+
Double.stub_chain('where.first').and_return(double(:requests => requests).as_null_object)
|
46
|
+
|
47
|
+
requests.should_receive(:create!).with(:rack_env => 'env', :body => 'body', :params => 'params')
|
48
|
+
|
49
|
+
Response.perform(rest_assured_app)
|
50
|
+
end
|
31
51
|
end
|
32
52
|
|
33
53
|
it "redirects if double not hit but there is redirect that matches request" do
|
@@ -46,15 +66,6 @@ describe Response do
|
|
46
66
|
Response.perform(rest_assured_app)
|
47
67
|
end
|
48
68
|
|
49
|
-
it 'records request if double matches' do
|
50
|
-
requests = double
|
51
|
-
Double.stub_chain('where.first').and_return(double(:requests => requests).as_null_object)
|
52
|
-
|
53
|
-
requests.should_receive(:create!).with(:rack_env => 'env', :body => 'body', :params => 'params')
|
54
|
-
|
55
|
-
Response.perform(rest_assured_app)
|
56
|
-
end
|
57
|
-
|
58
69
|
it 'excludes "rack.input" and "rack.errors" as they break with "IOError - not opened for reading:" on consequent #to_json (as they are IO and StringIO)' do
|
59
70
|
requests = double.as_null_object
|
60
71
|
Double.stub_chain('where.first').and_return(double(:requests => requests).as_null_object)
|
data/spec/models/double_spec.rb
CHANGED
@@ -2,19 +2,34 @@ require File.expand_path('../../spec_helper', __FILE__)
|
|
2
2
|
|
3
3
|
describe Double do
|
4
4
|
let :valid_params do
|
5
|
-
{ :fullpath => '/some/api', :content => 'some content', :verb => 'GET' }
|
5
|
+
{ :fullpath => '/some/api', :content => 'some content', :verb => 'GET', :status => '303' }
|
6
6
|
end
|
7
7
|
|
8
8
|
it { should validate_presence_of(:fullpath) }
|
9
|
-
it { should
|
10
|
-
|
9
|
+
it { should validate_inclusion_of(:verb, Double::VERBS) }
|
10
|
+
it { should validate_inclusion_of(:status, Double::STATUSES) }
|
11
|
+
it { should allow_mass_assignment_of(:fullpath) }
|
12
|
+
it { should allow_mass_assignment_of(:content) }
|
13
|
+
it { should allow_mass_assignment_of(:verb) }
|
14
|
+
it { should allow_mass_assignment_of(:status) }
|
15
|
+
|
11
16
|
it { should have_many(:requests) }
|
12
17
|
|
18
|
+
it 'creates double with valid params' do
|
19
|
+
d = Double.new valid_params
|
20
|
+
d.should be_valid
|
21
|
+
end
|
22
|
+
|
13
23
|
it "defaults verb to GET" do
|
14
24
|
f = Double.create valid_params.except(:verb)
|
15
25
|
f.verb.should == 'GET'
|
16
26
|
end
|
17
27
|
|
28
|
+
it "defaults status to 200" do
|
29
|
+
f = Double.create valid_params.except(:status)
|
30
|
+
f.status.should == 200
|
31
|
+
end
|
32
|
+
|
18
33
|
it "makes double active by default" do
|
19
34
|
f = Double.create valid_params.except(:active)
|
20
35
|
f.active.should be true
|
@@ -8,6 +8,9 @@ describe Redirect do
|
|
8
8
|
|
9
9
|
it { should validate_presence_of(:pattern) }
|
10
10
|
it { should validate_presence_of(:to) }
|
11
|
+
it { should allow_mass_assignment_of(:pattern) }
|
12
|
+
it { should allow_mass_assignment_of(:to) }
|
13
|
+
it { should allow_mass_assignment_of(:position) }
|
11
14
|
# commented out since it doesn't work with :allow_blank => true
|
12
15
|
#it { should validate_uniqueness_of(:position) }
|
13
16
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-assured
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15424063
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 0.2.0.
|
11
|
+
- 5
|
12
|
+
version: 0.2.0.rc5
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Artem Avetisyan
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-10-
|
20
|
+
date: 2011-10-21 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: sinatra
|
@@ -158,6 +158,7 @@ files:
|
|
158
158
|
- db/migrate/20110912163705_rename_fixtures_to_doubles.rb
|
159
159
|
- db/migrate/20111013122857_create_requests.rb
|
160
160
|
- db/migrate/20111016174101_rename_method_to_verb.rb
|
161
|
+
- db/migrate/20111021113953_add_status_to_doubles.rb
|
161
162
|
- features/call_history.feature
|
162
163
|
- features/doubles_via_api.feature
|
163
164
|
- features/doubles_via_ui.feature
|
@@ -204,6 +205,7 @@ files:
|
|
204
205
|
- public/javascript/jquery.jgrowl_minimized.js
|
205
206
|
- rest-assured.gemspec
|
206
207
|
- spec/client/resource_double_spec.rb
|
208
|
+
- spec/custom_matchers.rb
|
207
209
|
- spec/functional/double_routes_spec.rb
|
208
210
|
- spec/functional/redirect_routes_spec.rb
|
209
211
|
- spec/functional/response_spec.rb
|
@@ -274,6 +276,7 @@ test_files:
|
|
274
276
|
- features/support/selenium-fix.rb
|
275
277
|
- features/support/test-server.rb
|
276
278
|
- spec/client/resource_double_spec.rb
|
279
|
+
- spec/custom_matchers.rb
|
277
280
|
- spec/functional/double_routes_spec.rb
|
278
281
|
- spec/functional/redirect_routes_spec.rb
|
279
282
|
- spec/functional/response_spec.rb
|