2016-03-07 19:52:19 -05:00
# frozen_string_literal: true
2018-02-28 19:11:41 -05:00
2011-02-04 08:47:15 -05:00
require 'spec_helper'
require 'capybara/dsl'
2011-02-11 08:03:46 -05:00
require 'capybara/rspec/matchers'
2017-06-29 15:13:47 -04:00
require 'benchmark'
2011-02-04 08:47:15 -05:00
2018-04-27 14:01:47 -04:00
# rubocop:disable RSpec/ExpectActual
2018-02-28 19:11:41 -05:00
RSpec . shared_examples Capybara :: RSpecMatchers do | session , _mode |
2011-04-11 01:58:42 -04:00
include Capybara :: DSL
2011-02-04 08:47:15 -05:00
include Capybara :: RSpecMatchers
2014-02-16 12:13:58 -05:00
2018-07-10 17:18:39 -04:00
describe 'have_css matcher' do
it 'gives proper description' do
expect ( have_css ( 'h1' ) . description ) . to eq ( 'have visible css "h1"' )
2011-04-26 05:56:37 -04:00
end
2014-02-16 12:13:58 -05:00
2018-07-10 17:18:39 -04:00
context 'on a string' do
context 'with should' do
it 'passes if has_css? returns true' do
expect ( '<h1>Text</h1>' ) . to have_css ( 'h1' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_css? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_css ( 'h2' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find css "h2" but there were no matches / )
2011-02-04 08:47:15 -05:00
end
2011-03-10 12:58:33 -05:00
2018-07-10 17:18:39 -04:00
it 'passes if matched node count equals expected count' do
expect ( '<h1>Text</h1>' ) . to have_css ( 'h1' , count : 1 )
2011-03-10 12:58:33 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched node count does not equal expected count' do
2011-03-10 12:58:33 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_css ( 'h1' , count : 2 )
end . to raise_error ( 'expected to find visible css "h1" 2 times, found 1 match: "Text"' )
2011-03-10 12:58:33 -05:00
end
2013-03-04 16:35:11 -05:00
2018-07-10 17:18:39 -04:00
it 'fails if matched node count is less than expected minimum count' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_css ( 'p' , minimum : 1 )
end . to raise_error ( 'expected to find css "p" at least 1 time but there were no matches' )
2013-03-04 16:35:11 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched node count is more than expected maximum count' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1><h1>Text</h1><h1>Text</h1>' ) . to have_css ( 'h1' , maximum : 2 )
2017-07-19 18:59:40 -04:00
end . to raise_error ( 'expected to find visible css "h1" at most 2 times, found 3 matches: "Text", "Text", "Text"' )
2013-03-04 16:35:11 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched node count does not belong to expected range' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_css ( 'h1' , between : 2 .. 3 )
end . to raise_error ( 'expected to find visible css "h1" between 2 and 3 times, found 1 match: "Text"' )
2013-03-04 16:35:11 -05:00
end
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_css? returns true' do
expect ( '<h1>Text</h1>' ) . not_to have_css ( 'h2' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_css? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_css ( 'h1' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected not to find visible css "h1" / )
2011-02-04 08:47:15 -05:00
end
2011-03-10 12:58:33 -05:00
2018-07-10 17:18:39 -04:00
it 'passes if matched node count does not equal expected count' do
expect ( '<h1>Text</h1>' ) . not_to have_css ( 'h1' , count : 2 )
2011-03-10 12:58:33 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched node count equals expected count' do
2011-03-10 12:58:33 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_css ( 'h1' , count : 1 )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected not to find visible css "h1" / )
2011-03-10 12:58:33 -05:00
end
2011-02-04 08:47:15 -05:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_css ( 'h1' ) . and have_css ( 'h2' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_css ( 'h3' ) . or have_css ( 'h1' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_no_css ( 'h4' ) . and have_css ( 'h2' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_no_css ( 'h2' ) . or have_css ( 'h1' )
2016-08-17 14:41:40 -04:00
end
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
2011-02-04 08:47:15 -05:00
before do
visit ( '/with_html' )
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if has_css? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_css ( 'h1' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_css? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_css ( 'h1#doesnotexist' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find css "h1 # doesnotexist" but there were no matches / )
2011-02-04 08:47:15 -05:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_css? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_css ( 'h1#doesnotexist' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_css? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_css ( 'h1' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected not to find visible css "h1" / )
2011-02-04 08:47:15 -05:00
end
end
end
end
2018-07-10 17:18:39 -04:00
describe 'have_xpath matcher' do
it 'gives proper description' do
2017-07-19 18:59:40 -04:00
expect ( have_xpath ( '//h1' ) . description ) . to eq ( " have visible xpath \" \ / \ /h1 \" " )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
context 'on a string' do
context 'with should' do
it 'passes if has_xpath? returns true' do
expect ( '<h1>Text</h1>' ) . to have_xpath ( '//h1' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_xpath? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_xpath ( '//h2' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( %r{ expected to find xpath "//h2" but there were no matches } )
2011-02-04 08:47:15 -05:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_xpath? returns true' do
expect ( '<h1>Text</h1>' ) . not_to have_xpath ( '//h2' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_xpath? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_xpath ( '//h1' )
2018-02-28 19:11:41 -05:00
end . to raise_error ( %r{ expected not to find visible xpath "//h1" } )
2011-02-04 08:47:15 -05:00
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_xpath ( '//h1' ) . and have_xpath ( '//h2' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_xpath ( '//h3' ) . or have_xpath ( '//h1' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_no_xpath ( '//h4' ) . and have_xpath ( '//h1' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_no_xpath ( '//h4' ) . or have_xpath ( '//h4' )
2016-08-17 14:41:40 -04:00
end
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
2011-02-04 08:47:15 -05:00
before do
visit ( '/with_html' )
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if has_xpath? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_xpath ( '//h1' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_xpath? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_xpath ( " //h1[@id='doesnotexist'] " )
2018-07-12 15:32:41 -04:00
end . to raise_error ( %r{ expected to find xpath "//h1 \ [@id='doesnotexist' \ ]" but there were no matches } )
2011-02-04 08:47:15 -05:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_xpath? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_xpath ( '//h1[@id="doesnotexist"]' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_xpath? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_xpath ( '//h1' )
2018-02-28 19:11:41 -05:00
end . to raise_error ( %r{ expected not to find visible xpath "//h1" } )
2011-02-04 08:47:15 -05:00
end
end
end
end
2018-07-10 17:18:39 -04:00
describe 'have_selector matcher' do
it 'gives proper description' do
2012-01-31 11:24:34 -05:00
matcher = have_selector ( '//h1' )
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to matcher
expect ( matcher . description ) . to eq ( 'have visible xpath "//h1"' )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
context 'on a string' do
context 'with should' do
it 'passes if has_selector? returns true' do
expect ( '<h1>Text</h1>' ) . to have_selector ( '//h1' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_selector? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_selector ( '//h2' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( %r{ expected to find xpath "//h2" but there were no matches } )
2011-02-04 10:56:27 -05:00
end
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_selector? returns true' do
expect ( '<h1>Text</h1>' ) . not_to have_selector ( :css , 'h2' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_selector? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_selector ( :css , 'h1' )
2018-05-14 17:30:34 -04:00
end . to raise_error ( / expected not to find visible css "h1" / )
2011-02-04 08:47:15 -05:00
end
end
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
2011-02-04 08:47:15 -05:00
before do
visit ( '/with_html' )
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if has_selector? returns true' do
2016-10-04 14:10:29 -04:00
expect ( page ) . to have_selector ( '//h1' , text : 'test' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_selector? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_selector ( " //h1[@id='doesnotexist'] " )
2018-07-12 15:32:41 -04:00
end . to raise_error ( %r{ expected to find xpath "//h1 \ [@id='doesnotexist' \ ]" but there were no matches } )
2011-02-04 08:47:15 -05:00
end
2011-02-04 10:56:27 -05:00
2018-07-10 17:18:39 -04:00
it 'includes text in error message' do
2011-02-06 14:07:12 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( page ) . to have_selector ( '//h1' , text : 'wrong text' )
2018-02-28 19:11:41 -05:00
end . to raise_error ( %r{ expected to find visible xpath "//h1" with text "wrong text" but there were no matches } )
2011-02-04 10:56:27 -05:00
end
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_css? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_selector ( :css , 'h1#doesnotexist' )
2011-02-04 08:47:15 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_selector? returns false' do
2011-02-04 08:47:15 -05:00
expect do
2016-10-04 14:10:29 -04:00
expect ( page ) . not_to have_selector ( :css , 'h1' , text : 'test' )
2018-05-14 17:30:34 -04:00
end . to raise_error ( / expected not to find visible css "h1" with text "test" / )
2011-02-04 08:47:15 -05:00
end
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_selector ( '//h1' ) . and have_selector ( '//h2' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_selector ( '//h3' ) . or have_selector ( '//h1' )
expect ( '<h1>Text</h1><h2>Text</h2>' ) . to have_no_selector ( '//h3' ) . and have_selector ( '//h1' )
2016-08-17 14:41:40 -04:00
end
2011-02-04 08:47:15 -05:00
end
2011-02-10 11:15:28 -05:00
2018-07-10 17:18:39 -04:00
describe 'have_content matcher' do
it 'gives proper description' do
expect ( have_content ( 'Text' ) . description ) . to eq ( 'text "Text"' )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
context 'on a string' do
context 'with should' do
it 'passes if has_content? returns true' do
expect ( '<h1>Text</h1>' ) . to have_content ( 'Text' )
2011-02-10 11:15:28 -05:00
end
2018-07-10 17:18:39 -04:00
it 'passes if has_content? returns true using regexp' do
expect ( '<h1>Text</h1>' ) . to have_content ( / ext / )
2012-07-08 17:13:25 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_content? returns false' do
2011-02-10 11:15:28 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_content ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "Text" / )
2011-02-10 11:15:28 -05:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_content? returns true' do
expect ( '<h1>Text</h1>' ) . not_to have_content ( 'No such Text' )
2011-02-10 11:15:28 -05:00
end
2018-07-10 17:18:39 -04:00
it 'passes because escapes any characters that would have special meaning in a regexp' do
expect ( '<h1>Text</h1>' ) . not_to have_content ( '.' )
2012-07-08 17:13:25 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_content? returns false' do
2011-02-10 11:15:28 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_content ( 'Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected not to find text "Text" in "Text" / )
2011-02-10 11:15:28 -05:00
end
end
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
2011-02-10 11:15:28 -05:00
before do
visit ( '/with_html' )
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if has_content? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_content ( 'This is a test' )
2011-02-10 11:15:28 -05:00
end
2018-07-10 17:18:39 -04:00
it 'passes if has_content? returns true using regexp' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_content ( / test / )
2012-07-08 17:13:25 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_content? returns false' do
2011-02-10 11:15:28 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_content ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "(.*)This is a test(.*)" / )
2011-02-10 11:15:28 -05:00
end
2011-02-18 16:29:51 -05:00
2018-07-10 17:18:39 -04:00
context 'with default selector CSS' do
2011-02-18 16:29:51 -05:00
before { Capybara . default_selector = :css }
2018-06-19 16:57:42 -04:00
2018-08-27 12:34:33 -04:00
after { Capybara . default_selector = :xpath }
2018-07-10 17:18:39 -04:00
it 'fails if has_content? returns false' do
2011-02-18 16:29:51 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_content ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "(.*)This is a test(.*)" / )
2011-02-18 16:29:51 -05:00
end
end
2011-02-10 11:15:28 -05:00
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_content? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_content ( 'No such Text' )
2011-02-10 11:15:28 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_content? returns false' do
2011-02-10 11:15:28 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_content ( 'This is a test' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected not to find text "This is a test" / )
2011-02-10 11:15:28 -05:00
end
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<h1>Text</h1><h2>And</h2>' ) . to have_content ( 'Text' ) . and have_content ( 'And' )
expect ( '<h1>Text</h1><h2>Or</h2>' ) . to have_content ( 'XYZ' ) . or have_content ( 'Or' )
expect ( '<h1>Text</h1><h2>Or</h2>' ) . to have_no_content ( 'XYZ' ) . and have_content ( 'Or' )
2016-08-17 14:41:40 -04:00
end
2011-02-10 11:15:28 -05:00
end
2011-02-13 11:04:13 -05:00
2018-07-10 17:18:39 -04:00
describe 'have_text matcher' do
it 'gives proper description' do
expect ( have_text ( 'Text' ) . description ) . to eq ( 'text "Text"' )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
context 'on a string' do
context 'with should' do
it 'passes if text contains given string' do
expect ( '<h1>Text</h1>' ) . to have_text ( 'Text' )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if text matches given regexp' do
expect ( '<h1>Text</h1>' ) . to have_text ( / ext / )
2012-07-08 17:13:25 -04:00
end
2014-02-16 12:13:58 -05:00
it " fails if text doesn't contain given string " do
2011-10-16 19:46:19 -04:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "Text" / )
2011-10-16 19:46:19 -04:00
end
2012-08-01 15:56:11 -04:00
2014-02-16 12:13:58 -05:00
it " fails if text doesn't match given regexp " do
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( / No such Text / )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected to find text matching /No such Text/ in "Text"' )
end
2018-07-10 17:18:39 -04:00
it 'casts Integer to string' do
2012-08-01 15:56:11 -04:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( 3 )
2013-03-10 18:55:32 -04:00
end . to raise_error ( / expected to find text "3" in "Text" / )
2012-08-01 15:56:11 -04:00
end
2013-03-04 16:35:11 -05:00
2018-07-10 17:18:39 -04:00
it 'fails if matched text count does not equal to expected count' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( 'Text' , count : 2 )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected to find text "Text" 2 times but found 1 time in "Text"' )
2013-03-04 16:35:11 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched text count is less than expected minimum count' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( 'Lorem' , minimum : 1 )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected to find text "Lorem" at least 1 time but found 0 times in "Text"' )
2013-03-04 16:35:11 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched text count is more than expected maximum count' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text TextText</h1>' ) . to have_text ( 'Text' , maximum : 2 )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected to find text "Text" at most 2 times but found 3 times in "Text TextText"' )
2013-03-04 16:35:11 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if matched text count does not belong to expected range' do
2013-03-04 16:35:11 -05:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . to have_text ( 'Text' , between : 2 .. 3 )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected to find text "Text" between 2 and 3 times but found 1 time in "Text"' )
2013-03-04 16:35:11 -05:00
end
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
2014-02-16 12:13:58 -05:00
it " passes if text doesn't contain a string " do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_text ( 'No such Text' )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes because escapes any characters that would have special meaning in a regexp' do
expect ( '<h1>Text</h1>' ) . not_to have_text ( '.' )
2012-07-08 17:13:25 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if text contains a string' do
2011-10-16 19:46:19 -04:00
expect do
2018-07-10 17:18:39 -04:00
expect ( '<h1>Text</h1>' ) . not_to have_text ( 'Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected not to find text "Text" in "Text" / )
2011-10-16 19:46:19 -04:00
end
end
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
2011-10-16 19:46:19 -04:00
before do
visit ( '/with_html' )
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if has_text? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( 'This is a test' )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if has_text? returns true using regexp' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( / test / )
2012-07-08 17:13:25 -04:00
end
2018-07-10 17:18:39 -04:00
it 'can check for all text' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( :all , 'Some of this text is hidden!' )
2013-02-17 09:45:14 -05:00
end
2018-07-10 17:18:39 -04:00
it 'can check for visible text' do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( :visible , 'Some of this text is' )
expect ( page ) . not_to have_text ( :visible , 'Some of this text is hidden!' )
2013-02-17 09:45:14 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_text? returns false' do
2011-10-16 19:46:19 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "(.*)This is a test(.*)" / )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
context 'with default selector CSS' do
2011-10-16 19:46:19 -04:00
before { Capybara . default_selector = :css }
2018-06-19 16:57:42 -04:00
2018-08-27 12:34:33 -04:00
after { Capybara . default_selector = :xpath }
2018-07-10 17:18:39 -04:00
it 'fails if has_text? returns false' do
2011-10-16 19:46:19 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_text ( 'No such Text' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected to find text "No such Text" in "(.*)This is a test(.*)" / )
2011-10-16 19:46:19 -04:00
end
end
end
2018-07-10 17:18:39 -04:00
context 'with should_not' do
it 'passes if has_no_text? returns true' do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_text ( 'No such Text' )
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if has_no_text? returns false' do
2011-10-16 19:46:19 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . not_to have_text ( 'This is a test' )
2013-03-03 18:04:23 -05:00
end . to raise_error ( / expected not to find text "This is a test" / )
2011-10-16 19:46:19 -04:00
end
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<h1>Text</h1><h2>And</h2>' ) . to have_text ( 'Text' ) . and have_text ( 'And' )
expect ( '<h1>Text</h1><h2>Or</h2>' ) . to have_text ( 'Not here' ) . or have_text ( 'Or' )
2016-08-17 14:41:40 -04:00
end
2011-10-16 19:46:19 -04:00
end
2018-07-10 17:18:39 -04:00
describe 'have_link matcher' do
2014-06-11 14:52:29 -04:00
let ( :html ) { '<a href="#">Just a link</a><a href="#">Another link</a>' }
2011-03-25 06:35:59 -04:00
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
expect ( have_link ( 'Just a link' ) . description ) . to eq ( 'have visible link "Just a link"' )
2011-04-26 05:56:37 -04:00
end
2014-02-16 12:13:58 -05:00
2018-04-12 07:49:19 -04:00
it 'passes if there is such a link' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_link ( 'Just a link' )
2011-03-25 06:35:59 -04:00
end
2018-04-12 07:49:19 -04:00
it 'fails if there is no such link' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_link ( 'No such Link' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find link "No such Link" / )
2011-03-25 06:35:59 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_link ( 'Just a link' ) . and have_link ( 'Another link' )
expect ( html ) . to have_link ( 'Not a link' ) . or have_link ( 'Another link' )
2018-04-12 13:20:06 -04:00
expect ( html ) . to have_no_link ( 'Not a link' ) . and have_link ( 'Another link' )
2016-08-17 14:41:40 -04:00
end
2011-03-25 06:35:59 -04:00
end
2013-02-16 04:02:32 -05:00
2018-07-10 17:18:39 -04:00
describe 'have_title matcher' do
it 'gives proper description' do
expect ( have_title ( 'Just a title' ) . description ) . to eq ( 'have title "Just a title"' )
2013-02-16 04:02:32 -05:00
end
2018-07-10 17:18:39 -04:00
context 'on a string' do
2013-02-16 04:02:32 -05:00
let ( :html ) { '<title>Just a title</title>' }
2018-07-10 17:18:39 -04:00
it 'passes if there is such a title' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_title ( 'Just a title' )
2013-02-16 04:02:32 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such title' do
2013-02-16 04:02:32 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_title ( 'No such title' )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected "Just a title" to include "No such title"' )
2013-02-16 04:02:32 -05:00
end
2014-02-16 12:13:58 -05:00
it " fails if title doesn't match regexp " do
expect do
expect ( html ) . to have_title ( / [[:upper:]]+[[:lower:]]+l{2}o / )
end . to raise_error ( 'expected "Just a title" to match /[[:upper:]]+[[:lower:]]+l{2}o/' )
2013-02-16 04:02:32 -05:00
end
2014-02-16 12:13:58 -05:00
end
2013-02-16 04:02:32 -05:00
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
it 'passes if there is such a title' do
2014-02-16 12:13:58 -05:00
visit ( '/with_js' )
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_title ( 'with_js' )
2013-02-16 04:02:32 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such title' do
2014-02-16 12:13:58 -05:00
visit ( '/with_js' )
2013-02-16 04:02:32 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( page ) . to have_title ( 'No such title' )
2014-02-16 12:13:58 -05:00
end . to raise_error ( 'expected "with_js" to include "No such title"' )
end
2018-04-13 18:16:26 -04:00
context 'with wait' do
2018-04-27 14:01:47 -04:00
before do
2019-02-25 18:50:24 -05:00
session . visit ( '/with_js' )
2014-02-16 12:13:58 -05:00
end
it 'waits if wait time is more than timeout' do
2019-02-25 18:50:24 -05:00
session . click_link ( 'Change title' )
2014-02-16 12:13:58 -05:00
using_wait_time 0 do
2019-02-25 18:50:24 -05:00
expect ( session ) . to have_title ( 'changed title' , wait : 2 )
2014-02-16 12:13:58 -05:00
end
end
it " doesn't wait if wait time is less than timeout " do
2019-02-25 18:50:24 -05:00
session . click_link ( 'Change title' )
2016-12-15 12:04:01 -05:00
using_wait_time 3 do
2019-02-25 18:50:24 -05:00
expect ( session ) . not_to have_title ( 'changed title' , wait : 0 )
2014-02-16 12:13:58 -05:00
end
end
2013-02-16 04:02:32 -05:00
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
expect ( '<title>I compound</title>' ) . to have_title ( 'I dont compound' ) . or have_title ( 'I compound' )
2016-08-17 14:41:40 -04:00
end
2013-02-16 04:02:32 -05:00
end
2011-02-13 11:04:13 -05:00
2018-07-10 17:18:39 -04:00
describe 'have_current_path matcher' do
it 'gives proper description' do
expect ( have_current_path ( 'http://www.example.com' ) . description ) . to eq ( 'have current path "http://www.example.com"' )
2015-08-24 01:14:48 -04:00
end
2018-07-10 17:18:39 -04:00
context 'on a page or node' do
it 'passes if there is such a current path' do
2015-08-24 01:14:48 -04:00
visit ( '/with_js' )
expect ( page ) . to have_current_path ( '/with_js' )
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such current_path' do
2015-08-24 01:14:48 -04:00
visit ( '/with_js' )
expect do
expect ( page ) . to have_current_path ( '/not_with_js' )
end . to raise_error ( 'expected "/with_js" to equal "/not_with_js"' )
end
2018-04-13 18:16:26 -04:00
context 'with wait' do
2018-04-27 14:01:47 -04:00
before do
2019-02-25 18:50:24 -05:00
session . visit ( '/with_js' )
2015-08-24 01:14:48 -04:00
end
it 'waits if wait time is more than timeout' do
2019-02-25 18:50:24 -05:00
session . click_link ( 'Change page' )
2015-08-24 01:14:48 -04:00
using_wait_time 0 do
2019-02-25 18:50:24 -05:00
expect ( session ) . to have_current_path ( '/with_html' , wait : 2 )
2015-08-24 01:14:48 -04:00
end
end
it " doesn't wait if wait time is less than timeout " do
2019-02-25 18:50:24 -05:00
session . click_link ( 'Change page' )
2015-08-24 01:14:48 -04:00
using_wait_time 0 do
2019-02-25 18:50:24 -05:00
expect ( session ) . not_to have_current_path ( '/with_html' )
2015-08-24 01:14:48 -04:00
end
end
end
end
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2015-08-24 01:14:48 -04:00
visit ( '/with_html' )
expect ( page ) . to have_current_path ( '/not_with_html' ) . or have_current_path ( '/with_html' )
2016-08-17 14:41:40 -04:00
end
2015-08-24 01:14:48 -04:00
end
2018-07-10 17:18:39 -04:00
describe 'have_button matcher' do
2011-02-13 11:46:22 -05:00
let ( :html ) { '<button>A button</button><input type="submit" value="Another button"/>' }
2019-04-03 14:42:34 -04:00
it 'gives proper description with no options' do
expect ( have_button ( 'A button' ) . description ) . to eq ( 'have visible button "A button" that is not disabled' )
end
it 'gives proper description with disabled :any option' do
expect ( have_button ( 'A button' , disabled : :all ) . description ) . to eq ( 'have visible button "A button"' )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is such a button' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_button ( 'A button' )
2011-02-13 11:46:22 -05:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such button' do
2011-02-13 11:46:22 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_button ( 'No such Button' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find button "No such Button" / )
2011-02-13 11:46:22 -05:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_button ( 'Not this button' ) . or have_button ( 'A button' )
2016-08-17 14:41:40 -04:00
end
2011-02-13 11:46:22 -05:00
end
2018-07-10 17:18:39 -04:00
describe 'have_field matcher' do
2013-09-25 09:07:02 -04:00
let ( :html ) { '<p><label>Text field<input type="text" value="some value"/></label></p>' }
2011-02-13 11:04:13 -05:00
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
expect ( have_field ( 'Text field' ) . description ) . to eq ( 'have visible field "Text field" that is not disabled' )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
it 'gives proper description for a given value' do
expect ( have_field ( 'Text field' , with : 'some value' ) . description ) . to eq ( 'have visible field "Text field" that is not disabled with value "some value"' )
2013-09-25 09:07:02 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'passes if there is such a field' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_field ( 'Text field' )
2011-02-13 11:04:13 -05:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is such a field with value' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_field ( 'Text field' , with : 'some value' )
2013-09-25 09:07:02 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such field' do
2011-02-13 11:04:13 -05:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_field ( 'No such Field' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find field "No such Field" / )
2011-02-13 11:04:13 -05:00
end
2013-09-25 09:07:02 -04:00
2018-07-10 17:18:39 -04:00
it 'fails if there is such field but with false value' do
2013-09-25 09:07:02 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_field ( 'Text field' , with : 'false value' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected to find visible field "Text field" / )
2013-09-25 09:07:02 -04:00
end
2018-07-10 17:18:39 -04:00
it 'treats a given value as a string' do
2013-09-25 09:07:02 -04:00
class Foo
def to_s
2018-07-10 17:18:39 -04:00
'some value'
2013-09-25 09:07:02 -04:00
end
end
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_field ( 'Text field' , with : Foo . new )
2013-09-25 09:07:02 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_field ( 'Not this one' ) . or have_field ( 'Text field' )
2016-08-17 14:41:40 -04:00
end
2011-02-13 11:04:13 -05:00
end
2018-07-10 17:18:39 -04:00
describe 'have_checked_field matcher' do
2011-03-25 06:35:59 -04:00
let ( :html ) do
' < label > it is checked < input type = " checkbox " checked = " checked " / > < / label>
< label > unchecked field < input type = " checkbox " / > < / label>'
end
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
2019-04-03 14:42:34 -04:00
expect ( have_checked_field ( 'it is checked' ) . description ) . to eq ( 'have visible field "it is checked" that is not disabled that is checked' )
2011-04-26 05:56:37 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if there is such a field and it is checked' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_checked_field ( 'it is checked' )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is such a field but it is not checked' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_checked_field ( 'unchecked field' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected to find visible field "unchecked field" / )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such field' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_checked_field ( 'no such field' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find field "no such field" / )
2011-03-25 06:35:59 -04:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should not' do
it 'fails if there is such a field and it is checked' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_checked_field ( 'it is checked' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected not to find visible field "it is checked" / )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is such a field but it is not checked' do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_checked_field ( 'unchecked field' )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is no such field' do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_checked_field ( 'no such field' )
2011-03-25 06:35:59 -04:00
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_checked_field ( 'not this one' ) . or have_checked_field ( 'it is checked' )
2016-08-17 14:41:40 -04:00
end
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
describe 'have_unchecked_field matcher' do
2011-03-25 06:35:59 -04:00
let ( :html ) do
' < label > it is checked < input type = " checkbox " checked = " checked " / > < / label>
< label > unchecked field < input type = " checkbox " / > < / label>'
end
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
2019-04-03 14:42:34 -04:00
expect ( have_unchecked_field ( 'unchecked field' ) . description ) . to eq ( 'have visible field "unchecked field" that is not disabled that is not checked' )
2011-04-26 05:56:37 -04:00
end
2018-07-10 17:18:39 -04:00
context 'with should' do
it 'passes if there is such a field and it is not checked' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_unchecked_field ( 'unchecked field' )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is such a field but it is checked' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_unchecked_field ( 'it is checked' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected to find visible field "it is checked" / )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such field' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_unchecked_field ( 'no such field' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find field "no such field" / )
2011-03-25 06:35:59 -04:00
end
end
2018-07-10 17:18:39 -04:00
context 'with should not' do
it 'fails if there is such a field and it is not checked' do
2011-03-25 06:35:59 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_unchecked_field ( 'unchecked field' )
2017-07-19 18:59:40 -04:00
end . to raise_error ( / expected not to find visible field "unchecked field" / )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is such a field but it is checked' do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_unchecked_field ( 'it is checked' )
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
it 'passes if there is no such field' do
2013-11-14 12:43:36 -05:00
expect ( html ) . not_to have_unchecked_field ( 'no such field' )
2011-03-25 06:35:59 -04:00
end
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_unchecked_field ( 'it is checked' ) . or have_unchecked_field ( 'unchecked field' )
2016-08-17 14:41:40 -04:00
end
2011-03-25 06:35:59 -04:00
end
2018-07-10 17:18:39 -04:00
describe 'have_select matcher' do
2011-03-25 06:46:31 -04:00
let ( :html ) { '<label>Select Box<select></select></label>' }
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
expect ( have_select ( 'Select Box' ) . description ) . to eq ( 'have visible select box "Select Box" that is not disabled' )
2011-04-26 05:56:37 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'gives proper description for a given selected value' do
2017-07-19 18:59:40 -04:00
expect ( have_select ( 'Select Box' , selected : 'some value' ) . description ) . to eq ( 'have visible select box "Select Box" that is not disabled with "some value" selected' )
2014-07-02 14:17:53 -04:00
end
2011-04-26 05:56:37 -04:00
2018-07-10 17:18:39 -04:00
it 'passes if there is such a select' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_select ( 'Select Box' )
2011-03-25 06:46:31 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such select' do
2011-03-25 06:46:31 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_select ( 'No such Select box' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find select box "No such Select box" / )
2011-03-25 06:46:31 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_select ( 'Not this one' ) . or have_select ( 'Select Box' )
2016-08-17 14:41:40 -04:00
end
2011-03-25 06:46:31 -04:00
end
2018-07-10 17:18:39 -04:00
describe 'have_table matcher' do
2011-03-25 06:46:31 -04:00
let ( :html ) { '<table><caption>Lovely table</caption></table>' }
2018-07-10 17:18:39 -04:00
it 'gives proper description' do
expect ( have_table ( 'Lovely table' ) . description ) . to eq ( 'have visible table "Lovely table"' )
2018-07-12 15:32:41 -04:00
expect ( have_table ( 'Lovely table' , caption : 'my caption' ) . description ) . to eq ( 'have visible table "Lovely table" with caption "my caption"' )
2017-07-19 18:59:40 -04:00
end
2018-07-10 17:18:39 -04:00
it 'gives proper description when :visible option passed' do
expect ( have_table ( 'Lovely table' , visible : true ) . description ) . to eq ( 'have visible table "Lovely table"' )
expect ( have_table ( 'Lovely table' , visible : :hidden ) . description ) . to eq ( 'have non-visible table "Lovely table"' )
expect ( have_table ( 'Lovely table' , visible : :all ) . description ) . to eq ( 'have table "Lovely table"' )
expect ( have_table ( 'Lovely table' , visible : false ) . description ) . to eq ( 'have table "Lovely table"' )
2011-04-26 05:56:37 -04:00
end
2014-02-16 12:13:58 -05:00
2018-07-10 17:18:39 -04:00
it 'passes if there is such a table' do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_table ( 'Lovely table' )
2011-03-25 06:46:31 -04:00
end
2018-07-10 17:18:39 -04:00
it 'fails if there is no such table' do
2011-03-25 06:46:31 -04:00
expect do
2013-11-14 12:43:36 -05:00
expect ( html ) . to have_table ( 'No such Table' )
2018-07-12 15:32:41 -04:00
end . to raise_error ( / expected to find table "No such Table" / )
2011-03-25 06:46:31 -04:00
end
2015-08-24 01:14:48 -04:00
2018-07-10 17:18:39 -04:00
it 'supports compounding' do
2014-06-11 14:52:29 -04:00
expect ( html ) . to have_table ( 'nope' ) . or have_table ( 'Lovely table' )
2016-08-17 14:41:40 -04:00
end
2011-03-25 06:46:31 -04:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
context 'compounding timing' do
2019-02-25 18:50:24 -05:00
let ( :session ) { session }
let ( :el ) { session . find ( :css , '#reload-me' ) }
2018-04-27 14:01:47 -04:00
before do
2019-02-25 18:50:24 -05:00
session . visit ( '/with_js' )
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
context '#and' do
2018-04-13 18:16:26 -04:00
it " should run 'concurrently' " do
2018-01-02 21:13:39 -05:00
Capybara . using_wait_time ( 2 ) do
matcher = have_text ( 'this is not there' ) . and have_text ( 'neither is this' )
expect ( Benchmark . realtime do
2018-02-28 19:11:41 -05:00
expect do
2019-02-25 18:50:24 -05:00
expect ( el ) . to matcher
2018-02-28 19:11:41 -05:00
end . to raise_error RSpec :: Expectations :: ExpectationNotMetError
end ) . to be_between ( 2 , 3 )
2017-06-29 15:13:47 -04:00
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-04-13 18:16:26 -04:00
it " should run 'concurrently' and retry " do
2019-02-25 18:50:24 -05:00
session . click_link ( 'reload-link' )
session . using_wait_time ( 2 ) do
2018-01-02 21:13:39 -05:00
expect ( Benchmark . realtime do
2018-02-28 19:11:41 -05:00
expect do
2019-02-25 18:50:24 -05:00
expect ( el ) . to have_text ( 'waiting to be reloaded' ) . and ( have_text ( 'has been reloaded' ) )
2018-02-28 19:11:41 -05:00
end . to raise_error RSpec :: Expectations :: ExpectationNotMetError , / expected to find text "waiting to be reloaded" in "has been reloaded" /
end ) . to be_between ( 2 , 3 )
2017-06-29 15:13:47 -04:00
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
it 'should ignore :wait options' do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 2 ) do
2018-01-02 21:13:39 -05:00
matcher = have_text ( 'this is not there' , wait : 5 ) . and have_text ( 'neither is this' , wait : 6 )
expect ( Benchmark . realtime do
2018-02-28 19:11:41 -05:00
expect do
2019-02-25 18:50:24 -05:00
expect ( el ) . to matcher
2018-02-28 19:11:41 -05:00
end . to raise_error RSpec :: Expectations :: ExpectationNotMetError
end ) . to be_between ( 2 , 3 )
2017-06-29 15:13:47 -04:00
end
end
2018-07-10 17:18:39 -04:00
it 'should work on the session' do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 2 ) do
session . click_link ( 'reload-link' )
expect ( session ) . to have_selector ( :css , 'h1' , text : 'FooBar' ) . and have_text ( 'has been reloaded' )
2017-06-29 15:13:47 -04:00
end
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
context '#and_then' do
it 'should run sequentially' do
2019-02-25 18:50:24 -05:00
session . click_link ( 'reload-link' )
expect ( el ) . to have_text ( 'waiting to be reloaded' ) . and_then have_text ( 'has been reloaded' )
2018-01-02 21:13:39 -05:00
end
end
2018-07-10 17:18:39 -04:00
context '#or' do
2018-01-02 21:13:39 -05:00
it " should run 'concurrently' " do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 3 ) do
2018-01-02 21:13:39 -05:00
expect ( Benchmark . realtime do
2019-02-25 18:50:24 -05:00
expect ( el ) . to have_text ( 'has been reloaded' ) . or have_text ( 'waiting to be reloaded' )
2018-01-02 21:13:39 -05:00
end ) . to be < 1
2017-06-29 15:13:47 -04:00
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
it 'should retry' do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 3 ) do
2018-01-02 21:13:39 -05:00
expect ( Benchmark . realtime do
2018-02-28 19:11:41 -05:00
expect do
2019-02-25 18:50:24 -05:00
expect ( el ) . to have_text ( 'has been reloaded' ) . or have_text ( 'random stuff' )
2018-02-28 19:11:41 -05:00
end . to raise_error RSpec :: Expectations :: ExpectationNotMetError
2018-01-02 21:13:39 -05:00
end ) . to be > 3
2017-06-29 15:13:47 -04:00
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
it 'should ignore :wait options' do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 2 ) do
2018-01-02 21:13:39 -05:00
expect ( Benchmark . realtime do
2018-02-28 19:11:41 -05:00
expect do
2019-02-25 18:50:24 -05:00
expect ( el ) . to have_text ( 'this is not there' , wait : 10 ) . or have_text ( 'neither is this' , wait : 15 )
2018-02-28 19:11:41 -05:00
end . to raise_error RSpec :: Expectations :: ExpectationNotMetError
end ) . to be_between ( 2 , 3 )
2017-06-29 15:13:47 -04:00
end
2018-01-02 21:13:39 -05:00
end
2017-06-29 15:13:47 -04:00
2018-07-10 17:18:39 -04:00
it 'should work on the session' do
2019-02-25 18:50:24 -05:00
session . using_wait_time ( 2 ) do
session . click_link ( 'reload-link' )
expect ( session ) . to have_selector ( :css , 'h1' , text : 'Not on the page' ) . or have_text ( 'has been reloaded' )
2017-06-29 15:13:47 -04:00
end
end
end
end
2011-02-04 08:47:15 -05:00
end
2018-04-27 14:01:47 -04:00
# rubocop:enable RSpec/ExpectActual