capybara 3.32.2
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 +7 -0
- data/.yardopts +1 -0
- data/History.md +1813 -0
- data/License.txt +22 -0
- data/README.md +1099 -0
- data/lib/capybara.rb +511 -0
- data/lib/capybara/config.rb +94 -0
- data/lib/capybara/cucumber.rb +27 -0
- data/lib/capybara/driver/base.rb +170 -0
- data/lib/capybara/driver/node.rb +139 -0
- data/lib/capybara/dsl.rb +65 -0
- data/lib/capybara/helpers.rb +108 -0
- data/lib/capybara/minitest.rb +386 -0
- data/lib/capybara/minitest/spec.rb +264 -0
- data/lib/capybara/node/actions.rb +420 -0
- data/lib/capybara/node/base.rb +143 -0
- data/lib/capybara/node/document.rb +48 -0
- data/lib/capybara/node/document_matchers.rb +67 -0
- data/lib/capybara/node/element.rb +606 -0
- data/lib/capybara/node/finders.rb +325 -0
- data/lib/capybara/node/matchers.rb +883 -0
- data/lib/capybara/node/simple.rb +208 -0
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +106 -0
- data/lib/capybara/queries/current_path_query.rb +51 -0
- data/lib/capybara/queries/match_query.rb +26 -0
- data/lib/capybara/queries/selector_query.rb +710 -0
- data/lib/capybara/queries/sibling_query.rb +26 -0
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +110 -0
- data/lib/capybara/queries/title_query.rb +39 -0
- data/lib/capybara/rack_test/browser.rb +140 -0
- data/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/lib/capybara/rack_test/driver.rb +109 -0
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +127 -0
- data/lib/capybara/rack_test/node.rb +325 -0
- data/lib/capybara/rails.rb +16 -0
- data/lib/capybara/registrations/drivers.rb +36 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +44 -0
- data/lib/capybara/result.rb +190 -0
- data/lib/capybara/rspec.rb +29 -0
- data/lib/capybara/rspec/features.rb +23 -0
- data/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/lib/capybara/rspec/matchers.rb +201 -0
- 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 +38 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +233 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
- data/lib/capybara/selector/css.rb +102 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +51 -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 +27 -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 +46 -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/filter.rb +5 -0
- data/lib/capybara/selector/filter_set.rb +124 -0
- data/lib/capybara/selector/filters/base.rb +77 -0
- data/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +147 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- 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 +496 -0
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -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 +78 -0
- data/lib/capybara/selenium/logger_suppressor.rb +34 -0
- data/lib/capybara/selenium/node.rb +610 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +131 -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 +47 -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.rb +126 -0
- data/lib/capybara/server/animation_disabler.rb +58 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +69 -0
- data/lib/capybara/session.rb +942 -0
- data/lib/capybara/session/config.rb +124 -0
- data/lib/capybara/session/matchers.rb +87 -0
- data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/lib/capybara/spec/public/jquery.js +5 -0
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +268 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/lib/capybara/spec/session/all_spec.rb +278 -0
- data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- 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_spec.rb +258 -0
- data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
- data/lib/capybara/spec/session/body_spec.rb +23 -0
- data/lib/capybara/spec/session/check_spec.rb +235 -0
- data/lib/capybara/spec/session/choose_spec.rb +121 -0
- data/lib/capybara/spec/session/click_button_spec.rb +506 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
- data/lib/capybara/spec/session/click_link_spec.rb +229 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/lib/capybara/spec/session/current_url_spec.rb +115 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
- data/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/lib/capybara/spec/session/find_link_spec.rb +70 -0
- data/lib/capybara/spec/session/find_spec.rb +531 -0
- data/lib/capybara/spec/session/first_spec.rb +156 -0
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
- data/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/has_button_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +374 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
- data/lib/capybara/spec/session/has_field_spec.rb +349 -0
- data/lib/capybara/spec/session/has_link_spec.rb +39 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +310 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +198 -0
- data/lib/capybara/spec/session/has_text_spec.rb +394 -0
- data/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/lib/capybara/spec/session/html_spec.rb +47 -0
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1292 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +33 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
- data/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +229 -0
- data/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/text_spec.rb +74 -0
- data/lib/capybara/spec/session/title_spec.rb +29 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/lib/capybara/spec/session/visit_spec.rb +204 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/lib/capybara/spec/session/within_spec.rb +199 -0
- data/lib/capybara/spec/spec_helper.rb +134 -0
- data/lib/capybara/spec/test_app.rb +226 -0
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +5 -0
- data/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/lib/capybara/spec/views/form.erb +685 -0
- data/lib/capybara/spec/views/frame_child.erb +18 -0
- data/lib/capybara/spec/views/frame_one.erb +10 -0
- data/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/lib/capybara/spec/views/frame_two.erb +9 -0
- data/lib/capybara/spec/views/header_links.erb +8 -0
- data/lib/capybara/spec/views/host_links.erb +13 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/path.erb +13 -0
- data/lib/capybara/spec/views/popup_one.erb +9 -0
- data/lib/capybara/spec/views/popup_two.erb +9 -0
- data/lib/capybara/spec/views/postback.erb +14 -0
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +20 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +130 -0
- data/lib/capybara/spec/views/with_animation.erb +74 -0
- data/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/lib/capybara/spec/views/with_count.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +22 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +24 -0
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +208 -0
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +160 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/spec/views/with_scope.erb +42 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +5 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +54 -0
- data/lib/capybara/spec/views/within_frames.erb +15 -0
- data/lib/capybara/version.rb +5 -0
- data/lib/capybara/window.rb +146 -0
- data/spec/basic_node_spec.rb +154 -0
- data/spec/capybara_spec.rb +112 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +276 -0
- data/spec/filter_set_spec.rb +46 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/spec/minitest_spec.rb +163 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +268 -0
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +196 -0
- data/spec/rspec/features_spec.rb +99 -0
- data/spec/rspec/scenarios_spec.rb +19 -0
- data/spec/rspec/shared_spec_matchers.rb +947 -0
- data/spec/rspec/views_spec.rb +14 -0
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +145 -0
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +513 -0
- data/spec/selenium_spec_chrome.rb +188 -0
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +208 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +150 -0
- data/spec/selenium_spec_safari.rb +148 -0
- data/spec/server_spec.rb +292 -0
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +476 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +753 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'capybara/dsl'
|
|
5
|
+
|
|
6
|
+
RSpec.describe Capybara::SessionConfig do
|
|
7
|
+
describe 'threadsafe' do
|
|
8
|
+
it 'defaults to global session options' do
|
|
9
|
+
Capybara.threadsafe = true
|
|
10
|
+
session = Capybara::Session.new(:rack_test, TestApp)
|
|
11
|
+
%i[default_host app_host always_include_port run_server
|
|
12
|
+
default_selector default_max_wait_time ignore_hidden_elements
|
|
13
|
+
automatic_reload match exact raise_server_errors visible_text_only
|
|
14
|
+
automatic_label_click enable_aria_label save_path
|
|
15
|
+
asset_host].each do |m|
|
|
16
|
+
expect(session.config.public_send(m)).to eq Capybara.public_send(m)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "doesn't change global session when changed" do
|
|
21
|
+
Capybara.threadsafe = true
|
|
22
|
+
host = 'http://my.example.com'
|
|
23
|
+
session = Capybara::Session.new(:rack_test, TestApp) do |config|
|
|
24
|
+
config.default_host = host
|
|
25
|
+
config.automatic_label_click = !config.automatic_label_click
|
|
26
|
+
config.server_errors << ArgumentError
|
|
27
|
+
end
|
|
28
|
+
expect(Capybara.default_host).not_to eq host
|
|
29
|
+
expect(session.config.default_host).to eq host
|
|
30
|
+
expect(Capybara.automatic_label_click).not_to eq session.config.automatic_label_click
|
|
31
|
+
expect(Capybara.server_errors).not_to eq session.config.server_errors
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "doesn't allow session configuration block when false" do
|
|
35
|
+
Capybara.threadsafe = false
|
|
36
|
+
expect do
|
|
37
|
+
Capybara::Session.new(:rack_test, TestApp) { |config| }
|
|
38
|
+
end.to raise_error 'A configuration block is only accepted when Capybara.threadsafe == true'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "doesn't allow session config when false" do
|
|
42
|
+
Capybara.threadsafe = false
|
|
43
|
+
session = Capybara::Session.new(:rack_test, TestApp)
|
|
44
|
+
expect { session.config.default_selector = :title }.to raise_error(/Per session settings are only supported when Capybara.threadsafe == true/)
|
|
45
|
+
expect do
|
|
46
|
+
session.configure do |config|
|
|
47
|
+
config.exact = true
|
|
48
|
+
end
|
|
49
|
+
end.to raise_error(/Session configuration is only supported when Capybara.threadsafe == true/)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'uses the config from the session' do
|
|
53
|
+
Capybara.threadsafe = true
|
|
54
|
+
session = Capybara::Session.new(:rack_test, TestApp) do |config|
|
|
55
|
+
config.default_selector = :link
|
|
56
|
+
end
|
|
57
|
+
session.visit('/with_html')
|
|
58
|
+
expect(session.find('foo').tag_name).to eq 'a'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "won't change threadsafe once a session is created" do
|
|
62
|
+
Capybara.threadsafe = true
|
|
63
|
+
Capybara.threadsafe = false
|
|
64
|
+
Capybara::Session.new(:rack_test, TestApp)
|
|
65
|
+
expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
nokogumbo_required = begin
|
|
5
|
+
require 'nokogumbo'
|
|
6
|
+
true
|
|
7
|
+
rescue LoadError
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module TestSessions
|
|
12
|
+
RackTest = Capybara::Session.new(:rack_test, TestApp)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
skipped_tests = %i[
|
|
16
|
+
js
|
|
17
|
+
modals
|
|
18
|
+
screenshot
|
|
19
|
+
frames
|
|
20
|
+
windows
|
|
21
|
+
send_keys
|
|
22
|
+
server
|
|
23
|
+
hover
|
|
24
|
+
about_scheme
|
|
25
|
+
download
|
|
26
|
+
css
|
|
27
|
+
scroll
|
|
28
|
+
spatial
|
|
29
|
+
]
|
|
30
|
+
Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip: skipped_tests do |example|
|
|
31
|
+
case example.metadata[:full_description]
|
|
32
|
+
when /has_css\? should support case insensitive :class and :id options/
|
|
33
|
+
skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
|
|
34
|
+
when /#click_button should follow permanent redirects that maintain method/
|
|
35
|
+
skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
40
|
+
context 'with rack test driver' do
|
|
41
|
+
let(:session) { TestSessions::RackTest }
|
|
42
|
+
|
|
43
|
+
describe '#driver' do
|
|
44
|
+
it 'should be a rack test driver' do
|
|
45
|
+
expect(session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe '#mode' do
|
|
50
|
+
it 'should remember the mode' do
|
|
51
|
+
expect(session.mode).to eq(:rack_test)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe '#click_link' do
|
|
56
|
+
after do
|
|
57
|
+
session.driver.options[:respect_data_method] = false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'should use data-method if option is true' do
|
|
61
|
+
session.driver.options[:respect_data_method] = true
|
|
62
|
+
session.visit '/with_html'
|
|
63
|
+
session.click_link 'A link with data-method'
|
|
64
|
+
expect(session.html).to include('The requested object was deleted')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should not use data-method if option is false' do
|
|
68
|
+
session.driver.options[:respect_data_method] = false
|
|
69
|
+
session.visit '/with_html'
|
|
70
|
+
session.click_link 'A link with data-method'
|
|
71
|
+
expect(session.html).to include('Not deleted')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should use data-method if available even if it's capitalized" do
|
|
75
|
+
session.driver.options[:respect_data_method] = true
|
|
76
|
+
session.visit '/with_html'
|
|
77
|
+
session.click_link 'A link with capitalized data-method'
|
|
78
|
+
expect(session.html).to include('The requested object was deleted')
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe '#fill_in' do
|
|
83
|
+
it 'should warn that :fill_options are not supported' do
|
|
84
|
+
session.visit '/with_html'
|
|
85
|
+
expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
|
|
86
|
+
output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
|
|
87
|
+
expect(session).to have_field('test_field', with: 'not_monkey')
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe '#attach_file' do
|
|
92
|
+
context 'with multipart form' do
|
|
93
|
+
it 'should submit an empty form-data section if no file is submitted' do
|
|
94
|
+
session.visit('/form')
|
|
95
|
+
session.click_button('Upload Empty')
|
|
96
|
+
expect(session.html).to include('Successfully ignored empty file field.')
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should not submit an obsolete mime type' do
|
|
101
|
+
test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
|
|
102
|
+
session.visit('/form')
|
|
103
|
+
session.attach_file 'form_document', test_jpg_file_path
|
|
104
|
+
session.click_button('Upload Single')
|
|
105
|
+
expect(session).to have_content('Content-type: text/csv')
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
describe '#click' do
|
|
110
|
+
context 'on a label' do
|
|
111
|
+
it 'should toggle the associated checkbox' do
|
|
112
|
+
session.visit('/form')
|
|
113
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
114
|
+
session.find(:label, 'Cat').click
|
|
115
|
+
expect(session).to have_checked_field('form_pets_cat')
|
|
116
|
+
session.find(:label, 'Cat').click
|
|
117
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
118
|
+
session.find(:label, 'McLaren').click
|
|
119
|
+
expect(session).to have_checked_field('form_cars_mclaren', visible: :hidden)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'should toggle the associated radio' do
|
|
123
|
+
session.visit('/form')
|
|
124
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
125
|
+
session.find(:label, 'Male').click
|
|
126
|
+
expect(session).to have_checked_field('gender_male')
|
|
127
|
+
session.find(:label, 'Female').click
|
|
128
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'should rewrite the forms action query for get submission' do
|
|
132
|
+
session.visit('/form')
|
|
133
|
+
session.click_button('mediocre')
|
|
134
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'should rewrite the submit buttons formaction query for get submission' do
|
|
138
|
+
session.visit('/form')
|
|
139
|
+
session.click_button('mediocre2')
|
|
140
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe '#text' do
|
|
146
|
+
it 'should return original text content for textareas' do
|
|
147
|
+
session.visit('/with_html')
|
|
148
|
+
session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
|
|
149
|
+
normal = session.find(:css, '#normal')
|
|
150
|
+
expect(normal.value).to eq 'hello'
|
|
151
|
+
expect(normal.text).to eq 'banana'
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe '#style' do
|
|
156
|
+
it 'should raise an error' do
|
|
157
|
+
session.visit('/with_html')
|
|
158
|
+
el = session.find(:css, '#first')
|
|
159
|
+
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
RSpec.describe Capybara::RackTest::Driver do
|
|
166
|
+
let(:driver) { TestSessions::RackTest.driver }
|
|
167
|
+
|
|
168
|
+
describe ':headers option' do
|
|
169
|
+
it 'should always set headers' do
|
|
170
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
171
|
+
driver.visit('/get_header')
|
|
172
|
+
expect(driver.html).to include('foobar')
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'should keep headers on link clicks' do
|
|
176
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
177
|
+
driver.visit('/header_links')
|
|
178
|
+
driver.find_xpath('.//a').first.click
|
|
179
|
+
expect(driver.html).to include('foobar')
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it 'should keep headers on form submit' do
|
|
183
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
184
|
+
driver.visit('/header_links')
|
|
185
|
+
driver.find_xpath('.//input').first.click
|
|
186
|
+
expect(driver.html).to include('foobar')
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it 'should keep headers on redirects' do
|
|
190
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
191
|
+
driver.visit('/get_header_via_redirect')
|
|
192
|
+
expect(driver.html).to include('foobar')
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
describe ':follow_redirects option' do
|
|
197
|
+
it 'defaults to following redirects' do
|
|
198
|
+
driver = described_class.new(TestApp)
|
|
199
|
+
|
|
200
|
+
driver.visit('/redirect')
|
|
201
|
+
expect(driver.response.header['Location']).to be_nil
|
|
202
|
+
expect(driver.current_url).to match %r{/landed$}
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it 'is possible to not follow redirects' do
|
|
206
|
+
driver = described_class.new(TestApp, follow_redirects: false)
|
|
207
|
+
|
|
208
|
+
driver.visit('/redirect')
|
|
209
|
+
expect(driver.response.header['Location']).to match %r{/redirect_again$}
|
|
210
|
+
expect(driver.current_url).to match %r{/redirect$}
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe ':redirect_limit option' do
|
|
215
|
+
context 'with default redirect limit' do
|
|
216
|
+
let(:driver) { described_class.new(TestApp) }
|
|
217
|
+
|
|
218
|
+
it 'should follow 5 redirects' do
|
|
219
|
+
driver.visit('/redirect/5/times')
|
|
220
|
+
expect(driver.html).to include('redirection complete')
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it 'should not follow more than 6 redirects' do
|
|
224
|
+
expect do
|
|
225
|
+
driver.visit('/redirect/6/times')
|
|
226
|
+
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context 'with 21 redirect limit' do
|
|
231
|
+
let(:driver) { described_class.new(TestApp, redirect_limit: 21) }
|
|
232
|
+
|
|
233
|
+
it 'should follow 21 redirects' do
|
|
234
|
+
driver.visit('/redirect/21/times')
|
|
235
|
+
expect(driver.html).to include('redirection complete')
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it 'should not follow more than 21 redirects' do
|
|
239
|
+
expect do
|
|
240
|
+
driver.visit('/redirect/22/times')
|
|
241
|
+
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
RSpec.describe 'Capybara::String' do
|
|
248
|
+
it 'should use gumbo' do
|
|
249
|
+
skip 'Only valid if gumbo is included' unless nokogumbo_required
|
|
250
|
+
allow(Nokogiri).to receive(:HTML5).and_call_original
|
|
251
|
+
Capybara.string('<div id=test_div></div>')
|
|
252
|
+
expect(Nokogiri).to have_received(:HTML5)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
module CSSHandlerIncludeTester
|
|
257
|
+
def dont_extend_css_handler
|
|
258
|
+
raise 'should never be called'
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
RSpec.describe Capybara::RackTest::CSSHandlers do
|
|
263
|
+
include CSSHandlerIncludeTester
|
|
264
|
+
|
|
265
|
+
it 'should not be extended by global includes' do
|
|
266
|
+
expect(described_class.new).not_to respond_to(:dont_extend_css_handler)
|
|
267
|
+
end
|
|
268
|
+
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
|