capybara 3.0.0 → 3.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/History.md +777 -10
- data/License.txt +1 -1
- data/README.md +75 -58
- data/lib/capybara/config.rb +29 -10
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +22 -4
- data/lib/capybara/driver/node.rb +34 -9
- data/lib/capybara/dsl.rb +14 -6
- data/lib/capybara/helpers.rb +52 -7
- data/lib/capybara/minitest/spec.rb +173 -84
- data/lib/capybara/minitest.rb +250 -144
- data/lib/capybara/node/actions.rb +248 -124
- data/lib/capybara/node/base.rb +34 -20
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +13 -15
- data/lib/capybara/node/element.rb +339 -113
- data/lib/capybara/node/finders.rb +95 -82
- data/lib/capybara/node/matchers.rb +338 -157
- data/lib/capybara/node/simple.rb +54 -15
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +9 -10
- data/lib/capybara/queries/base_query.rb +25 -18
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +11 -0
- data/lib/capybara/queries/selector_query.rb +600 -103
- data/lib/capybara/queries/sibling_query.rb +9 -7
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +40 -22
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +47 -28
- data/lib/capybara/rack_test/driver.rb +12 -3
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +53 -50
- data/lib/capybara/rack_test/node.rb +114 -37
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +44 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +45 -0
- data/lib/capybara/result.rb +86 -52
- data/lib/capybara/rspec/features.rb +8 -10
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- data/lib/capybara/rspec/matchers/base.rb +111 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +138 -316
- data/lib/capybara/rspec.rb +3 -2
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/lib/capybara/selector/css.rb +89 -12
- data/lib/capybara/selector/definition/button.rb +68 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +54 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +279 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +72 -27
- data/lib/capybara/selector/filters/base.rb +45 -2
- data/lib/capybara/selector/filters/expression_filter.rb +5 -6
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +18 -4
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +85 -200
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +226 -537
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +296 -238
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/logger_suppressor.rb +40 -0
- data/lib/capybara/selenium/node.rb +436 -166
- data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +69 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +58 -67
- data/lib/capybara/session/config.rb +38 -6
- data/lib/capybara/session/matchers.rb +26 -19
- data/lib/capybara/session.rb +258 -190
- data/lib/capybara/spec/public/jquery.js +5 -5
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +122 -8
- data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +135 -42
- data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
- data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +62 -38
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
- data/lib/capybara/spec/session/body_spec.rb +11 -13
- data/lib/capybara/spec/session/check_spec.rb +111 -51
- data/lib/capybara/spec/session/choose_spec.rb +62 -30
- data/lib/capybara/spec/session/click_button_spec.rb +227 -161
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
- data/lib/capybara/spec/session/click_link_spec.rb +78 -55
- data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
- data/lib/capybara/spec/session/current_url_spec.rb +44 -37
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
- data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
- data/lib/capybara/spec/session/fill_in_spec.rb +104 -44
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
- data/lib/capybara/spec/session/find_field_spec.rb +33 -31
- data/lib/capybara/spec/session/find_link_spec.rb +32 -14
- data/lib/capybara/spec/session/find_spec.rb +236 -141
- data/lib/capybara/spec/session/first_spec.rb +44 -43
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +44 -19
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +18 -18
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/has_button_spec.rb +92 -12
- data/lib/capybara/spec/session/has_css_spec.rb +271 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +30 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
- data/lib/capybara/spec/session/has_select_spec.rb +75 -47
- data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +170 -4
- data/lib/capybara/spec/session/has_text_spec.rb +108 -52
- data/lib/capybara/spec/session/has_title_spec.rb +19 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
- data/lib/capybara/spec/session/html_spec.rb +13 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +871 -122
- data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +52 -37
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
- data/lib/capybara/spec/session/save_page_spec.rb +41 -38
- data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +102 -76
- data/lib/capybara/spec/session/selectors_spec.rb +51 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +26 -24
- data/lib/capybara/spec/session/title_spec.rb +8 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +40 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +59 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
- data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
- data/lib/capybara/spec/session/window/window_spec.rb +88 -54
- data/lib/capybara/spec/session/window/windows_spec.rb +10 -7
- data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
- data/lib/capybara/spec/session/within_spec.rb +69 -44
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +79 -40
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +134 -42
- data/lib/capybara/spec/views/frame_child.erb +4 -3
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +1 -1
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/initial_alert.erb +2 -1
- data/lib/capybara/spec/views/layout.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +33 -0
- data/lib/capybara/spec/views/path.erb +2 -2
- data/lib/capybara/spec/views/popup_one.erb +1 -1
- data/lib/capybara/spec/views/popup_two.erb +1 -1
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +21 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +68 -1
- data/lib/capybara/spec/views/with_animation.erb +81 -0
- data/lib/capybara/spec/views/with_base_tag.erb +2 -2
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +3 -2
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +43 -10
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +30 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +31 -25
- data/lib/capybara.rb +120 -100
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +54 -52
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +80 -53
- data/spec/filter_set_spec.rb +24 -7
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
- data/spec/minitest_spec.rb +38 -5
- data/spec/minitest_spec_spec.rb +88 -62
- data/spec/per_session_config_spec.rb +5 -5
- data/spec/rack_test_spec.rb +169 -115
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +86 -33
- data/spec/rspec/features_spec.rb +26 -23
- data/spec/rspec/scenarios_spec.rb +8 -4
- data/spec/rspec/shared_spec_matchers.rb +393 -363
- data/spec/rspec/views_spec.rb +4 -3
- data/spec/rspec_matchers_spec.rb +10 -10
- data/spec/rspec_spec.rb +109 -85
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +391 -61
- data/spec/selenium_spec_chrome.rb +180 -41
- data/spec/selenium_spec_chrome_remote.rb +101 -0
- data/spec/selenium_spec_edge.rb +28 -8
- data/spec/selenium_spec_firefox.rb +211 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +127 -11
- data/spec/selenium_spec_safari.rb +156 -0
- data/spec/server_spec.rb +177 -78
- data/spec/session_spec.rb +52 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +455 -123
- data/spec/spec_helper.rb +91 -2
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +343 -42
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/lib/capybara/rspec/compound.rb +0 -90
- data/lib/capybara/spec/session/assert_selector.rb +0 -149
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -143
data/spec/rack_test_spec.rb
CHANGED
|
@@ -6,7 +6,7 @@ module TestSessions
|
|
|
6
6
|
RackTest = Capybara::Session.new(:rack_test, TestApp)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
skipped_tests = %i[
|
|
10
10
|
js
|
|
11
11
|
modals
|
|
12
12
|
screenshot
|
|
@@ -16,214 +16,268 @@ Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip
|
|
|
16
16
|
server
|
|
17
17
|
hover
|
|
18
18
|
about_scheme
|
|
19
|
+
download
|
|
20
|
+
css
|
|
21
|
+
scroll
|
|
22
|
+
spatial
|
|
23
|
+
html_validation
|
|
24
|
+
shadow_dom
|
|
25
|
+
active_element
|
|
19
26
|
]
|
|
27
|
+
Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip: skipped_tests do |example|
|
|
28
|
+
case example.metadata[:full_description]
|
|
29
|
+
when /has_css\? should support case insensitive :class and :id options/
|
|
30
|
+
skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
|
|
31
|
+
when /#click_button should follow permanent redirects that maintain method/
|
|
32
|
+
skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
|
|
33
|
+
end
|
|
34
|
+
end
|
|
20
35
|
|
|
21
|
-
RSpec.describe Capybara::Session do
|
|
36
|
+
RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
37
|
+
include Capybara::RSpecMatchers
|
|
22
38
|
context 'with rack test driver' do
|
|
23
|
-
|
|
24
|
-
@session = TestSessions::RackTest
|
|
25
|
-
end
|
|
39
|
+
let(:session) { TestSessions::RackTest }
|
|
26
40
|
|
|
27
41
|
describe '#driver' do
|
|
28
|
-
it
|
|
29
|
-
expect(
|
|
42
|
+
it 'should be a rack test driver' do
|
|
43
|
+
expect(session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
|
|
30
44
|
end
|
|
31
45
|
end
|
|
32
46
|
|
|
33
47
|
describe '#mode' do
|
|
34
|
-
it
|
|
35
|
-
expect(
|
|
48
|
+
it 'should remember the mode' do
|
|
49
|
+
expect(session.mode).to eq(:rack_test)
|
|
36
50
|
end
|
|
37
51
|
end
|
|
38
52
|
|
|
39
53
|
describe '#click_link' do
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@session.visit "/with_html"
|
|
43
|
-
@session.click_link "A link with data-method"
|
|
44
|
-
expect(@session.html).to include('The requested object was deleted')
|
|
54
|
+
after do
|
|
55
|
+
session.driver.options[:respect_data_method] = false
|
|
45
56
|
end
|
|
46
57
|
|
|
47
|
-
it
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
expect(
|
|
58
|
+
it 'should use data-method if option is true' do
|
|
59
|
+
session.driver.options[:respect_data_method] = true
|
|
60
|
+
session.visit '/with_html'
|
|
61
|
+
session.click_link 'A link with data-method'
|
|
62
|
+
expect(session.html).to include('The requested object was deleted')
|
|
52
63
|
end
|
|
53
64
|
|
|
54
|
-
it
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
expect(
|
|
65
|
+
it 'should not use data-method if option is false' do
|
|
66
|
+
session.driver.options[:respect_data_method] = false
|
|
67
|
+
session.visit '/with_html'
|
|
68
|
+
session.click_link 'A link with data-method'
|
|
69
|
+
expect(session.html).to include('Not deleted')
|
|
59
70
|
end
|
|
60
71
|
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
it "should use data-method if available even if it's capitalized" do
|
|
73
|
+
session.driver.options[:respect_data_method] = true
|
|
74
|
+
session.visit '/with_html'
|
|
75
|
+
session.click_link 'A link with capitalized data-method'
|
|
76
|
+
expect(session.html).to include('The requested object was deleted')
|
|
63
77
|
end
|
|
64
78
|
end
|
|
65
79
|
|
|
66
|
-
describe
|
|
67
|
-
it
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(@session).to have_field('test_field', with: 'not_monkey')
|
|
80
|
+
describe '#fill_in' do
|
|
81
|
+
it 'should warn that :fill_options are not supported' do
|
|
82
|
+
session.visit '/with_html'
|
|
83
|
+
expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
|
|
84
|
+
output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
|
|
85
|
+
expect(session).to have_field('test_field', with: 'not_monkey')
|
|
73
86
|
end
|
|
74
87
|
end
|
|
75
88
|
|
|
76
|
-
describe
|
|
77
|
-
context
|
|
78
|
-
it
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
expect(
|
|
89
|
+
describe '#attach_file' do
|
|
90
|
+
context 'with multipart form' do
|
|
91
|
+
it 'should submit an empty form-data section if no file is submitted' do
|
|
92
|
+
session.visit('/form')
|
|
93
|
+
session.click_button('Upload Empty')
|
|
94
|
+
expect(session.html).to include('Successfully ignored empty file field.')
|
|
82
95
|
end
|
|
83
96
|
end
|
|
84
97
|
|
|
85
|
-
it
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
expect(
|
|
98
|
+
it 'should not submit an obsolete mime type' do
|
|
99
|
+
test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
|
|
100
|
+
session.visit('/form')
|
|
101
|
+
session.attach_file 'form_document', test_jpg_file_path
|
|
102
|
+
session.click_button('Upload Single')
|
|
103
|
+
expect(session).to have_content('Content-type: text/csv')
|
|
91
104
|
end
|
|
92
105
|
end
|
|
93
106
|
|
|
94
|
-
describe
|
|
95
|
-
context
|
|
96
|
-
it
|
|
97
|
-
|
|
98
|
-
expect(
|
|
99
|
-
|
|
100
|
-
expect(
|
|
101
|
-
|
|
102
|
-
expect(
|
|
103
|
-
|
|
104
|
-
expect(
|
|
107
|
+
describe '#click' do
|
|
108
|
+
context 'on a label' do
|
|
109
|
+
it 'should toggle the associated checkbox' do
|
|
110
|
+
session.visit('/form')
|
|
111
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
112
|
+
session.find(:label, 'Cat').click
|
|
113
|
+
expect(session).to have_checked_field('form_pets_cat')
|
|
114
|
+
session.find(:label, 'Cat').click
|
|
115
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
116
|
+
session.find(:label, 'McLaren').click
|
|
117
|
+
expect(session).to have_checked_field('form_cars_mclaren', visible: :hidden)
|
|
105
118
|
end
|
|
106
119
|
|
|
107
|
-
it
|
|
108
|
-
|
|
109
|
-
expect(
|
|
110
|
-
|
|
111
|
-
expect(
|
|
112
|
-
|
|
113
|
-
expect(
|
|
120
|
+
it 'should toggle the associated radio' do
|
|
121
|
+
session.visit('/form')
|
|
122
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
123
|
+
session.find(:label, 'Male').click
|
|
124
|
+
expect(session).to have_checked_field('gender_male')
|
|
125
|
+
session.find(:label, 'Female').click
|
|
126
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
114
127
|
end
|
|
128
|
+
|
|
129
|
+
it 'should rewrite the forms action query for get submission' do
|
|
130
|
+
session.visit('/form')
|
|
131
|
+
session.click_button('mediocre')
|
|
132
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it 'should rewrite the submit buttons formaction query for get submission' do
|
|
136
|
+
session.visit('/form')
|
|
137
|
+
session.click_button('mediocre2')
|
|
138
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe '#send_keys' do
|
|
144
|
+
it 'raises an UnsupportedMethodError' do
|
|
145
|
+
session.visit('/form')
|
|
146
|
+
|
|
147
|
+
expect { session.send_keys(:tab) }.to raise_error(Capybara::NotSupportedByDriverError)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe '#active_element' do
|
|
152
|
+
it 'raises an UnsupportedMethodError' do
|
|
153
|
+
session.visit('/form')
|
|
154
|
+
|
|
155
|
+
expect { session.active_element }.to raise_error(Capybara::NotSupportedByDriverError)
|
|
115
156
|
end
|
|
116
157
|
end
|
|
117
158
|
|
|
118
159
|
describe '#text' do
|
|
119
|
-
it
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
normal =
|
|
160
|
+
it 'should return original text content for textareas' do
|
|
161
|
+
session.visit('/with_html')
|
|
162
|
+
session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
|
|
163
|
+
normal = session.find(:css, '#normal')
|
|
123
164
|
expect(normal.value).to eq 'hello'
|
|
124
165
|
expect(normal.text).to eq 'banana'
|
|
125
166
|
end
|
|
126
167
|
end
|
|
168
|
+
|
|
169
|
+
describe '#style' do
|
|
170
|
+
it 'should raise an error' do
|
|
171
|
+
session.visit('/with_html')
|
|
172
|
+
el = session.find(:css, '#first')
|
|
173
|
+
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
|
174
|
+
end
|
|
175
|
+
end
|
|
127
176
|
end
|
|
128
177
|
end
|
|
129
178
|
|
|
130
179
|
RSpec.describe Capybara::RackTest::Driver do
|
|
131
|
-
|
|
132
|
-
@driver = TestSessions::RackTest.driver
|
|
133
|
-
end
|
|
180
|
+
let(:driver) { TestSessions::RackTest.driver }
|
|
134
181
|
|
|
135
182
|
describe ':headers option' do
|
|
136
183
|
it 'should always set headers' do
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
expect(
|
|
184
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
185
|
+
driver.visit('/get_header')
|
|
186
|
+
expect(driver.html).to include('foobar')
|
|
140
187
|
end
|
|
141
188
|
|
|
142
189
|
it 'should keep headers on link clicks' do
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
expect(
|
|
190
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
191
|
+
driver.visit('/header_links')
|
|
192
|
+
driver.find_xpath('.//a').first.click
|
|
193
|
+
expect(driver.html).to include('foobar')
|
|
147
194
|
end
|
|
148
195
|
|
|
149
196
|
it 'should keep headers on form submit' do
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
expect(
|
|
197
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
198
|
+
driver.visit('/header_links')
|
|
199
|
+
driver.find_xpath('.//input').first.click
|
|
200
|
+
expect(driver.html).to include('foobar')
|
|
154
201
|
end
|
|
155
202
|
|
|
156
203
|
it 'should keep headers on redirects' do
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
expect(
|
|
204
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
205
|
+
driver.visit('/get_header_via_redirect')
|
|
206
|
+
expect(driver.html).to include('foobar')
|
|
160
207
|
end
|
|
161
208
|
end
|
|
162
209
|
|
|
163
210
|
describe ':follow_redirects option' do
|
|
164
|
-
it
|
|
165
|
-
|
|
211
|
+
it 'defaults to following redirects' do
|
|
212
|
+
driver = described_class.new(TestApp)
|
|
166
213
|
|
|
167
|
-
|
|
168
|
-
expect(
|
|
169
|
-
expect(
|
|
214
|
+
driver.visit('/redirect')
|
|
215
|
+
expect(driver.response.header['Location']).to be_nil
|
|
216
|
+
expect(driver.current_url).to match %r{/landed$}
|
|
170
217
|
end
|
|
171
218
|
|
|
172
|
-
it
|
|
173
|
-
|
|
219
|
+
it 'is possible to not follow redirects' do
|
|
220
|
+
driver = described_class.new(TestApp, follow_redirects: false)
|
|
174
221
|
|
|
175
|
-
|
|
176
|
-
expect(
|
|
177
|
-
expect(
|
|
222
|
+
driver.visit('/redirect')
|
|
223
|
+
expect(driver.response.header['Location']).to match %r{/redirect_again$}
|
|
224
|
+
expect(driver.current_url).to match %r{/redirect$}
|
|
178
225
|
end
|
|
179
226
|
end
|
|
180
227
|
|
|
181
228
|
describe ':redirect_limit option' do
|
|
182
|
-
context
|
|
183
|
-
|
|
184
|
-
@driver = Capybara::RackTest::Driver.new(TestApp)
|
|
185
|
-
end
|
|
229
|
+
context 'with default redirect limit' do
|
|
230
|
+
let(:driver) { described_class.new(TestApp) }
|
|
186
231
|
|
|
187
|
-
it
|
|
188
|
-
|
|
189
|
-
expect(
|
|
232
|
+
it 'should follow 5 redirects' do
|
|
233
|
+
driver.visit('/redirect/5/times')
|
|
234
|
+
expect(driver.html).to include('redirection complete')
|
|
190
235
|
end
|
|
191
236
|
|
|
192
|
-
it
|
|
237
|
+
it 'should not follow more than 6 redirects' do
|
|
193
238
|
expect do
|
|
194
|
-
|
|
239
|
+
driver.visit('/redirect/6/times')
|
|
195
240
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
196
241
|
end
|
|
197
242
|
end
|
|
198
243
|
|
|
199
|
-
context
|
|
200
|
-
|
|
201
|
-
@driver = Capybara::RackTest::Driver.new(TestApp, redirect_limit: 21)
|
|
202
|
-
end
|
|
244
|
+
context 'with 21 redirect limit' do
|
|
245
|
+
let(:driver) { described_class.new(TestApp, redirect_limit: 21) }
|
|
203
246
|
|
|
204
|
-
it
|
|
205
|
-
|
|
206
|
-
expect(
|
|
247
|
+
it 'should follow 21 redirects' do
|
|
248
|
+
driver.visit('/redirect/21/times')
|
|
249
|
+
expect(driver.html).to include('redirection complete')
|
|
207
250
|
end
|
|
208
251
|
|
|
209
|
-
it
|
|
252
|
+
it 'should not follow more than 21 redirects' do
|
|
210
253
|
expect do
|
|
211
|
-
|
|
254
|
+
driver.visit('/redirect/22/times')
|
|
212
255
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
213
256
|
end
|
|
214
257
|
end
|
|
215
258
|
end
|
|
216
259
|
end
|
|
217
260
|
|
|
261
|
+
RSpec.describe 'Capybara::String' do
|
|
262
|
+
it 'should use HTML5 parsing' do
|
|
263
|
+
skip 'Only valid if Nokogiri >= 1.12.0 or gumbo is included' unless defined? Nokogiri::HTML5
|
|
264
|
+
Capybara.use_html5_parsing = true
|
|
265
|
+
allow(Nokogiri::HTML5).to receive(:parse).and_call_original
|
|
266
|
+
Capybara.string('<div id=test_div></div>')
|
|
267
|
+
expect(Nokogiri::HTML5).to have_received(:parse)
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
218
271
|
module CSSHandlerIncludeTester
|
|
219
272
|
def dont_extend_css_handler
|
|
220
273
|
raise 'should never be called'
|
|
221
274
|
end
|
|
222
275
|
end
|
|
223
|
-
include CSSHandlerIncludeTester # rubocop:disable Style/MixinUsage
|
|
224
276
|
|
|
225
277
|
RSpec.describe Capybara::RackTest::CSSHandlers do
|
|
226
|
-
|
|
227
|
-
|
|
278
|
+
include CSSHandlerIncludeTester
|
|
279
|
+
|
|
280
|
+
it 'should not be extended by global includes' do
|
|
281
|
+
expect(described_class.new).not_to respond_to(:dont_extend_css_handler)
|
|
228
282
|
end
|
|
229
283
|
end
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe Capybara::Selector::RegexpDisassembler, :aggregate_failures do
|
|
6
|
+
it 'handles strings' do
|
|
7
|
+
verify_strings(
|
|
8
|
+
/abcdef/ => %w[abcdef],
|
|
9
|
+
/abc def/ => ['abc def']
|
|
10
|
+
)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'handles escaped characters' do
|
|
14
|
+
verify_strings(
|
|
15
|
+
/abc\\def/ => %w[abc\def],
|
|
16
|
+
/abc\.def/ => %w[abc.def],
|
|
17
|
+
/\nabc/ => ["\nabc"],
|
|
18
|
+
%r{abc/} => %w[abc/],
|
|
19
|
+
/ab\++cd/ => %w[ab+ cd]
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'handles wildcards' do
|
|
24
|
+
verify_strings(
|
|
25
|
+
/abc.*def/ => %w[abc def],
|
|
26
|
+
/.*def/ => %w[def],
|
|
27
|
+
/abc./ => %w[abc],
|
|
28
|
+
/abc.*/ => %w[abc],
|
|
29
|
+
/abc.def/ => %w[abc def],
|
|
30
|
+
/abc.def.ghi/ => %w[abc def ghi],
|
|
31
|
+
/abc.abcd.abcde/ => %w[abcde],
|
|
32
|
+
/.*/ => []
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'ignores optional characters for substrings' do
|
|
37
|
+
{
|
|
38
|
+
/abc*def/ => %w[ab def],
|
|
39
|
+
/abc*/ => %w[ab],
|
|
40
|
+
/c*/ => [],
|
|
41
|
+
/abc?def/ => %w[ab def],
|
|
42
|
+
/abc?/ => %w[ab],
|
|
43
|
+
/abc?def?/ => %w[ab de],
|
|
44
|
+
/abc?def?g/ => %w[ab de g],
|
|
45
|
+
/d?/ => []
|
|
46
|
+
}.each do |regexp, expected|
|
|
47
|
+
expect(described_class.new(regexp).substrings).to eq expected
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'handles optional characters for #alternated_substrings' do
|
|
52
|
+
verify_alternated_strings(
|
|
53
|
+
{
|
|
54
|
+
/abc*def/ => [%w[ab def]],
|
|
55
|
+
/abc*/ => [%w[ab]],
|
|
56
|
+
/c*/ => [],
|
|
57
|
+
/abc?def/ => [%w[abdef], %w[abcdef]],
|
|
58
|
+
/abc?/ => [%w[ab]],
|
|
59
|
+
/abc?def?/ => [%w[abde], %w[abcde]],
|
|
60
|
+
/abc?def?g/ => [%w[abdeg], %w[abdefg], %w[abcdeg], %w[abcdefg]],
|
|
61
|
+
/d?/ => []
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'handles character classes' do
|
|
67
|
+
verify_strings(
|
|
68
|
+
/abc[a-z]/ => %w[abc],
|
|
69
|
+
/abc[a-z]def[0-9]g/ => %w[abc def g],
|
|
70
|
+
/[0-9]abc/ => %w[abc],
|
|
71
|
+
/[0-9]+/ => [],
|
|
72
|
+
/abc[0-9&&[^7]]/ => %w[abc]
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'handles posix bracket expressions' do
|
|
77
|
+
verify_strings(
|
|
78
|
+
/abc[[:alpha:]]/ => %w[abc],
|
|
79
|
+
/[[:digit:]]abc/ => %w[abc],
|
|
80
|
+
/abc[[:print:]]def/ => %w[abc def]
|
|
81
|
+
)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'handles repitition' do
|
|
85
|
+
verify_strings(
|
|
86
|
+
/abc{3}/ => %w[abccc],
|
|
87
|
+
/abc{3}d/ => %w[abcccd],
|
|
88
|
+
/abc{0}/ => %w[ab],
|
|
89
|
+
/abc{,2}/ => %w[ab],
|
|
90
|
+
/abc{2,}/ => %w[abcc],
|
|
91
|
+
/def{1,5}/ => %w[def],
|
|
92
|
+
/abc+def/ => %w[abc def],
|
|
93
|
+
/ab(cde){,4}/ => %w[ab],
|
|
94
|
+
/(ab){,2}cd/ => %w[cd],
|
|
95
|
+
/(abc){2,3}/ => %w[abcabc],
|
|
96
|
+
/(abc){3}/ => %w[abcabcabc],
|
|
97
|
+
/ab{2,3}cd/ => %w[abb cd],
|
|
98
|
+
/(ab){2,3}cd/ => %w[abab cd]
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'handles non-greedy repetition' do
|
|
103
|
+
verify_strings(
|
|
104
|
+
/abc.*?/ => %w[abc],
|
|
105
|
+
/abc+?/ => %w[abc],
|
|
106
|
+
/abc*?cde/ => %w[ab cde],
|
|
107
|
+
/(abc)+?def/ => %w[abc def],
|
|
108
|
+
/ab(cde)*?fg/ => %w[ab fg]
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'ignores alternation for #substrings' do
|
|
113
|
+
{
|
|
114
|
+
/abc|def/ => [],
|
|
115
|
+
/ab(?:c|d)/ => %w[ab],
|
|
116
|
+
/ab(c|d|e)fg/ => %w[ab fg],
|
|
117
|
+
/ab?(c|d)fg/ => %w[a fg],
|
|
118
|
+
/ab(c|d)ef/ => %w[ab ef],
|
|
119
|
+
/ab(cd?|ef)g/ => %w[ab g],
|
|
120
|
+
/ab(cd|ef*)g/ => %w[ab g],
|
|
121
|
+
/ab|cd*/ => [],
|
|
122
|
+
/cd(?:ef|gh)|xyz/ => [],
|
|
123
|
+
/(cd(?:ef|gh)|xyz)/ => [],
|
|
124
|
+
/cd(ef|gh)+/ => %w[cd],
|
|
125
|
+
/cd(ef|gh)?/ => %w[cd],
|
|
126
|
+
/cd(ef|gh)?ij/ => %w[cd ij],
|
|
127
|
+
/cd(ef|gh)+ij/ => %w[cd ij],
|
|
128
|
+
/cd(ef|gh){2}ij/ => %w[cd ij],
|
|
129
|
+
/(cd(ef|g*))/ => %w[cd],
|
|
130
|
+
/ab(cd){0,2}ef/ => %w[ab ef],
|
|
131
|
+
/ab(cd){0,1}ef/ => %w[ab ef],
|
|
132
|
+
/ab(cd|cd)ef/ => %w[ab ef],
|
|
133
|
+
/ab(cd|cd)?ef/ => %w[ab ef],
|
|
134
|
+
/ab\\?cd/ => %w[ab cd]
|
|
135
|
+
}.each do |regexp, expected|
|
|
136
|
+
expect(described_class.new(regexp).substrings).to eq expected
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'handles alternation for #alternated_substrings' do
|
|
141
|
+
verify_alternated_strings(
|
|
142
|
+
{
|
|
143
|
+
/abc|def/ => [%w[abc], %w[def]],
|
|
144
|
+
/ab(?:c|d)/ => [%w[abc], %w[abd]],
|
|
145
|
+
/ab(c|d|e)fg/ => [%w[abcfg], %w[abdfg], %w[abefg]],
|
|
146
|
+
/ab?(c|d)fg/ => [%w[acfg], %w[adfg], %w[abcfg], %w[abdfg]],
|
|
147
|
+
/ab(c|d)ef/ => [%w[abcef], %w[abdef]],
|
|
148
|
+
/ab(cd?|ef)g/ => [%w[abcg], %w[abcdg], %w[abefg]],
|
|
149
|
+
/ab(cd|ef*)g/ => [%w[abcdg], %w[abe g]],
|
|
150
|
+
/ab|cd*/ => [%w[ab], %w[c]],
|
|
151
|
+
/cd(?:ef|gh)|xyz/ => [%w[cdef], %w[cdgh], %w[xyz]],
|
|
152
|
+
/(cd(?:ef|gh)|xyz)/ => [%w[cdef], %w[cdgh], %w[xyz]],
|
|
153
|
+
/cd(ef|gh)+/ => [%w[cdef], %w[cdgh]],
|
|
154
|
+
/cd(ef|gh)?/ => [%w[cd]],
|
|
155
|
+
/cd(ef|gh)?ij/ => [%w[cdij], %w[cdefij], %w[cdghij]],
|
|
156
|
+
/cd(ef|gh)+ij/ => [%w[cdef ij], %w[cdgh ij]],
|
|
157
|
+
/cd(ef|gh){2}ij/ => [%w[cdefefij], %w[cdefghij], %w[cdghefij], %w[cdghghij]],
|
|
158
|
+
/(cd(ef|g*))/ => [%w[cd]],
|
|
159
|
+
/a|b*/ => [],
|
|
160
|
+
/ab(?:c|d?)/ => [%w[ab]],
|
|
161
|
+
/ab(c|d)|a*/ => [],
|
|
162
|
+
/(abc)?(d|e)/ => [%w[d], %w[e]],
|
|
163
|
+
/(abc*de)?(d|e)/ => [%w[d], %w[e]],
|
|
164
|
+
/(abc*de)?(d|e?)/ => [],
|
|
165
|
+
/(abc)?(d|e?)/ => [],
|
|
166
|
+
/ab(cd){0,2}ef/ => [%w[ab ef]],
|
|
167
|
+
/ab(cd){0,1}ef/ => [%w[abef], %w[abcdef]],
|
|
168
|
+
/ab(cd|cd)ef/ => [%w[abcdef]],
|
|
169
|
+
/ab(cd|cd)?ef/ => [%w[abef], %w[abcdef]],
|
|
170
|
+
/ab\\?cd/ => [%w[abcd], %w[ab\cd]]
|
|
171
|
+
}
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'handles grouping' do
|
|
176
|
+
verify_strings(
|
|
177
|
+
/(abc)/ => %w[abc],
|
|
178
|
+
/(abc)?/ => [],
|
|
179
|
+
/ab(cde)/ => %w[abcde],
|
|
180
|
+
/(abc)de/ => %w[abcde],
|
|
181
|
+
/ab(cde)fg/ => %w[abcdefg],
|
|
182
|
+
/ab(?<name>cd)ef/ => %w[abcdef],
|
|
183
|
+
/gh(?>ij)kl/ => %w[ghijkl],
|
|
184
|
+
/m(n.*p)q/ => %w[mn pq],
|
|
185
|
+
/(?:ab(cd)*){2,3}/ => %w[ab],
|
|
186
|
+
/(ab(cd){3})?/ => [],
|
|
187
|
+
/(ab(cd)+){2}/ => %w[abcd]
|
|
188
|
+
)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it 'handles meta characters' do
|
|
192
|
+
verify_strings(
|
|
193
|
+
/abc\d/ => %w[abc],
|
|
194
|
+
/abc\wdef/ => %w[abc def],
|
|
195
|
+
/\habc/ => %w[abc]
|
|
196
|
+
)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it 'handles character properties' do
|
|
200
|
+
verify_strings(
|
|
201
|
+
/ab\p{Alpha}cd/ => %w[ab cd],
|
|
202
|
+
/ab\p{Blank}/ => %w[ab],
|
|
203
|
+
/\p{Digit}cd/ => %w[cd]
|
|
204
|
+
)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it 'handles backreferences' do
|
|
208
|
+
verify_strings(
|
|
209
|
+
/a(?<group>abc).\k<group>.+/ => %w[aabc]
|
|
210
|
+
)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it 'handles subexpressions' do
|
|
214
|
+
verify_strings(
|
|
215
|
+
/\A(?<paren>a\g<paren>*b)+\z/ => %w[a b]
|
|
216
|
+
)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'ignores negative lookaheads' do
|
|
220
|
+
verify_strings(
|
|
221
|
+
/^(?!.*\bContributing Editor\b).*$/ => %w[],
|
|
222
|
+
/abc(?!.*def).*/ => %w[abc],
|
|
223
|
+
/(?!.*def)abc/ => %w[abc],
|
|
224
|
+
/abc(?!.*def.*).*ghi/ => %w[abc ghi],
|
|
225
|
+
/abc(?!.*bcd)def/ => %w[abcdef]
|
|
226
|
+
)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it 'handles anchors' do
|
|
230
|
+
verify_strings(
|
|
231
|
+
/^abc/ => %w[abc],
|
|
232
|
+
/def$/ => %w[def],
|
|
233
|
+
/^abc$/ => %w[abc]
|
|
234
|
+
)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def verify_strings(hsh)
|
|
238
|
+
hsh.each do |regexp, expected|
|
|
239
|
+
expect(Capybara::Selector::RegexpDisassembler.new(regexp).substrings).to eq expected
|
|
240
|
+
end
|
|
241
|
+
verify_alternated_strings(hsh, wrap: true)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def verify_alternated_strings(hsh, wrap: false)
|
|
245
|
+
hsh.each do |regexp, expected|
|
|
246
|
+
expected = [expected] if wrap && (expected != [])
|
|
247
|
+
expect(Capybara::Selector::RegexpDisassembler.new(regexp).alternated_substrings).to eq expected
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|