1
0
Fork 0
mirror of https://github.com/teamcapybara/capybara.git synced 2022-11-09 12:08:07 -05:00
teamcapybara--capybara/spec/rack_test_spec.rb
2018-08-27 11:40:36 -07:00

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
after do
@session.driver.options[:respect_data_method] = false
end
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
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