rest-assured 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +9 -4
- data/bin/console +2 -1
- data/features/step_definitions/doubles_steps.rb +8 -1
- data/features/web_ui/doubles.feature +16 -16
- data/lib/rest-assured/api/app_session.rb +3 -21
- data/lib/rest-assured/routes/double.rb +6 -0
- data/lib/rest-assured/version.rb +1 -1
- data/spec/api/app_session_spec.rb +11 -37
- data/spec/api/resource_double_spec.rb +7 -0
- data/spec/api/server_spec.rb +15 -16
- data/spec/functional/double_routes_spec.rb +23 -9
- data/spec/spec_helper.rb +5 -8
- data/views/doubles/_form.haml +6 -0
- data/views/doubles/index.haml +2 -0
- metadata +15 -22
- data/lib/rest-assured/api/app_runner.rb +0 -18
- data/lib/rest-assured/utils/drb_sniffer.rb +0 -11
- data/lib/rest-assured/utils/subprocess.rb +0 -41
- data/spec/api/app_runner_spec.rb +0 -27
- data/spec/subprocess_spec.rb +0 -114
data/README.markdown
CHANGED
@@ -7,13 +7,13 @@
|
|
7
7
|
A tool for stubbing/spying on http(s) based services that your app under test interacts with. This is useful for blackbox/integration testing.
|
8
8
|
There are three main use cases:
|
9
9
|
|
10
|
-
*
|
10
|
+
* stub out external data sources with predefined data
|
11
11
|
* verify requests to external services (aka spying)
|
12
12
|
* simulate different behavior of external services using web UI; useful in development
|
13
13
|
|
14
14
|
## Usage
|
15
15
|
|
16
|
-
You are going to need ruby >= 1.8.7.
|
16
|
+
You are going to need MRI ruby >= 1.8.7 on Linux/MacOS.
|
17
17
|
|
18
18
|
Rest-assured requires a database to run. Either sqlite or mysql. So, make sure there is one and its backed with corresponding client gem:
|
19
19
|
|
@@ -72,7 +72,7 @@ RestAssured::Double.create(fullpath: '/products', content: 'this is content')
|
|
72
72
|
|
73
73
|
Now GET `http://localhost:4578/products` will be returning `this is content`.
|
74
74
|
|
75
|
-
You can also verify what requests happen on a double
|
75
|
+
You can also verify what requests happen on a double (spy on it). Say this is a Given part of a test:
|
76
76
|
|
77
77
|
```ruby
|
78
78
|
@double = RestAssured::Double.create(fullpath: '/products', verb: 'POST')
|
@@ -198,9 +198,14 @@ Here is the rest API for managing redirects:
|
|
198
198
|
|
199
199
|
## Changelog
|
200
200
|
|
201
|
+
#### 1.1.1 (01 Mar 2012)
|
202
|
+
|
203
|
+
* Add 'verb' to UI
|
204
|
+
* No more forked version of Server
|
205
|
+
|
201
206
|
#### 1.1.0 (17 Feb 2012)
|
202
207
|
|
203
|
-
* Redirects
|
208
|
+
* Redirects support 'real' (without http redirect) rewrite to local double
|
204
209
|
|
205
210
|
#### 1.0.0 (14 Feb 2012)
|
206
211
|
|
data/bin/console
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
2
3
|
require "irb"
|
3
4
|
|
4
5
|
$:.push File.expand_path('../../lib', __FILE__)
|
@@ -6,6 +7,6 @@ $:.push File.expand_path('../../lib', __FILE__)
|
|
6
7
|
require 'rest-assured/config'
|
7
8
|
RestAssured::Config.build :database => ( ENV['FRS_DB'] || File.expand_path('../../db/development.db', __FILE__) )
|
8
9
|
|
9
|
-
require 'rest-assured'
|
10
|
+
require 'rest-assured/application'
|
10
11
|
|
11
12
|
IRB.start(__FILE__)
|
@@ -71,7 +71,12 @@ end
|
|
71
71
|
|
72
72
|
Given /^the following doubles exist:$/ do |doubles|
|
73
73
|
doubles.hashes.each do |row|
|
74
|
-
RestAssured::Models::Double.create(
|
74
|
+
RestAssured::Models::Double.create(
|
75
|
+
:fullpath => row['fullpath'],
|
76
|
+
:description => row['description'],
|
77
|
+
:content => row['content'],
|
78
|
+
:verb => row['verb']
|
79
|
+
)
|
75
80
|
end
|
76
81
|
end
|
77
82
|
|
@@ -83,6 +88,7 @@ Then /^I should see existing doubles:$/ do |doubles|
|
|
83
88
|
doubles.hashes.each do |row|
|
84
89
|
page.should have_content(row[:fullpath])
|
85
90
|
page.should have_content(row[:description])
|
91
|
+
page.should have_content(row[:verb])
|
86
92
|
end
|
87
93
|
end
|
88
94
|
|
@@ -99,6 +105,7 @@ When /^I enter double details:$/ do |details|
|
|
99
105
|
|
100
106
|
fill_in 'Request fullpath', :with => double['fullpath']
|
101
107
|
fill_in 'Content', :with => double['content']
|
108
|
+
select double['verb'], :from => 'Verb'
|
102
109
|
fill_in 'Description', :with => double['description']
|
103
110
|
end
|
104
111
|
|
@@ -6,29 +6,29 @@ Feature: manage doubles via ui
|
|
6
6
|
|
7
7
|
Scenario: view existing doubles
|
8
8
|
Given the following doubles exist:
|
9
|
-
| fullpath
|
10
|
-
| /url1/aaa | twitter | test content |
|
11
|
-
| /url2/bbb | geo location | more content |
|
12
|
-
| /u/b?c=1 | wikipedia | article |
|
9
|
+
| fullpath | description | content | verb |
|
10
|
+
| /url1/aaa | twitter | test content | GET |
|
11
|
+
| /url2/bbb | geo location | more content | POST |
|
12
|
+
| /u/b?c=1 | wikipedia | article | PUT |
|
13
13
|
When I visit "doubles" page
|
14
14
|
Then I should see that I am on "doubles" page
|
15
15
|
And I should see existing doubles:
|
16
|
-
| fullpath
|
17
|
-
| /url1/aaa | twitter |
|
18
|
-
| /url2/bbb | geo location |
|
19
|
-
| /u/b?c=1 | wikipedia |
|
16
|
+
| fullpath | description | verb |
|
17
|
+
| /url1/aaa | twitter | GET |
|
18
|
+
| /url2/bbb | geo location | POST |
|
19
|
+
| /u/b?c=1 | wikipedia | PUT |
|
20
20
|
|
21
21
|
Scenario: add new double
|
22
22
|
Given I am on "doubles" page
|
23
23
|
When I choose to create a double
|
24
24
|
And I enter double details:
|
25
|
-
| fullpath
|
26
|
-
| /url2/bb?a=b5 | google api | test content |
|
25
|
+
| fullpath | description | content | verb |
|
26
|
+
| /url2/bb?a=b5 | google api | test content | POST |
|
27
27
|
And I save it
|
28
28
|
Then I should see "Double created"
|
29
29
|
And I should see existing doubles:
|
30
|
-
| fullpath
|
31
|
-
| /url2/bb?a=b5 | google api |
|
30
|
+
| fullpath | description | verb |
|
31
|
+
| /url2/bb?a=b5 | google api | POST |
|
32
32
|
|
33
33
|
@javascript
|
34
34
|
Scenario: choose active double
|
@@ -41,16 +41,16 @@ Feature: manage doubles via ui
|
|
41
41
|
|
42
42
|
Scenario: edit double
|
43
43
|
Given the following doubles exist:
|
44
|
-
| fullpath
|
45
|
-
| /url1/aaa | twitter
|
44
|
+
| fullpath | description | content | verb |
|
45
|
+
| /url1/aaa | twitter | test content | POST |
|
46
46
|
And I visit "doubles" page
|
47
47
|
And I choose to edit double
|
48
48
|
When I change "double" "description" to "google"
|
49
49
|
And I save it
|
50
50
|
Then I should see that I am on "doubles" page
|
51
51
|
And I should see existing doubles:
|
52
|
-
| fullpath
|
53
|
-
| /url1/aaa | google
|
52
|
+
| fullpath | description | verb |
|
53
|
+
| /url1/aaa | google | POST |
|
54
54
|
|
55
55
|
@javascript
|
56
56
|
Scenario: delete double
|
@@ -1,29 +1,11 @@
|
|
1
|
-
require 'rest-assured/utils/subprocess'
|
2
|
-
require 'rest-assured/utils/drb_sniffer'
|
3
|
-
require 'rest-assured/api/app_runner'
|
4
1
|
require 'childprocess'
|
5
2
|
|
6
3
|
module RestAssured
|
7
4
|
class AppSession
|
8
|
-
include Utils::DrbSniffer
|
9
|
-
|
10
5
|
def initialize
|
11
|
-
@child =
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
else
|
16
|
-
child = ChildProcess.build('rest-assured', *Config.to_cmdargs)
|
17
|
-
child.io.inherit!
|
18
|
-
child.start
|
19
|
-
child
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def alive?
|
24
|
-
@child.alive?
|
25
|
-
rescue Errno::ECHILD
|
26
|
-
false
|
6
|
+
@child = ChildProcess.build('rest-assured', *Config.to_cmdargs)
|
7
|
+
@child.io.inherit!
|
8
|
+
@child.start
|
27
9
|
end
|
28
10
|
|
29
11
|
def method_missing(*args)
|
data/lib/rest-assured/version.rb
CHANGED
@@ -4,48 +4,22 @@ require File.expand_path('../../../lib/rest-assured/api/app_session', __FILE__)
|
|
4
4
|
|
5
5
|
module RestAssured
|
6
6
|
describe AppSession do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
7
|
+
it 'starts application in childprocess' do
|
8
|
+
cmdargs = %w{-d :memory: -p 6666}
|
9
|
+
Config.stub(:to_cmdargs => cmdargs)
|
11
10
|
|
12
|
-
|
13
|
-
state = ''
|
14
|
-
Utils::Subprocess.should_receive(:new) do |&block|
|
15
|
-
state << 'called from block'
|
16
|
-
block.call
|
17
|
-
state = ''
|
18
|
-
end
|
19
|
-
AppRunner.should_receive(:run!) do
|
20
|
-
state.should == 'called from block'
|
21
|
-
end
|
11
|
+
ChildProcess.should_receive(:build).with('rest-assured', *cmdargs).and_return(child = mock(:io => mock))
|
22
12
|
|
23
|
-
|
13
|
+
state = ''
|
14
|
+
child.io.should_receive(:inherit!) do
|
15
|
+
state.should_not == 'started'
|
24
16
|
end
|
25
|
-
|
26
|
-
|
27
|
-
context 'within spork prefork block' do
|
28
|
-
before do
|
29
|
-
AppSession.any_instance.stub(:running_in_spork? => true)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'starts application in childprocess' do
|
33
|
-
cmdargs = %w{-d :memory: -p 6666}
|
34
|
-
Config.stub(:to_cmdargs => cmdargs)
|
35
|
-
|
36
|
-
ChildProcess.should_receive(:build).with('rest-assured', *cmdargs).and_return(child = mock(:io => mock))
|
37
|
-
|
38
|
-
state = ''
|
39
|
-
child.io.should_receive(:inherit!) do
|
40
|
-
state.should_not == 'started'
|
41
|
-
end
|
42
|
-
child.should_receive(:start) do
|
43
|
-
state << 'started'
|
44
|
-
end
|
45
|
-
|
46
|
-
AppSession.new
|
17
|
+
child.should_receive(:start) do
|
18
|
+
state << 'started'
|
47
19
|
end
|
48
20
|
|
21
|
+
AppSession.new
|
49
22
|
end
|
23
|
+
|
50
24
|
end
|
51
25
|
end
|
@@ -3,6 +3,13 @@ require File.expand_path('../../spec_helper', __FILE__)
|
|
3
3
|
|
4
4
|
module RestAssured
|
5
5
|
describe Double, 'ruby-api' => true do
|
6
|
+
before(:all) do
|
7
|
+
Server.start(DB_OPTS.merge(:port => 9877))
|
8
|
+
end
|
9
|
+
after(:all) do
|
10
|
+
Server.stop
|
11
|
+
end
|
12
|
+
|
6
13
|
it { should be_kind_of ActiveResource::Base }
|
7
14
|
|
8
15
|
it 'creates new double' do
|
data/spec/api/server_spec.rb
CHANGED
@@ -3,15 +3,17 @@ require File.expand_path('../../../lib/rest-assured/api/server', __FILE__)
|
|
3
3
|
|
4
4
|
module RestAssured
|
5
5
|
describe Server do
|
6
|
-
|
6
|
+
around do |example|
|
7
|
+
Server.reset_instance
|
8
|
+
example.run
|
7
9
|
Server.reset_instance
|
8
10
|
end
|
9
11
|
|
10
12
|
it 'khows when it is up' do
|
11
13
|
AppSession.stub(:new).and_return(session = stub(:alive? => true).as_null_object)
|
12
14
|
Utils::PortExplorer.stub(:port_free? => false)
|
13
|
-
Server.start
|
14
15
|
|
16
|
+
Server.start
|
15
17
|
Server.up?.should == true
|
16
18
|
end
|
17
19
|
|
@@ -120,21 +122,18 @@ module RestAssured
|
|
120
122
|
end
|
121
123
|
|
122
124
|
it 'stops application subprocess when current process exits' do
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
end
|
133
|
-
Process.wait
|
134
|
-
res_file.read.should == 'stopped'
|
135
|
-
else
|
136
|
-
pending "Skipped: drb/spork breaks fork sandbox (at_exits are collected and fired all together on master process exit)"
|
125
|
+
res_file = Tempfile.new('res')
|
126
|
+
AppSession.stub(:new).and_return(session = mock.as_null_object)
|
127
|
+
session.stub(:alive?).and_return(false)
|
128
|
+
session.stub(:stop) do
|
129
|
+
res_file.write "stopped"
|
130
|
+
res_file.rewind
|
131
|
+
end
|
132
|
+
fork do
|
133
|
+
Server.start!
|
137
134
|
end
|
135
|
+
Process.wait
|
136
|
+
res_file.read.should == 'stopped'
|
138
137
|
end
|
139
138
|
end
|
140
139
|
end
|
@@ -6,6 +6,7 @@ module RestAssured
|
|
6
6
|
{
|
7
7
|
:fullpath => '/api/google?a=5',
|
8
8
|
:content => 'some awesome content',
|
9
|
+
:description => 'awesome double',
|
9
10
|
:verb => 'POST',
|
10
11
|
:status => '201',
|
11
12
|
:response_headers => { 'ACCEPT' => 'text/html' }
|
@@ -18,6 +19,7 @@ module RestAssured
|
|
18
19
|
'double[content]' => test_double[:content],
|
19
20
|
'double[verb]' => test_double[:verb],
|
20
21
|
'double[status]' => test_double[:status],
|
22
|
+
'double[description]' => test_double[:description],
|
21
23
|
'double[response_headers]' => test_double[:response_headers]
|
22
24
|
}
|
23
25
|
|
@@ -28,25 +30,33 @@ module RestAssured
|
|
28
30
|
valid_params.except('double[fullpath]')
|
29
31
|
end
|
30
32
|
|
31
|
-
|
32
|
-
it "
|
33
|
+
context "Web UI", :ui => true do
|
34
|
+
it "makes doubles index root page" do
|
33
35
|
visit '/'
|
34
36
|
current_path.should == '/doubles'
|
35
37
|
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
+
# this is tested in cucumber
|
40
|
+
it "renders doubles index" do
|
41
|
+
f = Models::Double.create test_double
|
42
|
+
f1 = Models::Double.create test_double.merge(:verb => 'GET')
|
39
43
|
|
40
44
|
visit '/doubles'
|
41
45
|
|
42
46
|
page.should have_content(f.fullpath)
|
47
|
+
page.should have_content(f.description)
|
48
|
+
page.should have_content(f.verb)
|
49
|
+
page.should have_content(f1.fullpath)
|
50
|
+
page.should have_content(f1.description)
|
51
|
+
page.should have_content(f1.verb)
|
43
52
|
end
|
44
53
|
|
45
|
-
it "
|
54
|
+
it "renders form for creating new double" do
|
46
55
|
visit '/doubles/new'
|
47
56
|
|
48
57
|
page.should have_css('#double_fullpath')
|
49
58
|
page.should have_css('#double_content')
|
59
|
+
page.should have_css('#double_verb')
|
50
60
|
page.should have_css('#double_description')
|
51
61
|
end
|
52
62
|
|
@@ -68,7 +78,7 @@ module RestAssured
|
|
68
78
|
last_response.body.should =~ /Crumps!.*Fullpath can't be blank/
|
69
79
|
end
|
70
80
|
|
71
|
-
it "
|
81
|
+
it "renders double edit form" do
|
72
82
|
f = Models::Double.create test_double
|
73
83
|
visit "/doubles/#{f.id}/edit"
|
74
84
|
|
@@ -84,7 +94,11 @@ module RestAssured
|
|
84
94
|
|
85
95
|
last_request.fullpath.should == '/doubles'
|
86
96
|
last_response.body.should =~ /Double updated/
|
87
|
-
f.reload.fullpath.should
|
97
|
+
f.reload.fullpath.should == '/some/other/api'
|
98
|
+
f.content.should == test_double[:content]
|
99
|
+
f.verb.should == test_double[:verb]
|
100
|
+
f.status.to_s.should == test_double[:status]
|
101
|
+
f.response_headers.should == test_double[:response_headers]
|
88
102
|
end
|
89
103
|
|
90
104
|
it "chooses active double" do
|
@@ -109,7 +123,7 @@ module RestAssured
|
|
109
123
|
end
|
110
124
|
end
|
111
125
|
|
112
|
-
|
126
|
+
context "REST api", :ui => false do
|
113
127
|
it "creates double" do
|
114
128
|
post '/doubles', test_double
|
115
129
|
|
@@ -136,7 +150,7 @@ module RestAssured
|
|
136
150
|
end
|
137
151
|
end
|
138
152
|
|
139
|
-
|
153
|
+
context 'REST (ActiveResource compatible) json api', :ui => false do
|
140
154
|
it "creates double as AR resource" do
|
141
155
|
post '/doubles.json', { :double => test_double }.to_json, 'CONTENT_TYPE' => 'Application/json'
|
142
156
|
|
data/spec/spec_helper.rb
CHANGED
@@ -24,7 +24,6 @@ Spork.prefork do
|
|
24
24
|
require 'awesome_print'
|
25
25
|
require File.expand_path('../support/custom_matchers', __FILE__)
|
26
26
|
require File.expand_path('../support/reset-singleton', __FILE__)
|
27
|
-
require 'rest-assured/utils/drb_sniffer'
|
28
27
|
|
29
28
|
ENV['RACK_ENV'] = 'test'
|
30
29
|
|
@@ -40,7 +39,6 @@ Spork.prefork do
|
|
40
39
|
c.include Capybara::DSL
|
41
40
|
c.include Rack::Test::Methods
|
42
41
|
c.include XhrHelpers
|
43
|
-
c.include RestAssured::Utils::DrbSniffer
|
44
42
|
|
45
43
|
c.before(:each) do
|
46
44
|
DatabaseCleaner.start
|
@@ -65,17 +63,13 @@ Spork.prefork do
|
|
65
63
|
end
|
66
64
|
end
|
67
65
|
require 'rest-assured/config'
|
68
|
-
|
69
|
-
RestAssured::Config.build(
|
66
|
+
DB_OPTS = { :dbuser => ENV['TRAVIS'] ? "''" : "root", :adapter => 'mysql' }
|
67
|
+
RestAssured::Config.build(DB_OPTS)
|
70
68
|
|
71
69
|
require 'rest-assured'
|
72
70
|
require 'rest-assured/application'
|
73
71
|
require 'shoulda-matchers'
|
74
72
|
|
75
|
-
RestAssured::Server.start(db_opts.merge(:port => 9877))
|
76
|
-
end
|
77
|
-
|
78
|
-
Spork.each_run do
|
79
73
|
Capybara.app = RestAssured::Application
|
80
74
|
|
81
75
|
def app
|
@@ -84,3 +78,6 @@ Spork.each_run do
|
|
84
78
|
|
85
79
|
DatabaseCleaner.strategy = :truncation
|
86
80
|
end
|
81
|
+
|
82
|
+
Spork.each_run do
|
83
|
+
end
|
data/views/doubles/_form.haml
CHANGED
@@ -6,6 +6,12 @@
|
|
6
6
|
%label{:for => 'double_content'} Content*
|
7
7
|
%textarea.wide#double_content{:name => 'double[content]', :rows => 10}= @double.content
|
8
8
|
|
9
|
+
%p
|
10
|
+
%label{:for => 'double_verb'} Verb
|
11
|
+
%select#double_verb{:name => 'double[verb]'}
|
12
|
+
- verbs.each do |v|
|
13
|
+
%option{:name => v, :selected => (@double.verb == v)}= v
|
14
|
+
|
9
15
|
%p
|
10
16
|
%label{:for => 'double_description'} Description
|
11
17
|
%textarea.wide#double_description{:name => 'double[description]', :rows => 3}= @double.description
|
data/views/doubles/index.haml
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
%thead
|
5
5
|
%tr
|
6
6
|
%th Request fullpath
|
7
|
+
%th Verb
|
7
8
|
%th Description
|
8
9
|
%th Active?
|
9
10
|
%th
|
@@ -13,6 +14,7 @@
|
|
13
14
|
%tr{:id => "double_row_#{f.id}"}
|
14
15
|
- if i == 0
|
15
16
|
%td{:rowspan => fs.size}= fullpath
|
17
|
+
%td= f.verb
|
16
18
|
%td= f.description
|
17
19
|
%td.label.text-center
|
18
20
|
%input.active-double-toggle{:type => 'radio', :name => fullpath, :checked => f.active, :data => { :double_id => f.id }}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-assured
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157317900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.3.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157317900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: childprocess
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157317260 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.3.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157317260
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sinatra-flash
|
38
|
-
requirement: &
|
38
|
+
requirement: &2157316120 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2157316120
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: haml
|
49
|
-
requirement: &
|
49
|
+
requirement: &2157338020 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 3.1.3
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2157338020
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: activerecord
|
60
|
-
requirement: &
|
60
|
+
requirement: &2157335780 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 3.1.0
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2157335780
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: activeresource
|
71
|
-
requirement: &
|
71
|
+
requirement: &2157332420 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: 3.1.0
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2157332420
|
80
80
|
description:
|
81
81
|
email:
|
82
82
|
- artem.avetisyan@bbc.co.uk
|
@@ -128,7 +128,6 @@ files:
|
|
128
128
|
- features/web_ui/redirects.feature
|
129
129
|
- lib/rest-assured.rb
|
130
130
|
- lib/rest-assured/api.rb
|
131
|
-
- lib/rest-assured/api/app_runner.rb
|
132
131
|
- lib/rest-assured/api/app_session.rb
|
133
132
|
- lib/rest-assured/api/resources.rb
|
134
133
|
- lib/rest-assured/api/server.rb
|
@@ -140,9 +139,7 @@ files:
|
|
140
139
|
- lib/rest-assured/routes/double.rb
|
141
140
|
- lib/rest-assured/routes/redirect.rb
|
142
141
|
- lib/rest-assured/routes/response.rb
|
143
|
-
- lib/rest-assured/utils/drb_sniffer.rb
|
144
142
|
- lib/rest-assured/utils/port_explorer.rb
|
145
|
-
- lib/rest-assured/utils/subprocess.rb
|
146
143
|
- lib/rest-assured/version.rb
|
147
144
|
- lib/sinatra/handler_options_patch.rb
|
148
145
|
- lib/sinatra/partials.rb
|
@@ -164,7 +161,6 @@ files:
|
|
164
161
|
- public/javascript/application.js
|
165
162
|
- public/javascript/jquery.jgrowl_minimized.js
|
166
163
|
- rest-assured.gemspec
|
167
|
-
- spec/api/app_runner_spec.rb
|
168
164
|
- spec/api/app_session_spec.rb
|
169
165
|
- spec/api/resource_double_spec.rb
|
170
166
|
- spec/api/server_spec.rb
|
@@ -177,7 +173,6 @@ files:
|
|
177
173
|
- spec/models/request_spec.rb
|
178
174
|
- spec/port_explorer_spec.rb
|
179
175
|
- spec/spec_helper.rb
|
180
|
-
- spec/subprocess_spec.rb
|
181
176
|
- spec/support/custom_matchers.rb
|
182
177
|
- spec/support/reset-singleton.rb
|
183
178
|
- ssl/localhost.crt
|
@@ -211,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
206
|
version: '0'
|
212
207
|
segments:
|
213
208
|
- 0
|
214
|
-
hash:
|
209
|
+
hash: -2495133129201984062
|
215
210
|
requirements: []
|
216
211
|
rubyforge_project: rest-assured
|
217
212
|
rubygems_version: 1.8.10
|
@@ -237,7 +232,6 @@ test_files:
|
|
237
232
|
- features/support/world_helpers.rb
|
238
233
|
- features/web_ui/doubles.feature
|
239
234
|
- features/web_ui/redirects.feature
|
240
|
-
- spec/api/app_runner_spec.rb
|
241
235
|
- spec/api/app_session_spec.rb
|
242
236
|
- spec/api/resource_double_spec.rb
|
243
237
|
- spec/api/server_spec.rb
|
@@ -250,6 +244,5 @@ test_files:
|
|
250
244
|
- spec/models/request_spec.rb
|
251
245
|
- spec/port_explorer_spec.rb
|
252
246
|
- spec/spec_helper.rb
|
253
|
-
- spec/subprocess_spec.rb
|
254
247
|
- spec/support/custom_matchers.rb
|
255
248
|
- spec/support/reset-singleton.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
|
-
module RestAssured
|
4
|
-
class AppRunner
|
5
|
-
include Singleton
|
6
|
-
|
7
|
-
def run!
|
8
|
-
unless Kernel.require 'rest-assured/application'
|
9
|
-
RestAssured::Application.send(:include, Config)
|
10
|
-
end
|
11
|
-
RestAssured::Application.run!
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.method_missing(*args)
|
15
|
-
instance.send(*args)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module RestAssured
|
2
|
-
module Utils
|
3
|
-
class Subprocess
|
4
|
-
attr_reader :pid
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@pid = Kernel.fork do
|
8
|
-
trap('USR1') do
|
9
|
-
Process.kill('TERM', Process.pid) # unlike 'exit' this one is NOT being intercepted by Webrick
|
10
|
-
end
|
11
|
-
|
12
|
-
at_exit { exit! }
|
13
|
-
|
14
|
-
begin
|
15
|
-
yield
|
16
|
-
rescue => e
|
17
|
-
if defined?(EventMachine) && e.is_a?(EventMachine::ConnectionNotBound)
|
18
|
-
retry
|
19
|
-
end
|
20
|
-
puts "#{self} has raised #{e.inspect}:"
|
21
|
-
puts e.backtrace.join("\n")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
Process.detach(@pid)
|
26
|
-
at_exit { stop }
|
27
|
-
end
|
28
|
-
|
29
|
-
def alive?
|
30
|
-
Process.kill(0, @pid)
|
31
|
-
true
|
32
|
-
rescue Errno::ESRCH
|
33
|
-
false
|
34
|
-
end
|
35
|
-
|
36
|
-
def stop
|
37
|
-
Process.kill('USR1', @pid) rescue Errno::ESRCH # no such process
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/spec/api/app_runner_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
require File.expand_path('../../../lib/rest-assured/api/app_runner', __FILE__)
|
3
|
-
|
4
|
-
module RestAssured
|
5
|
-
describe AppRunner do
|
6
|
-
before do
|
7
|
-
Application.stub(:run!)
|
8
|
-
Config.stub(:included)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'requires Application' do
|
12
|
-
Kernel.should_receive(:require).with('rest-assured/application').and_return(true)
|
13
|
-
AppRunner.run!
|
14
|
-
end
|
15
|
-
it 'reloads config if Application has already been loaded' do
|
16
|
-
Kernel.stub(:require).and_return(false)
|
17
|
-
|
18
|
-
Application.should_receive(:send).with(:include, Config)
|
19
|
-
AppRunner.run!
|
20
|
-
end
|
21
|
-
it 'runs Application' do
|
22
|
-
Application.should_receive(:run!)
|
23
|
-
AppRunner.run!
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
data/spec/subprocess_spec.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require File.expand_path('../spec_helper', __FILE__)
|
3
|
-
require File.expand_path('../../lib/rest-assured/utils/subprocess', __FILE__)
|
4
|
-
|
5
|
-
module RestAssured::Utils
|
6
|
-
describe Subprocess do
|
7
|
-
|
8
|
-
it 'forks passed block' do
|
9
|
-
ppid_file = Tempfile.new('ppidfile')
|
10
|
-
pid_file = Tempfile.new('pidfile')
|
11
|
-
|
12
|
-
fork do
|
13
|
-
pid_file.write(Process.pid)
|
14
|
-
pid_file.rewind
|
15
|
-
at_exit { exit! }
|
16
|
-
Subprocess.new do
|
17
|
-
ppid_file.write(Process.ppid)
|
18
|
-
ppid_file.rewind
|
19
|
-
sleep 2
|
20
|
-
end
|
21
|
-
sleep 0.5
|
22
|
-
end
|
23
|
-
Process.wait
|
24
|
-
ppid_file.read.should == pid_file.read
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'ensures no zombies' do
|
28
|
-
Kernel.stub(:fork).and_return(pid = 1)
|
29
|
-
Process.should_receive(:detach).with(pid)
|
30
|
-
|
31
|
-
Subprocess.new {1}
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'knows when it is running' do
|
35
|
-
res_file = Tempfile.new('res')
|
36
|
-
fork do
|
37
|
-
at_exit { exit! }
|
38
|
-
child = Subprocess.new { sleep 0.5 }
|
39
|
-
res_file.write(child.alive?)
|
40
|
-
res_file.rewind
|
41
|
-
end
|
42
|
-
Process.wait
|
43
|
-
res_file.read.should == 'true'
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'shuts down child process' do
|
47
|
-
let(:child_pid) do
|
48
|
-
Tempfile.new('child_pid')
|
49
|
-
end
|
50
|
-
|
51
|
-
let(:child_alive?) do
|
52
|
-
begin
|
53
|
-
Process.kill(0, child_pid.read.to_i)
|
54
|
-
true
|
55
|
-
rescue Errno::ESRCH
|
56
|
-
false
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'when stopped' do
|
61
|
-
res_file = Tempfile.new('res')
|
62
|
-
fork do
|
63
|
-
at_exit { exit! }
|
64
|
-
child = Subprocess.new { sleep 2 }
|
65
|
-
child.stop
|
66
|
-
sleep 1
|
67
|
-
res_file.write(child.alive?)
|
68
|
-
res_file.rewind
|
69
|
-
end
|
70
|
-
Process.wait
|
71
|
-
sleep 0.5
|
72
|
-
res_file.read.should == 'false'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'when exits normally' do
|
76
|
-
if not running_in_spork?
|
77
|
-
child_pid # Magic touch. Literally. Else Tempfile gets created in fork and that messes things up
|
78
|
-
|
79
|
-
fork do
|
80
|
-
at_exit { exit! }
|
81
|
-
child = Subprocess.new { sleep 2 }
|
82
|
-
child_pid.write(child.pid)
|
83
|
-
child_pid.rewind
|
84
|
-
end
|
85
|
-
|
86
|
-
sleep 0.5
|
87
|
-
child_alive?.should == false
|
88
|
-
else
|
89
|
-
pending "Skipped: drb/spork breaks fork sandbox (at_exits are collected and fired all together on master process exit)"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'when killed violently' do
|
94
|
-
if not running_in_spork?
|
95
|
-
child_pid
|
96
|
-
|
97
|
-
fork do
|
98
|
-
at_exit { exit! }
|
99
|
-
child = Subprocess.new { sleep 2 }
|
100
|
-
child_pid.write(child.pid)
|
101
|
-
child_pid.rewind
|
102
|
-
|
103
|
-
Process.kill('TERM', Process.pid)
|
104
|
-
end
|
105
|
-
|
106
|
-
sleep 0.5
|
107
|
-
child_alive?.should == false
|
108
|
-
else
|
109
|
-
pending "Skipped: drb/spork breaks fork sandbox (at_exits are collected and fired all together on master process exit)"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|