Support threadsafe/per session config mode

This commit is contained in:
Thomas Walpole 2017-04-29 10:55:33 -07:00 committed by Matthew Horan
parent 6670981917
commit 685371079e
4 changed files with 67 additions and 13 deletions

View File

@ -8,7 +8,7 @@ PATH
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
addressable (2.5.0) addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2) public_suffix (~> 2.0, >= 2.0.2)
appraisal (0.4.1) appraisal (0.4.1)
bundler bundler
@ -30,13 +30,13 @@ GEM
addressable (~> 2.3) addressable (~> 2.3)
spoon (~> 0.0.1) spoon (~> 0.0.1)
mime-types (2.99.3) mime-types (2.99.3)
mini_magick (4.6.1) mini_magick (4.7.0)
mini_portile2 (2.1.0) mini_portile (0.6.2)
nokogiri (1.7.1) nokogiri (1.6.6.4)
mini_portile2 (~> 2.1.0) mini_portile (~> 0.6.0)
nokogiri (1.7.1-java) nokogiri (1.6.6.4-java)
nokogiri (1.7.1-x86-mingw32) nokogiri (1.6.6.4-x86-mingw32)
mini_portile2 (~> 2.1.0) mini_portile (~> 0.6.0)
public_suffix (2.0.5) public_suffix (2.0.5)
rack (1.6.5) rack (1.6.5)
rack-protection (1.5.3) rack-protection (1.5.3)
@ -84,4 +84,4 @@ DEPENDENCIES
sinatra sinatra
BUNDLED WITH BUNDLED WITH
1.14.5 1.14.6

View File

@ -359,7 +359,11 @@ module Capybara::Webkit
end end
def default_wait_time def default_wait_time
Capybara.respond_to?(:default_max_wait_time) ? Capybara.default_max_wait_time : Capybara.default_wait_time if respond_to?(:session_options) && session_options
session_options.default_max_wait_time
else
Capybara.respond_to?(:default_max_wait_time) ? Capybara.default_max_wait_time : Capybara.default_wait_time
end
end end
def find_modal(type, id, options) def find_modal(type, id, options)

View File

@ -1,7 +1,7 @@
module Capybara::Webkit module Capybara::Webkit
class Node < Capybara::Driver::Node class Node < Capybara::Driver::Node
def initialize(session, base, browser) def initialize(driver, base, browser)
super(session, base) super(driver, base)
@browser = browser @browser = browser
end end
@ -147,7 +147,7 @@ module Capybara::Webkit
end end
def automatic_reload? def automatic_reload?
Capybara.respond_to?(:automatic_reload) && Capybara.automatic_reload session_option(:automatic_reload)
end end
def attached? def attached?
@ -164,6 +164,14 @@ module Capybara::Webkit
private private
def session_option(name)
if driver.respond_to?(:session_options)
driver.session_options.public_send(name)
else
Capybara.respond_to?(name) && Capybara.public_send(name)
end
end
def convert_to_named_keys(key) def convert_to_named_keys(key)
if key.is_a? Array if key.is_a? Array
key.map { |k| convert_to_named_keys(k)} key.map { |k| convert_to_named_keys(k)}

View File

@ -551,4 +551,46 @@ describe Capybara::Session do
expect(session).to have_text('Hello') expect(session).to have_text('Hello')
end end
end end
if Capybara.respond_to?(:threadsafe)
context "threadsafe/per-session config mode" do
before do
Capybara::SpecHelper.reset_threadsafe(true, subject)
end
after do
Capybara::SpecHelper.reset_threadsafe(false, subject)
end
it "can allow reload in one session but not in another" do
session1, session2 = 2.times.collect do
session_for_app do
get '/' do
<<-HTML
<html>
<div id="parent">
<p id="removeMe">Hello</p>
</div>
</html>
HTML
end
end
end
session1.config.automatic_reload = false
session2.config.automatic_reload = true
node1, node2 = [session1, session2].map do |session|
session.visit('/')
node = session.find(:xpath, "//p[@id='removeMe']")
session.execute_script("document.getElementById('parent').innerHTML = 'Magic'")
node
end
expect(node1.text).to eq 'Hello'
expect{ node2.text }.to raise_error(Capybara::Webkit::NodeNotAttachedError)
end
end
end
end end