mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
241 lines
7.7 KiB
Ruby
241 lines
7.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
module TestSessions
|
|
RackTest = Capybara::Session.new(:rack_test, TestApp)
|
|
end
|
|
|
|
skipped_tests = %i[
|
|
js
|
|
modals
|
|
screenshot
|
|
frames
|
|
windows
|
|
send_keys
|
|
server
|
|
hover
|
|
about_scheme
|
|
download
|
|
css
|
|
]
|
|
Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip: skipped_tests
|
|
|
|
RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
context 'with rack test driver' do
|
|
before do
|
|
@session = TestSessions::RackTest
|
|
end
|
|
|
|
describe '#driver' do
|
|
it "should be a rack test driver" do
|
|
expect(@session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
|
|
end
|
|
end
|
|
|
|
describe '#mode' do
|
|
it "should remember the mode" do
|
|
expect(@session.mode).to eq(:rack_test)
|
|
end
|
|
end
|
|
|
|
describe '#click_link' do
|
|
it "should use data-method if option is true" do
|
|
@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')
|
|
end
|
|
|
|
it "should not use data-method if option is false" do
|
|
@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')
|
|
end
|
|
|
|
it "should use data-method if available even if it's capitalized" do
|
|
@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')
|
|
end
|
|
|
|
after do
|
|
@session.driver.options[:respect_data_method] = false
|
|
end
|
|
end
|
|
|
|
describe "#fill_in" do
|
|
it "should warn that :fill_options are not supported" do
|
|
allow_any_instance_of(Capybara::RackTest::Node).to receive(:warn)
|
|
@session.visit "/with_html"
|
|
field = @session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true }
|
|
expect(@session).to have_field('test_field', with: 'not_monkey')
|
|
expect(field.base).to have_received(:warn).with("Options passed to Node#set but the RackTest driver doesn't support any - ignoring")
|
|
end
|
|
end
|
|
|
|
describe "#attach_file" do
|
|
context "with multipart form" do
|
|
it "should submit an empty form-data section if no file is submitted" do
|
|
@session.visit("/form")
|
|
@session.click_button("Upload Empty")
|
|
expect(@session.html).to include('Successfully ignored empty file field.')
|
|
end
|
|
end
|
|
|
|
it "should not submit an obsolete mime type" do
|
|
@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")
|
|
end
|
|
end
|
|
|
|
describe "#click" do
|
|
context "on a label" do
|
|
it "should toggle the associated checkbox" do
|
|
@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)
|
|
end
|
|
|
|
it "should toggle the associated radio" do
|
|
@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')
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#text' do
|
|
it "should return original text content for textareas" do
|
|
@session.visit('/with_html')
|
|
@session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
|
|
normal = @session.find(:css, '#normal')
|
|
expect(normal.value).to eq 'hello'
|
|
expect(normal.text).to eq 'banana'
|
|
end
|
|
end
|
|
|
|
describe '#style' do
|
|
it "should raise an error" do
|
|
@session.visit('/with_html')
|
|
el = @session.find(:css, '#first')
|
|
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
RSpec.describe Capybara::RackTest::Driver do
|
|
before do
|
|
@driver = TestSessions::RackTest.driver
|
|
end
|
|
|
|
describe ':headers option' do
|
|
it 'should always set headers' do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
@driver.visit('/get_header')
|
|
expect(@driver.html).to include('foobar')
|
|
end
|
|
|
|
it 'should keep headers on link clicks' do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
@driver.visit('/header_links')
|
|
@driver.find_xpath('.//a').first.click
|
|
expect(@driver.html).to include('foobar')
|
|
end
|
|
|
|
it 'should keep headers on form submit' do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
@driver.visit('/header_links')
|
|
@driver.find_xpath('.//input').first.click
|
|
expect(@driver.html).to include('foobar')
|
|
end
|
|
|
|
it 'should keep headers on redirects' do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
@driver.visit('/get_header_via_redirect')
|
|
expect(@driver.html).to include('foobar')
|
|
end
|
|
end
|
|
|
|
describe ':follow_redirects option' do
|
|
it "defaults to following redirects" do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp)
|
|
|
|
@driver.visit('/redirect')
|
|
expect(@driver.response.header['Location']).to be_nil
|
|
expect(@driver.current_url).to match %r{/landed$}
|
|
end
|
|
|
|
it "is possible to not follow redirects" do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, follow_redirects: false)
|
|
|
|
@driver.visit('/redirect')
|
|
expect(@driver.response.header['Location']).to match %r{/redirect_again$}
|
|
expect(@driver.current_url).to match %r{/redirect$}
|
|
end
|
|
end
|
|
|
|
describe ':redirect_limit option' do
|
|
context "with default redirect limit" do
|
|
before do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp)
|
|
end
|
|
|
|
it "should follow 5 redirects" do
|
|
@driver.visit("/redirect/5/times")
|
|
expect(@driver.html).to include('redirection complete')
|
|
end
|
|
|
|
it "should not follow more than 6 redirects" do
|
|
expect do
|
|
@driver.visit("/redirect/6/times")
|
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
end
|
|
end
|
|
|
|
context "with 21 redirect limit" do
|
|
before do
|
|
@driver = Capybara::RackTest::Driver.new(TestApp, redirect_limit: 21)
|
|
end
|
|
|
|
it "should follow 21 redirects" do
|
|
@driver.visit("/redirect/21/times")
|
|
expect(@driver.html).to include('redirection complete')
|
|
end
|
|
|
|
it "should not follow more than 21 redirects" do
|
|
expect do
|
|
@driver.visit("/redirect/22/times")
|
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
module CSSHandlerIncludeTester
|
|
def dont_extend_css_handler
|
|
raise 'should never be called'
|
|
end
|
|
end
|
|
|
|
RSpec.describe Capybara::RackTest::CSSHandlers do
|
|
include CSSHandlerIncludeTester
|
|
|
|
it "should not be extended by global includes" do
|
|
expect(Capybara::RackTest::CSSHandlers.new).not_to respond_to(:dont_extend_css_handler)
|
|
end
|
|
end
|