capybara 2.6.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|