capybara 2.18.0 → 3.40.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 +945 -12
- data/License.txt +1 -1
- data/README.md +264 -90
- data/lib/capybara/config.rb +29 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +35 -18
- data/lib/capybara/driver/node.rb +40 -10
- data/lib/capybara/dsl.rb +10 -7
- data/lib/capybara/helpers.rb +70 -31
- data/lib/capybara/minitest/spec.rb +185 -83
- data/lib/capybara/minitest.rb +232 -112
- data/lib/capybara/node/actions.rb +274 -171
- data/lib/capybara/node/base.rb +42 -34
- data/lib/capybara/node/document.rb +15 -3
- data/lib/capybara/node/document_matchers.rb +19 -21
- data/lib/capybara/node/element.rb +362 -135
- data/lib/capybara/node/finders.rb +151 -137
- data/lib/capybara/node/matchers.rb +394 -209
- data/lib/capybara/node/simple.rb +59 -26
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +12 -9
- data/lib/capybara/queries/base_query.rb +39 -28
- data/lib/capybara/queries/current_path_query.rb +21 -27
- data/lib/capybara/queries/match_query.rb +14 -7
- data/lib/capybara/queries/selector_query.rb +659 -149
- data/lib/capybara/queries/sibling_query.rb +11 -9
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +56 -38
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +114 -42
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +22 -17
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +93 -58
- data/lib/capybara/rack_test/node.rb +184 -81
- data/lib/capybara/rails.rb +3 -7
- data/lib/capybara/registration_container.rb +41 -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 +66 -0
- data/lib/capybara/result.rb +97 -63
- data/lib/capybara/rspec/features.rb +17 -50
- data/lib/capybara/rspec/matcher_proxies.rb +52 -15
- data/lib/capybara/rspec/matchers/base.rb +113 -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 +69 -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 +146 -310
- data/lib/capybara/rspec.rb +7 -11
- 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 +85 -13
- 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 +55 -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 +280 -0
- data/lib/capybara/selector/filter.rb +2 -17
- data/lib/capybara/selector/filter_set.rb +80 -33
- data/lib/capybara/selector/filters/base.rb +50 -6
- data/lib/capybara/selector/filters/expression_filter.rb +8 -26
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -12
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +93 -210
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +475 -523
- 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 +298 -267
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -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 +229 -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/node.rb +517 -145
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -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/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 +80 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +59 -67
- data/lib/capybara/session/config.rb +81 -67
- data/lib/capybara/session/matchers.rb +28 -20
- data/lib/capybara/session.rb +337 -365
- 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 +151 -12
- data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +161 -57
- data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
- 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.rb → assert_title_spec.rb} +22 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +117 -55
- data/lib/capybara/spec/session/choose_spec.rb +64 -31
- data/lib/capybara/spec/session/click_button_spec.rb +231 -173
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
- data/lib/capybara/spec/session/click_link_spec.rb +93 -58
- data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
- data/lib/capybara/spec/session/current_url_spec.rb +57 -39
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -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 +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
- data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
- data/lib/capybara/spec/session/find_button_spec.rb +25 -24
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +37 -41
- data/lib/capybara/spec/session/find_link_spec.rb +46 -17
- data/lib/capybara/spec/session/find_spec.rb +260 -145
- data/lib/capybara/spec/session/first_spec.rb +80 -52
- 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 +33 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
- 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 +100 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +139 -59
- data/lib/capybara/spec/session/has_link_spec.rb +47 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
- data/lib/capybara/spec/session/has_select_spec.rb +107 -72
- data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +183 -5
- data/lib/capybara/spec/session/has_text_spec.rb +106 -62
- data/lib/capybara/spec/session/has_title_spec.rb +20 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +1024 -153
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +12 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +107 -81
- data/lib/capybara/spec/session/selectors_spec.rb +52 -19
- data/lib/capybara/spec/session/sibling_spec.rb +10 -10
- data/lib/capybara/spec/session/text_spec.rb +37 -21
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
- data/lib/capybara/spec/session/unselect_spec.rb +39 -38
- data/lib/capybara/spec/session/visit_spec.rb +85 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
- data/lib/capybara/spec/session/window/window_spec.rb +97 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
- data/lib/capybara/spec/session/within_spec.rb +83 -44
- data/lib/capybara/spec/spec_helper.rb +54 -44
- data/lib/capybara/spec/test_app.rb +158 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +163 -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 +69 -12
- 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.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -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 +5 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +36 -34
- data/lib/capybara.rb +134 -107
- data/spec/basic_node_spec.rb +60 -34
- data/spec/capybara_spec.rb +63 -88
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +85 -64
- data/spec/filter_set_spec.rb +27 -9
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
- data/spec/minitest_spec.rb +52 -7
- data/spec/minitest_spec_spec.rb +94 -63
- data/spec/per_session_config_spec.rb +14 -13
- data/spec/rack_test_spec.rb +194 -125
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +111 -50
- data/spec/rspec/features_spec.rb +37 -31
- data/spec/rspec/scenarios_spec.rb +10 -8
- data/spec/rspec/shared_spec_matchers.rb +473 -422
- data/spec/rspec/views_spec.rb +5 -3
- data/spec/rspec_matchers_spec.rb +52 -11
- data/spec/rspec_spec.rb +109 -89
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +397 -68
- data/spec/selenium_spec_chrome.rb +187 -40
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +60 -0
- data/spec/selenium_spec_firefox.rb +201 -41
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +149 -0
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +213 -102
- data/spec/session_spec.rb +53 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +473 -122
- data/spec/spec_helper.rb +126 -7
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +355 -73
- 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/query.rb +0 -7
- data/lib/capybara/rspec/compound.rb +0 -95
- data/lib/capybara/spec/session/assert_current_path.rb +0 -72
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -234
- 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 -127
data/spec/result_spec.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'spec_helper'
|
|
3
4
|
|
|
4
5
|
RSpec.describe Capybara::Result do
|
|
@@ -14,43 +15,52 @@ RSpec.describe Capybara::Result do
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
let :result do
|
|
17
|
-
string.all '//li'
|
|
18
|
+
string.all '//li', minimum: 0 # pass minimum: 0 so lazy evaluation doesn't get triggered yet
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
it
|
|
21
|
+
it 'has a length' do
|
|
21
22
|
expect(result.length).to eq(4)
|
|
22
23
|
end
|
|
23
24
|
|
|
24
|
-
it
|
|
25
|
+
it 'has a first element' do
|
|
25
26
|
result.first.text == 'Alpha'
|
|
26
27
|
end
|
|
27
28
|
|
|
28
|
-
it
|
|
29
|
+
it 'has a last element' do
|
|
29
30
|
result.last.text == 'Delta'
|
|
30
31
|
end
|
|
31
32
|
|
|
33
|
+
it 'splats into multiple assignment' do
|
|
34
|
+
first, *rest, last = result
|
|
35
|
+
|
|
36
|
+
expect(first).to have_text 'Alpha'
|
|
37
|
+
expect(rest.first).to have_text 'Beta'
|
|
38
|
+
expect(rest.last).to have_text 'Gamma'
|
|
39
|
+
expect(last).to have_text 'Delta'
|
|
40
|
+
end
|
|
41
|
+
|
|
32
42
|
it 'can supports values_at method' do
|
|
33
|
-
expect(result.values_at(0, 2).map(&:text)).to eq(%w
|
|
43
|
+
expect(result.values_at(0, 2).map(&:text)).to eq(%w[Alpha Gamma])
|
|
34
44
|
end
|
|
35
45
|
|
|
36
|
-
it
|
|
46
|
+
it 'can return an element by its index' do
|
|
37
47
|
expect(result.at(1).text).to eq('Beta')
|
|
38
48
|
expect(result[2].text).to eq('Gamma')
|
|
39
49
|
end
|
|
40
50
|
|
|
41
|
-
it
|
|
42
|
-
expect(result.map(&:text)).to eq(%w
|
|
51
|
+
it 'can be mapped' do
|
|
52
|
+
expect(result.map(&:text)).to eq(%w[Alpha Beta Gamma Delta])
|
|
43
53
|
end
|
|
44
54
|
|
|
45
|
-
it
|
|
46
|
-
expect(result.
|
|
55
|
+
it 'can be selected' do
|
|
56
|
+
expect(result.count do |element|
|
|
47
57
|
element.text.include? 't'
|
|
48
|
-
end
|
|
58
|
+
end).to eq(2)
|
|
49
59
|
end
|
|
50
60
|
|
|
51
|
-
it
|
|
61
|
+
it 'can be reduced' do
|
|
52
62
|
expect(result.reduce('') do |memo, element|
|
|
53
|
-
memo
|
|
63
|
+
memo + element.text[0]
|
|
54
64
|
end).to eq('ABGD')
|
|
55
65
|
end
|
|
56
66
|
|
|
@@ -64,62 +74,109 @@ RSpec.describe Capybara::Result do
|
|
|
64
74
|
end).to eq(2)
|
|
65
75
|
end
|
|
66
76
|
|
|
77
|
+
def recalc_result
|
|
78
|
+
string.all '//li', minimum: 0 # pass minimum: 0 so lazy evaluation doesn't get triggered yet
|
|
79
|
+
end
|
|
80
|
+
|
|
67
81
|
it 'supports all modes of []' do
|
|
68
|
-
expect(
|
|
69
|
-
expect(
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
82
|
+
expect(recalc_result[1].text).to eq 'Beta'
|
|
83
|
+
expect(recalc_result[0, 2].map(&:text)).to eq %w[Alpha Beta]
|
|
84
|
+
expect(recalc_result[1..3].map(&:text)).to eq %w[Beta Gamma Delta]
|
|
85
|
+
expect(recalc_result[-1].text).to eq 'Delta'
|
|
86
|
+
expect(recalc_result[-2, 3].map(&:text)).to eq %w[Gamma Delta]
|
|
87
|
+
expect(recalc_result[1...3].map(&:text)).to eq %w[Beta Gamma]
|
|
88
|
+
expect(recalc_result[1..7].map(&:text)).to eq %w[Beta Gamma Delta]
|
|
89
|
+
expect(recalc_result[2...-1].map(&:text)).to eq %w[Gamma]
|
|
90
|
+
expect(recalc_result[2..-1].map(&:text)).to eq %w[Gamma Delta] # rubocop:disable Style/SlicingWithRange
|
|
91
|
+
expect(recalc_result[2..].map(&:text)).to eq %w[Gamma Delta]
|
|
72
92
|
end
|
|
73
93
|
|
|
74
|
-
it '
|
|
75
|
-
result
|
|
76
|
-
|
|
94
|
+
it 'supports endless ranges' do
|
|
95
|
+
expect(result[2..].map(&:text)).to eq %w[Gamma Delta]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it 'supports inclusive positive beginless ranges' do
|
|
99
|
+
expect(result[..2].map(&:text)).to eq %w[Alpha Beta Gamma]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'supports inclusive negative beginless ranges' do
|
|
103
|
+
expect(result[..-2].map(&:text)).to eq %w[Alpha Beta Gamma]
|
|
104
|
+
expect(result[..-1].map(&:text)).to eq %w[Alpha Beta Gamma Delta]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'supports exclusive positive beginless ranges' do
|
|
108
|
+
expect(result[...2].map(&:text)).to eq %w[Alpha Beta]
|
|
77
109
|
end
|
|
78
110
|
|
|
79
|
-
it '
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
result = string.all('//li', text: 'Alpha')
|
|
83
|
-
expect(result.size).to eq 0
|
|
111
|
+
it 'supports exclusive negative beginless ranges' do
|
|
112
|
+
expect(result[...-2].map(&:text)).to eq %w[Alpha Beta]
|
|
113
|
+
expect(result[...-1].map(&:text)).to eq %w[Alpha Beta Gamma]
|
|
84
114
|
end
|
|
85
115
|
|
|
86
|
-
it '
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
expect do
|
|
90
|
-
string.all('//li', text: 'Alpha').to_a
|
|
91
|
-
end.to raise_error(StandardError)
|
|
116
|
+
it 'works with filter blocks' do
|
|
117
|
+
result = string.all('//li') { |node| node.text == 'Alpha' }
|
|
118
|
+
expect(result.size).to eq 1
|
|
92
119
|
end
|
|
93
120
|
|
|
94
|
-
#Not a great test but it indirectly tests what is needed
|
|
95
|
-
it
|
|
96
|
-
skip 'JRuby has an issue with lazy enumerator evaluation' if
|
|
97
|
-
#Not processed until accessed
|
|
98
|
-
expect(result.instance_variable_get(
|
|
121
|
+
# Not a great test but it indirectly tests what is needed
|
|
122
|
+
it 'should evaluate filters lazily for idx' do
|
|
123
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
124
|
+
# Not processed until accessed
|
|
125
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 0
|
|
99
126
|
|
|
100
|
-
#Only one retrieved when needed
|
|
127
|
+
# Only one retrieved when needed
|
|
101
128
|
result.first
|
|
102
|
-
expect(result.instance_variable_get(
|
|
129
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 1
|
|
103
130
|
|
|
104
|
-
#works for indexed access
|
|
131
|
+
# works for indexed access
|
|
105
132
|
result[0]
|
|
106
|
-
expect(result.instance_variable_get(
|
|
133
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 1
|
|
107
134
|
|
|
108
135
|
result[2]
|
|
109
|
-
expect(result.instance_variable_get(
|
|
136
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 3
|
|
137
|
+
|
|
138
|
+
# All cached when converted to array
|
|
139
|
+
result.to_a
|
|
140
|
+
expect(result.instance_variable_get(:@result_cache).size).to eq 4
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'should evaluate filters lazily for range' do
|
|
144
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
145
|
+
result[0..1]
|
|
146
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 2
|
|
147
|
+
|
|
148
|
+
expect(result[0..7].size).to eq 4
|
|
149
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 4
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it 'should evaluate filters lazily for idx and length' do
|
|
153
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
154
|
+
result[1, 2]
|
|
155
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 3
|
|
156
|
+
|
|
157
|
+
expect(result[2, 5].size).to eq 2
|
|
158
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 4
|
|
159
|
+
end
|
|
110
160
|
|
|
111
|
-
|
|
161
|
+
it 'should only need to evaluate one result for any?' do
|
|
162
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
163
|
+
result.any?
|
|
164
|
+
expect(result.instance_variable_get(:@result_cache).size).to be 1
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it 'should evaluate all elements when #to_a called' do
|
|
168
|
+
# All cached when converted to array
|
|
112
169
|
result.to_a
|
|
113
|
-
expect(result.instance_variable_get(
|
|
170
|
+
expect(result.instance_variable_get(:@result_cache).size).to eq 4
|
|
114
171
|
end
|
|
115
172
|
|
|
116
|
-
|
|
173
|
+
describe '#each' do
|
|
117
174
|
it 'lazily evaluates' do
|
|
118
|
-
skip 'JRuby has an issue with lazy enumerator evaluation' if
|
|
119
|
-
results=[]
|
|
175
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
176
|
+
results = []
|
|
120
177
|
result.each do |el|
|
|
121
178
|
results << el
|
|
122
|
-
expect(result.instance_variable_get(
|
|
179
|
+
expect(result.instance_variable_get(:@result_cache).size).to eq results.size
|
|
123
180
|
end
|
|
124
181
|
|
|
125
182
|
expect(results.size).to eq 4
|
|
@@ -131,11 +188,15 @@ RSpec.describe Capybara::Result do
|
|
|
131
188
|
end
|
|
132
189
|
|
|
133
190
|
it 'lazily evaluates' do
|
|
134
|
-
skip 'JRuby has an issue with lazy enumerator evaluation' if
|
|
135
|
-
result.each.with_index do |
|
|
136
|
-
expect(result.instance_variable_get(
|
|
191
|
+
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
|
192
|
+
result.each.with_index do |_el, idx|
|
|
193
|
+
expect(result.instance_variable_get(:@result_cache).size).to eq(idx + 1) # 0 indexing
|
|
137
194
|
end
|
|
138
195
|
end
|
|
139
196
|
end
|
|
140
197
|
end
|
|
198
|
+
|
|
199
|
+
def jruby_lazy_enumerator_workaround?
|
|
200
|
+
RUBY_PLATFORM == 'java'
|
|
201
|
+
end
|
|
141
202
|
end
|
data/spec/rspec/features_spec.rb
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable RSpec/MultipleDescribes
|
|
4
|
+
|
|
2
5
|
require 'spec_helper'
|
|
3
6
|
require 'capybara/rspec'
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
# rubocop:disable RSpec/InstanceVariable
|
|
9
|
+
RSpec.configuration.before(:each, file_path: './spec/rspec/features_spec.rb') do
|
|
6
10
|
@in_filtered_hook = true
|
|
7
11
|
end
|
|
8
12
|
|
|
@@ -11,34 +15,30 @@ feature "Capybara's feature DSL" do
|
|
|
11
15
|
@in_background = true
|
|
12
16
|
end
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
RSpec.respond_to?(:current_example) ? RSpec.current_example : context.example
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
scenario "includes Capybara" do
|
|
18
|
+
scenario 'includes Capybara' do
|
|
19
19
|
visit('/')
|
|
20
20
|
expect(page).to have_content('Hello world!')
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
scenario
|
|
24
|
-
expect(
|
|
23
|
+
scenario 'preserves description' do |ex|
|
|
24
|
+
expect(ex.metadata[:full_description])
|
|
25
25
|
.to eq("Capybara's feature DSL preserves description")
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
scenario
|
|
28
|
+
scenario 'allows driver switching', driver: :selenium do
|
|
29
29
|
expect(Capybara.current_driver).to eq(:selenium)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
scenario
|
|
32
|
+
scenario 'runs background' do
|
|
33
33
|
expect(@in_background).to be_truthy
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
scenario
|
|
36
|
+
scenario 'runs hooks filtered by file path' do
|
|
37
37
|
expect(@in_filtered_hook).to be_truthy
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
scenario "doesn't pollute the Object namespace" do
|
|
41
|
-
expect(Object.new.respond_to
|
|
41
|
+
expect(Object.new).not_to respond_to(:feature)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
feature 'nested features' do
|
|
@@ -47,17 +47,18 @@ feature "Capybara's feature DSL" do
|
|
|
47
47
|
expect(page).to have_content 'Hello world!'
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
scenario 'are marked in the metadata as capybara_feature' do
|
|
51
|
-
expect(
|
|
50
|
+
scenario 'are marked in the metadata as capybara_feature' do |ex|
|
|
51
|
+
expect(ex.metadata[:capybara_feature]).to be_truthy
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
scenario 'have a type of :feature' do
|
|
55
|
-
expect(
|
|
54
|
+
scenario 'have a type of :feature' do |ex|
|
|
55
|
+
expect(ex.metadata[:type]).to eq :feature
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
|
+
# rubocop:enable RSpec/InstanceVariable
|
|
59
60
|
|
|
60
|
-
feature
|
|
61
|
+
feature 'given and given! aliases to let and let!' do
|
|
61
62
|
given(:value) { :available }
|
|
62
63
|
given!(:value_in_background) { :available }
|
|
63
64
|
|
|
@@ -65,31 +66,36 @@ feature "given and given! aliases to let and let!" do
|
|
|
65
66
|
expect(value_in_background).to be(:available)
|
|
66
67
|
end
|
|
67
68
|
|
|
68
|
-
scenario
|
|
69
|
+
scenario 'given and given! work as intended' do
|
|
69
70
|
expect(value).to be(:available)
|
|
70
71
|
expect(value_in_background).to be(:available)
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
|
|
74
|
-
feature "Capybara's feature DSL with driver", :
|
|
75
|
-
scenario
|
|
75
|
+
feature "Capybara's feature DSL with driver", driver: :culerity do
|
|
76
|
+
scenario 'switches driver' do
|
|
76
77
|
expect(Capybara.current_driver).to eq(:culerity)
|
|
77
78
|
end
|
|
78
79
|
end
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
# rubocop:disable RSpec/RepeatedExample
|
|
82
|
+
xfeature 'if xfeature aliases to pending then' do
|
|
83
|
+
scenario "this should be 'temporarily disabled with xfeature'" do
|
|
84
|
+
# dummy
|
|
84
85
|
end
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
scenario "this also should be 'temporarily disabled with xfeature'" do
|
|
88
|
+
# dummy
|
|
89
|
+
end
|
|
90
|
+
end
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
ffeature 'if ffeature aliases focused tag then' do # rubocop:disable RSpec/Focus
|
|
93
|
+
scenario 'scenario inside this feature has metatag focus tag' do |example|
|
|
94
|
+
expect(example.metadata[:focus]).to be true
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
scenario 'other scenarios also has metatag focus tag' do |example|
|
|
98
|
+
expect(example.metadata[:focus]).to be true
|
|
94
99
|
end
|
|
95
100
|
end
|
|
101
|
+
# rubocop:enable RSpec/RepeatedExample, RSpec/MultipleDescribes
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rubocop:disable RSpec/MultipleDescribes
|
|
4
|
+
|
|
2
5
|
require 'spec_helper'
|
|
3
6
|
require 'capybara/rspec'
|
|
4
7
|
|
|
5
|
-
RSpec.configuration.before(:each,
|
|
8
|
+
RSpec.configuration.before(:each, file_path: './spec/rspec/scenarios_spec.rb') do
|
|
6
9
|
@in_filtered_hook = true
|
|
7
10
|
end
|
|
8
11
|
|
|
9
|
-
if
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
expect(example.metadata[:focus]).to eq true
|
|
13
|
-
end
|
|
12
|
+
feature 'if fscenario aliases focused tag then' do
|
|
13
|
+
fscenario 'scenario should have focused meta tag' do |example| # rubocop:disable RSpec/Focus
|
|
14
|
+
expect(example.metadata[:focus]).to be true
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
feature
|
|
18
|
-
xscenario "this test should be 'temporarily disabled with xscenario'" do
|
|
18
|
+
feature 'if xscenario aliases to pending then' do
|
|
19
|
+
xscenario "this test should be 'temporarily disabled with xscenario'" do # rubocop:disable RSpec/PendingWithoutReason
|
|
19
20
|
end
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
# rubocop:enable RSpec/MultipleDescribes
|