capybara 2.6.2 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +40 -15
- data/README.md +45 -38
- data/lib/capybara.rb +86 -10
- data/lib/capybara/cucumber.rb +1 -0
- data/lib/capybara/driver/base.rb +5 -2
- data/lib/capybara/driver/node.rb +1 -0
- data/lib/capybara/dsl.rb +1 -0
- data/lib/capybara/helpers.rb +3 -2
- data/lib/capybara/node/actions.rb +6 -0
- data/lib/capybara/node/base.rb +1 -0
- data/lib/capybara/node/document.rb +1 -0
- data/lib/capybara/node/document_matchers.rb +1 -0
- data/lib/capybara/node/element.rb +1 -0
- data/lib/capybara/node/finders.rb +3 -2
- data/lib/capybara/node/matchers.rb +72 -2
- data/lib/capybara/node/simple.rb +6 -3
- data/lib/capybara/queries/base_query.rb +1 -0
- data/lib/capybara/queries/current_path_query.rb +1 -0
- data/lib/capybara/queries/match_query.rb +21 -0
- data/lib/capybara/queries/selector_query.rb +138 -0
- data/lib/capybara/queries/text_query.rb +1 -0
- data/lib/capybara/queries/title_query.rb +1 -0
- data/lib/capybara/query.rb +3 -131
- data/lib/capybara/rack_test/browser.rb +1 -0
- data/lib/capybara/rack_test/css_handlers.rb +1 -0
- data/lib/capybara/rack_test/driver.rb +6 -4
- data/lib/capybara/rack_test/form.rb +1 -0
- data/lib/capybara/rack_test/node.rb +1 -0
- data/lib/capybara/rails.rb +2 -1
- data/lib/capybara/result.rb +1 -0
- data/lib/capybara/rspec.rb +1 -0
- data/lib/capybara/rspec/features.rb +1 -0
- data/lib/capybara/rspec/matchers.rb +54 -3
- data/lib/capybara/selector.rb +175 -75
- data/lib/capybara/selector/filter.rb +48 -0
- data/lib/capybara/selenium/driver.rb +24 -7
- data/lib/capybara/selenium/node.rb +1 -0
- data/lib/capybara/server.rb +38 -6
- data/lib/capybara/session.rb +30 -14
- data/lib/capybara/session/matchers.rb +2 -1
- data/lib/capybara/spec/public/test.js +6 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +2 -1
- data/lib/capybara/spec/session/accept_confirm_spec.rb +2 -1
- data/lib/capybara/spec/session/accept_prompt_spec.rb +2 -1
- data/lib/capybara/spec/session/all_spec.rb +1 -0
- data/lib/capybara/spec/session/assert_current_path.rb +1 -0
- data/lib/capybara/spec/session/assert_selector.rb +1 -0
- data/lib/capybara/spec/session/assert_text.rb +1 -0
- data/lib/capybara/spec/session/assert_title.rb +1 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +1 -0
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +1 -0
- data/lib/capybara/spec/session/choose_spec.rb +1 -0
- data/lib/capybara/spec/session/click_button_spec.rb +1 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +1 -0
- data/lib/capybara/spec/session/click_link_spec.rb +1 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +2 -1
- data/lib/capybara/spec/session/current_url_spec.rb +1 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +2 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -1
- data/lib/capybara/spec/session/element/assert_match_selector.rb +31 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +17 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +23 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +63 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +1 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +1 -0
- data/lib/capybara/spec/session/find_button_spec.rb +1 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +1 -0
- data/lib/capybara/spec/session/find_field_spec.rb +1 -0
- data/lib/capybara/spec/session/find_link_spec.rb +1 -0
- data/lib/capybara/spec/session/find_spec.rb +1 -0
- data/lib/capybara/spec/session/first_spec.rb +1 -0
- data/lib/capybara/spec/session/go_back_spec.rb +1 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
- data/lib/capybara/spec/session/has_button_spec.rb +1 -0
- data/lib/capybara/spec/session/has_css_spec.rb +1 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +1 -0
- data/lib/capybara/spec/session/has_field_spec.rb +13 -0
- data/lib/capybara/spec/session/has_link_spec.rb +1 -0
- data/lib/capybara/spec/session/has_select_spec.rb +19 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +6 -0
- data/lib/capybara/spec/session/has_table_spec.rb +1 -0
- data/lib/capybara/spec/session/has_text_spec.rb +1 -0
- data/lib/capybara/spec/session/has_title_spec.rb +1 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
- data/lib/capybara/spec/session/headers.rb +1 -0
- data/lib/capybara/spec/session/html_spec.rb +1 -0
- data/lib/capybara/spec/session/node_spec.rb +29 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +35 -1
- data/lib/capybara/spec/session/response_code.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +3 -2
- data/lib/capybara/spec/session/save_page_spec.rb +34 -2
- data/lib/capybara/spec/session/save_screenshot_spec.rb +31 -1
- data/lib/capybara/spec/session/screenshot_spec.rb +3 -1
- data/lib/capybara/spec/session/select_spec.rb +1 -0
- data/lib/capybara/spec/session/selectors_spec.rb +35 -0
- data/lib/capybara/spec/session/text_spec.rb +1 -0
- data/lib/capybara/spec/session/title_spec.rb +2 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +1 -0
- data/lib/capybara/spec/session/unselect_spec.rb +1 -0
- data/lib/capybara/spec/session/visit_spec.rb +1 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +1 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -0
- data/lib/capybara/spec/session/window/window_spec.rb +1 -8
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +2 -3
- data/lib/capybara/spec/session/within_frame_spec.rb +1 -0
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +2 -0
- data/lib/capybara/spec/test_app.rb +1 -0
- data/lib/capybara/spec/views/buttons.erb +1 -0
- data/lib/capybara/spec/views/fieldsets.erb +2 -1
- data/lib/capybara/spec/views/form.erb +24 -0
- data/lib/capybara/spec/views/frame_child.erb +2 -1
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +2 -1
- data/lib/capybara/spec/views/frame_two.erb +2 -1
- data/lib/capybara/spec/views/header_links.erb +1 -0
- data/lib/capybara/spec/views/host_links.erb +1 -0
- data/lib/capybara/spec/views/path.erb +1 -0
- data/lib/capybara/spec/views/popup_one.erb +1 -0
- data/lib/capybara/spec/views/popup_two.erb +1 -0
- data/lib/capybara/spec/views/postback.erb +2 -1
- data/lib/capybara/spec/views/tables.erb +1 -0
- data/lib/capybara/spec/views/with_base_tag.erb +1 -0
- data/lib/capybara/spec/views/with_count.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +2 -1
- data/lib/capybara/spec/views/with_html.erb +3 -0
- data/lib/capybara/spec/views/with_html_entities.erb +1 -0
- data/lib/capybara/spec/views/with_js.erb +5 -0
- data/lib/capybara/spec/views/with_scope.erb +1 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -1
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_title.erb +2 -1
- data/lib/capybara/spec/views/with_unload_alert.erb +12 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -0
- data/lib/capybara/spec/views/within_frames.erb +2 -1
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +1 -0
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +28 -1
- data/spec/dsl_spec.rb +1 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -0
- data/spec/rack_test_spec.rb +1 -0
- data/spec/result_spec.rb +1 -0
- data/spec/rspec/features_spec.rb +1 -0
- data/spec/rspec/matchers_spec.rb +1 -0
- data/spec/rspec/scenarios_spec.rb +1 -0
- data/spec/rspec/views_spec.rb +1 -0
- data/spec/rspec_spec.rb +1 -0
- data/spec/selector_spec.rb +55 -1
- data/spec/selenium_spec.rb +6 -2
- data/spec/selenium_spec_chrome.rb +1 -0
- data/spec/server_spec.rb +101 -13
- data/spec/spec_helper.rb +1 -0
- metadata +16 -6
@@ -1,3 +1,4 @@
|
|
1
|
+
<%# frozen_string_literal: true %>
|
1
2
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
2
3
|
<head>
|
3
4
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
@@ -14,4 +15,4 @@
|
|
14
15
|
<div class="hidden_until_hover">Here I am</div>
|
15
16
|
</div>
|
16
17
|
</body>
|
17
|
-
</html>
|
18
|
+
</html>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%# frozen_string_literal: true %>
|
1
2
|
<div id="referrer"><%= referrer %></div>
|
2
3
|
<h1>This is a test</h1>
|
3
4
|
|
@@ -10,6 +11,7 @@
|
|
10
11
|
<h2 class="head">Header Class Test Five</h2>
|
11
12
|
|
12
13
|
<span class="number">42</span>
|
14
|
+
<span>Other span</span>
|
13
15
|
|
14
16
|
<p class="para" id="first">
|
15
17
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
@@ -109,6 +111,7 @@ banana</textarea>
|
|
109
111
|
</div>
|
110
112
|
|
111
113
|
<input type="text" disabled="disabled" name="disabled_text" value="This is disabled"/>
|
114
|
+
<input type="hidden" id="hidden_input" name="hidden_input" value="This is a hidden input"/>
|
112
115
|
|
113
116
|
<div>
|
114
117
|
<a id="link_placeholder">No href</a>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%# frozen_string_literal: true %>
|
1
2
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
2
3
|
<head>
|
3
4
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
@@ -93,6 +94,10 @@
|
|
93
94
|
<a href="#" id="open-prompt">Open prompt</a>
|
94
95
|
</p>
|
95
96
|
|
97
|
+
<p>
|
98
|
+
<input id="disable-on-click"/>
|
99
|
+
</p>
|
100
|
+
|
96
101
|
<p>
|
97
102
|
<a href="#" id="delayed-page-change">Change page</a>
|
98
103
|
<a href="/with_html?options[]=things">Non-escaped query options</a>
|
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
<%# frozen_string_literal: true %>
|
2
|
+
Bar
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<script>
|
4
|
+
function delay_unload() {
|
5
|
+
var start = new Date();
|
6
|
+
var i = 0;
|
7
|
+
while ((new Date()) - start < 1000){ i = i + 1; };
|
8
|
+
return null;
|
9
|
+
}
|
10
|
+
window.onbeforeunload = delay_unload;
|
11
|
+
window.onunload = delay_unload;
|
12
|
+
</script>
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
<div>This delays unload by 2 seconds</div>
|
16
|
+
</body>
|
17
|
+
</html>
|
data/lib/capybara/version.rb
CHANGED
data/lib/capybara/window.rb
CHANGED
data/spec/basic_node_spec.rb
CHANGED
data/spec/capybara_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
RSpec.describe Capybara do
|
@@ -33,9 +34,35 @@ RSpec.describe Capybara do
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
describe '.register_server' do
|
38
|
+
before do
|
39
|
+
Capybara.reuse_server = false
|
40
|
+
@old_server = Capybara.server
|
41
|
+
end
|
42
|
+
|
43
|
+
after do
|
44
|
+
Capybara.server(&@old_server)
|
45
|
+
Capybara.reuse_server = true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should add a new server" do
|
49
|
+
Capybara.register_server :blob do |app, port, host|
|
50
|
+
Rack::Handler::WEBrick.run(app, :Host => host, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
|
51
|
+
end
|
52
|
+
Capybara.server = :blob
|
53
|
+
session = Capybara::Session.new(:selenium, TestApp.dup)
|
54
|
+
session.visit('/')
|
55
|
+
expect(session.body).to include("Hello world!")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
36
59
|
describe ".server" do
|
60
|
+
before do
|
61
|
+
@old_server = Capybara.server
|
62
|
+
end
|
63
|
+
|
37
64
|
after do
|
38
|
-
Capybara.server
|
65
|
+
Capybara.server(&@old_server)
|
39
66
|
end
|
40
67
|
|
41
68
|
it "should default to a proc that calls run_default_server" do
|
data/spec/dsl_spec.rb
CHANGED
data/spec/rack_test_spec.rb
CHANGED
data/spec/result_spec.rb
CHANGED
data/spec/rspec/features_spec.rb
CHANGED
data/spec/rspec/matchers_spec.rb
CHANGED
data/spec/rspec/views_spec.rb
CHANGED
data/spec/rspec_spec.rb
CHANGED
data/spec/selector_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
RSpec.describe Capybara do
|
@@ -17,6 +18,20 @@ RSpec.describe Capybara do
|
|
17
18
|
<p class="b">Some Content</p>
|
18
19
|
<p class="b"></p>
|
19
20
|
</div>
|
21
|
+
<input type="checkbox"/>
|
22
|
+
<input type="radio"/>
|
23
|
+
<input type="text"/>
|
24
|
+
<input type="file"/>
|
25
|
+
<a href="#">link</a>
|
26
|
+
<fieldset></fieldset>
|
27
|
+
<select>
|
28
|
+
<option value="a">A</option>
|
29
|
+
<option value="b" disabled>B</option>
|
30
|
+
<option value="c" selected>C</option>
|
31
|
+
</select>
|
32
|
+
<table>
|
33
|
+
<tr><td></td></tr>
|
34
|
+
</table
|
20
35
|
</body>
|
21
36
|
</html>
|
22
37
|
STRING
|
@@ -29,7 +44,7 @@ RSpec.describe Capybara do
|
|
29
44
|
end
|
30
45
|
end
|
31
46
|
|
32
|
-
describe "
|
47
|
+
describe "modify_selector" do
|
33
48
|
it "allows modifying a selector" do
|
34
49
|
el = string.find(:custom_selector, 'a')
|
35
50
|
expect(el.tag_name).to eq 'div'
|
@@ -49,5 +64,44 @@ RSpec.describe Capybara do
|
|
49
64
|
expect(string).to have_selector(:custom_selector, 'b', not_empty: :all, count: 2)
|
50
65
|
end
|
51
66
|
end
|
67
|
+
|
68
|
+
describe "builtin selectors" do
|
69
|
+
context "when locator is nil" do
|
70
|
+
it "devolves to just finding element types" do
|
71
|
+
selectors = {
|
72
|
+
field: ".//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]",
|
73
|
+
fieldset: ".//fieldset",
|
74
|
+
link: ".//a[./@href]",
|
75
|
+
link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button" ,
|
76
|
+
fillable_field: ".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]",
|
77
|
+
radio_button: ".//input[./@type = 'radio']",
|
78
|
+
checkbox: ".//input[./@type = 'checkbox']",
|
79
|
+
select: ".//select",
|
80
|
+
option: ".//option",
|
81
|
+
file_field: ".//input[./@type = 'file']",
|
82
|
+
table: ".//table"
|
83
|
+
}
|
84
|
+
selectors.each do |selector, xpath|
|
85
|
+
results = string.all(selector,nil).to_a.map &:native
|
86
|
+
expect(results.size).to be > 0
|
87
|
+
expect(results).to eq string.all(:xpath, xpath).to_a.map(&:native)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe ":option selector" do
|
93
|
+
it "finds disabled options" do
|
94
|
+
expect(string.find(:option, disabled: true).value).to eq 'b'
|
95
|
+
end
|
96
|
+
|
97
|
+
it "finds selected options" do
|
98
|
+
expect(string.find(:option, selected: true).value).to eq 'c'
|
99
|
+
end
|
100
|
+
|
101
|
+
it "finds not selected and not disabled options" do
|
102
|
+
expect(string.find(:option, disabled: false, selected: false).value).to eq 'a'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
52
106
|
end
|
53
107
|
end
|
data/spec/selenium_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
require "selenium-webdriver"
|
3
4
|
|
@@ -11,11 +12,14 @@ module TestSessions
|
|
11
12
|
Selenium = Capybara::Session.new(:selenium_focus, TestApp)
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
+
skipped_tests = [
|
15
16
|
:response_headers,
|
16
17
|
:status_code,
|
17
18
|
:trigger
|
18
19
|
]
|
20
|
+
skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
|
21
|
+
|
22
|
+
Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", :capybara_skip => skipped_tests
|
19
23
|
|
20
24
|
RSpec.describe Capybara::Session do
|
21
25
|
context 'with selenium driver' do
|
@@ -110,7 +114,7 @@ RSpec.describe Capybara::Session do
|
|
110
114
|
end
|
111
115
|
|
112
116
|
context "#fill_in with { clear: Array } fill_options" do
|
113
|
-
it 'should pass the array through to the element'
|
117
|
+
it 'should pass the array through to the element' do
|
114
118
|
#this is mainly for use with [[:ctrl, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
|
115
119
|
@session.visit('/form')
|
116
120
|
@session.fill_in('form_first_name', :with => 'Harry',
|
data/spec/server_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
RSpec.describe Capybara::Server do
|
@@ -71,23 +72,102 @@ RSpec.describe Capybara::Server do
|
|
71
72
|
expect(@res2.body).to include('Hello Second Server')
|
72
73
|
end
|
73
74
|
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
context "When Capybara.reuse_server is true" do
|
76
|
+
before do
|
77
|
+
@old_reuse_server = Capybara.reuse_server
|
78
|
+
Capybara.reuse_server = true
|
79
|
+
end
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
@server2b = Capybara::Server.new(@app2).boot
|
81
|
+
after do
|
82
|
+
Capybara.reuse_server = @old_reuse_server
|
83
|
+
end
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
+
it "should use the existing server if it already running" do
|
86
|
+
@app = proc { |env| [200, {}, ["Hello Server!"]]}
|
85
87
|
|
86
|
-
|
87
|
-
|
88
|
+
@server1 = Capybara::Server.new(@app).boot
|
89
|
+
@server2 = Capybara::Server.new(@app).boot
|
90
|
+
|
91
|
+
res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
|
92
|
+
expect(res.body).to include('Hello Server')
|
93
|
+
|
94
|
+
res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
|
95
|
+
expect(res.body).to include('Hello Server')
|
96
|
+
|
97
|
+
expect(@server1.port).to eq(@server2.port)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "detects and waits for all reused server sessions pending requests" do
|
101
|
+
done = false
|
102
|
+
|
103
|
+
app = proc do |env|
|
104
|
+
request = Rack::Request.new(env)
|
105
|
+
sleep request.params['wait_time'].to_f
|
106
|
+
done = true
|
107
|
+
[200, {}, ["Hello Server!"]]
|
108
|
+
end
|
109
|
+
|
110
|
+
server1 = Capybara::Server.new(app).boot
|
111
|
+
server2 = Capybara::Server.new(app).boot
|
112
|
+
|
113
|
+
start_request(server1, 0.5)
|
114
|
+
start_request(server2, 1.0)
|
115
|
+
|
116
|
+
expect {
|
117
|
+
server1.wait_for_pending_requests
|
118
|
+
}.to change{done}.from(false).to(true)
|
119
|
+
expect(server2.instance_variable_get('@middleware').pending_requests?).to eq(false)
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
context "When Capybara.reuse_server is false" do
|
125
|
+
before do
|
126
|
+
@old_reuse_server = Capybara.reuse_server
|
127
|
+
Capybara.reuse_server = false
|
128
|
+
end
|
129
|
+
|
130
|
+
after do
|
131
|
+
Capybara.reuse_server = @old_reuse_server
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should not reuse an already running server" do
|
135
|
+
@app = proc { |env| [200, {}, ["Hello Server!"]]}
|
136
|
+
|
137
|
+
@server1 = Capybara::Server.new(@app).boot
|
138
|
+
@server2 = Capybara::Server.new(@app).boot
|
139
|
+
|
140
|
+
res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
|
141
|
+
expect(res.body).to include('Hello Server')
|
142
|
+
|
143
|
+
res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
|
144
|
+
expect(res.body).to include('Hello Server')
|
145
|
+
|
146
|
+
expect(@server1.port).not_to eq(@server2.port)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "detects and waits for only one sessions pending requests" do
|
150
|
+
done = false
|
151
|
+
|
152
|
+
app = proc do |env|
|
153
|
+
request = Rack::Request.new(env)
|
154
|
+
sleep request.params['wait_time'].to_f
|
155
|
+
done = true
|
156
|
+
[200, {}, ["Hello Server!"]]
|
157
|
+
end
|
158
|
+
|
159
|
+
server1 = Capybara::Server.new(app).boot
|
160
|
+
server2 = Capybara::Server.new(app).boot
|
161
|
+
|
162
|
+
start_request(server1, 0.5)
|
163
|
+
start_request(server2, 1.0)
|
164
|
+
|
165
|
+
expect {
|
166
|
+
server1.wait_for_pending_requests
|
167
|
+
}.to change{done}.from(false).to(true)
|
168
|
+
expect(server2.instance_variable_get('@middleware').pending_requests?).to eq(true)
|
169
|
+
end
|
88
170
|
|
89
|
-
expect(@server1a.port).to eq(@server1b.port)
|
90
|
-
expect(@server2a.port).to eq(@server2b.port)
|
91
171
|
end
|
92
172
|
|
93
173
|
it "should raise server errors when the server errors before the timeout" do
|
@@ -113,4 +193,12 @@ RSpec.describe Capybara::Server do
|
|
113
193
|
expect(Net::HTTP).to receive(:start).and_raise(SystemCallError.allocate)
|
114
194
|
expect(server.responsive?).to eq false
|
115
195
|
end
|
196
|
+
|
197
|
+
def start_request(server, wait_time)
|
198
|
+
# Start request, but don't wait for it to finish
|
199
|
+
socket = TCPSocket.new(server.host, server.port)
|
200
|
+
socket.write "GET /?wait_time=#{wait_time.to_s} HTTP/1.0\r\n\r\n"
|
201
|
+
socket.close
|
202
|
+
sleep 0.1
|
203
|
+
end
|
116
204
|
end
|