2016-03-07 19:52:19 -05:00
|
|
|
# frozen_string_literal: true
|
2018-02-28 19:11:41 -05:00
|
|
|
|
2010-09-17 19:56:32 -04:00
|
|
|
require 'spec_helper'
|
2009-11-07 14:44:45 -05:00
|
|
|
|
2012-10-30 09:32:47 -04:00
|
|
|
module TestSessions
|
|
|
|
RackTest = Capybara::Session.new(:rack_test, TestApp)
|
|
|
|
end
|
|
|
|
|
2018-04-13 17:49:28 -04:00
|
|
|
skipped_tests = %i[
|
2018-02-28 19:11:41 -05:00
|
|
|
js
|
|
|
|
modals
|
|
|
|
screenshot
|
|
|
|
frames
|
|
|
|
windows
|
|
|
|
send_keys
|
|
|
|
server
|
|
|
|
hover
|
|
|
|
about_scheme
|
2018-06-17 13:29:46 -04:00
|
|
|
download
|
2018-06-19 16:34:54 -04:00
|
|
|
css
|
2018-12-17 13:09:53 -05:00
|
|
|
scroll
|
2019-08-07 17:14:28 -04:00
|
|
|
spatial
|
2020-06-07 12:38:11 -04:00
|
|
|
html_validation
|
2020-10-10 18:10:56 -04:00
|
|
|
shadow_dom
|
2021-08-18 12:41:35 -04:00
|
|
|
active_element
|
2012-07-21 16:44:10 -04:00
|
|
|
]
|
2018-10-01 16:15:00 -04:00
|
|
|
Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip: skipped_tests do |example|
|
|
|
|
case example.metadata[:full_description]
|
|
|
|
when /has_css\? should support case insensitive :class and :id options/
|
2019-01-24 11:37:24 -05:00
|
|
|
skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
|
|
|
|
when /#click_button should follow permanent redirects that maintain method/
|
|
|
|
skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
|
2022-06-12 14:05:22 -04:00
|
|
|
when /#attach_file with multipart form should send prior hidden field if no file submitted/
|
|
|
|
skip 'Rack-test < 2 needs an empty file to detect multipart form' if Gem.loaded_specs['rack-test'].version < Gem::Version.new('2.0.0')
|
2018-10-01 16:15:00 -04:00
|
|
|
end
|
|
|
|
end
|
2012-07-21 16:44:10 -04:00
|
|
|
|
2018-04-27 14:01:47 -04:00
|
|
|
RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
2020-07-04 17:05:29 -04:00
|
|
|
include Capybara::RSpecMatchers
|
2009-11-07 14:44:45 -05:00
|
|
|
context 'with rack test driver' do
|
2019-02-25 18:50:24 -05:00
|
|
|
let(:session) { TestSessions::RackTest }
|
2009-12-12 07:33:00 -05:00
|
|
|
|
2009-11-07 14:44:45 -05:00
|
|
|
describe '#driver' do
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should be a rack test driver' do
|
2019-02-25 18:50:24 -05:00
|
|
|
expect(session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
|
2009-11-07 14:44:45 -05:00
|
|
|
end
|
|
|
|
end
|
2009-12-12 07:33:00 -05:00
|
|
|
|
2009-11-07 14:44:45 -05:00
|
|
|
describe '#mode' do
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should remember the mode' do
|
2019-02-25 18:50:24 -05:00
|
|
|
expect(session.mode).to eq(:rack_test)
|
2009-11-07 14:44:45 -05:00
|
|
|
end
|
|
|
|
end
|
2009-12-12 07:33:00 -05:00
|
|
|
|
2010-04-09 08:01:17 -04:00
|
|
|
describe '#click_link' do
|
2018-08-27 12:34:33 -04:00
|
|
|
after do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.driver.options[:respect_data_method] = false
|
2018-08-27 12:34:33 -04:00
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should use data-method if option is true' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.driver.options[:respect_data_method] = true
|
|
|
|
session.visit '/with_html'
|
|
|
|
session.click_link 'A link with data-method'
|
|
|
|
expect(session.html).to include('The requested object was deleted')
|
2010-04-09 08:01:17 -04:00
|
|
|
end
|
2011-08-30 05:20:29 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should not use data-method if option is false' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.driver.options[:respect_data_method] = false
|
|
|
|
session.visit '/with_html'
|
|
|
|
session.click_link 'A link with data-method'
|
|
|
|
expect(session.html).to include('Not deleted')
|
2011-08-30 05:20:29 -04:00
|
|
|
end
|
|
|
|
|
2011-10-18 08:41:44 -04:00
|
|
|
it "should use data-method if available even if it's capitalized" do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.driver.options[:respect_data_method] = true
|
|
|
|
session.visit '/with_html'
|
|
|
|
session.click_link 'A link with capitalized data-method'
|
|
|
|
expect(session.html).to include('The requested object was deleted')
|
2011-10-18 08:41:44 -04:00
|
|
|
end
|
2010-04-09 08:01:17 -04:00
|
|
|
end
|
2015-08-25 19:57:01 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
describe '#fill_in' do
|
|
|
|
it 'should warn that :fill_options are not supported' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit '/with_html'
|
2019-04-19 18:20:10 -04:00
|
|
|
expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
|
|
|
|
output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
|
2019-02-25 18:50:24 -05:00
|
|
|
expect(session).to have_field('test_field', with: 'not_monkey')
|
2014-06-19 12:29:12 -04:00
|
|
|
end
|
|
|
|
end
|
2010-04-09 08:01:17 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
describe '#attach_file' do
|
|
|
|
context 'with multipart form' do
|
|
|
|
it 'should submit an empty form-data section if no file is submitted' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit('/form')
|
|
|
|
session.click_button('Upload Empty')
|
|
|
|
expect(session.html).to include('Successfully ignored empty file field.')
|
2010-12-06 02:22:59 -05:00
|
|
|
end
|
2022-06-12 14:05:22 -04:00
|
|
|
|
|
|
|
it 'should submit multipart even if no file is submitted' do
|
|
|
|
session.visit('/form')
|
|
|
|
session.click_button('Upload Empty')
|
|
|
|
expect(session.html).to include('Content type was multipart/form-data;')
|
|
|
|
end
|
2010-12-06 02:22:59 -05:00
|
|
|
end
|
2016-09-12 21:55:17 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should not submit an obsolete mime type' do
|
2019-02-25 18:50:24 -05:00
|
|
|
test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
|
|
|
|
session.visit('/form')
|
|
|
|
session.attach_file 'form_document', test_jpg_file_path
|
|
|
|
session.click_button('Upload Single')
|
|
|
|
expect(session).to have_content('Content-type: text/csv')
|
2016-09-12 21:55:17 -04:00
|
|
|
end
|
2010-12-06 02:22:59 -05:00
|
|
|
end
|
2016-04-21 17:25:14 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
describe '#click' do
|
|
|
|
context 'on a label' do
|
|
|
|
it 'should toggle the associated checkbox' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit('/form')
|
|
|
|
expect(session).to have_unchecked_field('form_pets_cat')
|
|
|
|
session.find(:label, 'Cat').click
|
|
|
|
expect(session).to have_checked_field('form_pets_cat')
|
|
|
|
session.find(:label, 'Cat').click
|
|
|
|
expect(session).to have_unchecked_field('form_pets_cat')
|
|
|
|
session.find(:label, 'McLaren').click
|
|
|
|
expect(session).to have_checked_field('form_cars_mclaren', visible: :hidden)
|
2016-04-21 17:25:14 -04:00
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should toggle the associated radio' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit('/form')
|
|
|
|
expect(session).to have_unchecked_field('gender_male')
|
|
|
|
session.find(:label, 'Male').click
|
|
|
|
expect(session).to have_checked_field('gender_male')
|
|
|
|
session.find(:label, 'Female').click
|
|
|
|
expect(session).to have_unchecked_field('gender_male')
|
2016-04-21 17:25:14 -04:00
|
|
|
end
|
2020-02-17 14:14:51 -05:00
|
|
|
|
|
|
|
it 'should rewrite the forms action query for get submission' do
|
|
|
|
session.visit('/form')
|
|
|
|
session.click_button('mediocre')
|
|
|
|
expect(session).not_to have_current_path(/foo|bar/)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should rewrite the submit buttons formaction query for get submission' do
|
|
|
|
session.visit('/form')
|
|
|
|
session.click_button('mediocre2')
|
|
|
|
expect(session).not_to have_current_path(/foo|bar/)
|
|
|
|
end
|
2016-04-21 17:25:14 -04:00
|
|
|
end
|
|
|
|
end
|
2017-01-16 15:39:44 -05:00
|
|
|
|
2020-11-16 20:26:59 -05:00
|
|
|
describe '#send_keys' do
|
|
|
|
it 'raises an UnsupportedMethodError' do
|
|
|
|
session.visit('/form')
|
|
|
|
|
|
|
|
expect { session.send_keys(:tab) }.to raise_error(Capybara::NotSupportedByDriverError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-01-31 21:08:43 -05:00
|
|
|
describe '#active_element' do
|
|
|
|
it 'raises an UnsupportedMethodError' do
|
|
|
|
session.visit('/form')
|
|
|
|
|
|
|
|
expect { session.active_element }.to raise_error(Capybara::NotSupportedByDriverError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-01-16 15:39:44 -05:00
|
|
|
describe '#text' do
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should return original text content for textareas' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit('/with_html')
|
|
|
|
session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
|
|
|
|
normal = session.find(:css, '#normal')
|
2017-01-16 15:39:44 -05:00
|
|
|
expect(normal.value).to eq 'hello'
|
|
|
|
expect(normal.text).to eq 'banana'
|
|
|
|
end
|
|
|
|
end
|
2018-06-19 16:34:54 -04:00
|
|
|
|
|
|
|
describe '#style' do
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should raise an error' do
|
2019-02-25 18:50:24 -05:00
|
|
|
session.visit('/with_html')
|
|
|
|
el = session.find(:css, '#first')
|
2018-06-19 16:34:54 -04:00
|
|
|
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
|
|
|
end
|
|
|
|
end
|
2009-11-07 14:44:45 -05:00
|
|
|
end
|
|
|
|
end
|
2012-07-13 07:15:44 -04:00
|
|
|
|
2014-04-03 13:25:03 -04:00
|
|
|
RSpec.describe Capybara::RackTest::Driver do
|
2019-02-25 18:50:24 -05:00
|
|
|
let(:driver) { TestSessions::RackTest.driver }
|
2012-07-13 07:15:44 -04:00
|
|
|
|
|
|
|
describe ':headers option' do
|
|
|
|
it 'should always set headers' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/get_header')
|
|
|
|
expect(driver.html).to include('foobar')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should keep headers on link clicks' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/header_links')
|
|
|
|
driver.find_xpath('.//a').first.click
|
|
|
|
expect(driver.html).to include('foobar')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should keep headers on form submit' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/header_links')
|
|
|
|
driver.find_xpath('.//input').first.click
|
|
|
|
expect(driver.html).to include('foobar')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should keep headers on redirects' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/get_header_via_redirect')
|
|
|
|
expect(driver.html).to include('foobar')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe ':follow_redirects option' do
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'defaults to following redirects' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp)
|
2012-07-13 07:15:44 -04:00
|
|
|
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect')
|
|
|
|
expect(driver.response.header['Location']).to be_nil
|
|
|
|
expect(driver.current_url).to match %r{/landed$}
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
2022-01-27 09:28:51 -05:00
|
|
|
it 'should not include fragments in the referer header' do
|
|
|
|
driver.visit('/header_links#an-anchor')
|
|
|
|
driver.find_xpath('.//input').first.click
|
2022-04-30 13:26:55 -04:00
|
|
|
expect(driver.request.get_header('HTTP_REFERER')).to eq('http://www.example.com/header_links')
|
2022-01-27 09:28:51 -05:00
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'is possible to not follow redirects' do
|
2019-07-15 17:49:21 -04:00
|
|
|
driver = described_class.new(TestApp, follow_redirects: false)
|
2012-07-13 07:15:44 -04:00
|
|
|
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect')
|
|
|
|
expect(driver.response.header['Location']).to match %r{/redirect_again$}
|
|
|
|
expect(driver.current_url).to match %r{/redirect$}
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe ':redirect_limit option' do
|
2018-07-10 17:18:39 -04:00
|
|
|
context 'with default redirect limit' do
|
2019-07-15 17:49:21 -04:00
|
|
|
let(:driver) { described_class.new(TestApp) }
|
2012-07-13 07:15:44 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should follow 5 redirects' do
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect/5/times')
|
|
|
|
expect(driver.html).to include('redirection complete')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should not follow more than 6 redirects' do
|
2012-10-30 09:26:19 -04:00
|
|
|
expect do
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect/6/times')
|
2012-10-30 09:26:19 -04:00
|
|
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
context 'with 21 redirect limit' do
|
2019-07-15 17:49:21 -04:00
|
|
|
let(:driver) { described_class.new(TestApp, redirect_limit: 21) }
|
2012-07-13 07:15:44 -04:00
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should follow 21 redirects' do
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect/21/times')
|
|
|
|
expect(driver.html).to include('redirection complete')
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should not follow more than 21 redirects' do
|
2012-10-30 09:26:19 -04:00
|
|
|
expect do
|
2019-02-25 18:50:24 -05:00
|
|
|
driver.visit('/redirect/22/times')
|
2012-10-30 09:26:19 -04:00
|
|
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
2012-07-13 07:15:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2014-03-31 12:52:00 -04:00
|
|
|
|
2017-07-27 04:05:13 -04:00
|
|
|
RSpec.describe 'Capybara::String' do
|
2021-08-07 21:51:57 -04:00
|
|
|
it 'should use HTML5 parsing' do
|
|
|
|
skip 'Only valid if Nokogiri >= 1.12.0 or gumbo is included' unless defined? Nokogiri::HTML5
|
|
|
|
Capybara.use_html5_parsing = true
|
|
|
|
allow(Nokogiri::HTML5).to receive(:parse).and_call_original
|
2017-07-27 04:05:13 -04:00
|
|
|
Capybara.string('<div id=test_div></div>')
|
2021-08-07 21:51:57 -04:00
|
|
|
expect(Nokogiri::HTML5).to have_received(:parse)
|
2017-07-27 04:05:13 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-03-31 12:52:00 -04:00
|
|
|
module CSSHandlerIncludeTester
|
|
|
|
def dont_extend_css_handler
|
|
|
|
raise 'should never be called'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-28 19:11:41 -05:00
|
|
|
RSpec.describe Capybara::RackTest::CSSHandlers do
|
2018-04-27 14:01:47 -04:00
|
|
|
include CSSHandlerIncludeTester
|
|
|
|
|
2018-07-10 17:18:39 -04:00
|
|
|
it 'should not be extended by global includes' do
|
2019-07-15 17:49:21 -04:00
|
|
|
expect(described_class.new).not_to respond_to(:dont_extend_css_handler)
|
2014-03-31 12:52:00 -04:00
|
|
|
end
|
|
|
|
end
|