capybara 3.3.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.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +27 -25
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +436 -134
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +121 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +127 -40
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/assert_current_path_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/headers_spec.rb +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/response_code_spec.rb +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  206. data/lib/capybara/spec/session/select_spec.rb +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -167
data/spec/result_spec.rb CHANGED
@@ -18,38 +18,47 @@ RSpec.describe Capybara::Result do
18
18
  string.all '//li', minimum: 0 # pass minimum: 0 so lazy evaluation doesn't get triggered yet
19
19
  end
20
20
 
21
- it "has a length" do
21
+ it 'has a length' do
22
22
  expect(result.length).to eq(4)
23
23
  end
24
24
 
25
- it "has a first element" do
25
+ it 'has a first element' do
26
26
  result.first.text == 'Alpha'
27
27
  end
28
28
 
29
- it "has a last element" do
29
+ it 'has a last element' do
30
30
  result.last.text == 'Delta'
31
31
  end
32
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
+
33
42
  it 'can supports values_at method' do
34
43
  expect(result.values_at(0, 2).map(&:text)).to eq(%w[Alpha Gamma])
35
44
  end
36
45
 
37
- it "can return an element by its index" do
46
+ it 'can return an element by its index' do
38
47
  expect(result.at(1).text).to eq('Beta')
39
48
  expect(result[2].text).to eq('Gamma')
40
49
  end
41
50
 
42
- it "can be mapped" do
51
+ it 'can be mapped' do
43
52
  expect(result.map(&:text)).to eq(%w[Alpha Beta Gamma Delta])
44
53
  end
45
54
 
46
- it "can be selected" do
47
- expect(result.select do |element|
55
+ it 'can be selected' do
56
+ expect(result.count do |element|
48
57
  element.text.include? 't'
49
- end.length).to eq(2)
58
+ end).to eq(2)
50
59
  end
51
60
 
52
- it "can be reduced" do
61
+ it 'can be reduced' do
53
62
  expect(result.reduce('') do |memo, element|
54
63
  memo + element.text[0]
55
64
  end).to eq('ABGD')
@@ -65,98 +74,109 @@ RSpec.describe Capybara::Result do
65
74
  end).to eq(2)
66
75
  end
67
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
+
68
81
  it 'supports all modes of []' do
69
- expect(result[1].text).to eq 'Beta'
70
- expect(result[0, 2].map(&:text)).to eq %w[Alpha Beta]
71
- expect(result[1..3].map(&:text)).to eq %w[Beta Gamma Delta]
72
- expect(result[-1].text).to eq 'Delta'
73
- expect(result[-2, 3].map(&:text)).to eq %w[Gamma Delta]
74
- expect(result[1..7].map(&:text)).to eq %w[Beta Gamma Delta]
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]
75
92
  end
76
93
 
77
- it 'works with filter blocks' do
78
- result = string.all('//li') { |node| node.text == 'Alpha' }
79
- expect(result.size).to eq 1
94
+ it 'supports endless ranges' do
95
+ expect(result[2..].map(&:text)).to eq %w[Gamma Delta]
80
96
  end
81
97
 
82
- it 'should catch invalid element errors during filtering' do
83
- allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
84
- allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(
85
- instance_double("Capybara::Session", driver: instance_double("Capybara::Driver::Base", invalid_element_errors: [StandardError]))
86
- )
87
- result = string.all('//li', text: 'Alpha')
88
- expect(result.size).to eq 0
98
+ it 'supports inclusive positive beginless ranges' do
99
+ expect(result[..2].map(&:text)).to eq %w[Alpha Beta Gamma]
89
100
  end
90
101
 
91
- it 'should return non-invalid element errors during filtering' do
92
- allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
93
- allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(
94
- instance_double("Capybara::Session", driver: instance_double("Capybara::Driver::Base", invalid_element_errors: [ArgumentError]))
95
- )
96
- expect do
97
- string.all('//li', text: 'Alpha').to_a
98
- end.to raise_error(StandardError)
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]
109
+ end
110
+
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]
114
+ end
115
+
116
+ it 'works with filter blocks' do
117
+ result = string.all('//li') { |node| node.text == 'Alpha' }
118
+ expect(result.size).to eq 1
99
119
  end
100
120
 
101
121
  # Not a great test but it indirectly tests what is needed
102
- it "should evaluate filters lazily for idx" do
103
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
122
+ it 'should evaluate filters lazily for idx' do
123
+ skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
104
124
  # Not processed until accessed
105
- expect(result.instance_variable_get('@result_cache').size).to be 0
125
+ expect(result.instance_variable_get(:@result_cache).size).to be 0
106
126
 
107
127
  # Only one retrieved when needed
108
128
  result.first
109
- expect(result.instance_variable_get('@result_cache').size).to be 1
129
+ expect(result.instance_variable_get(:@result_cache).size).to be 1
110
130
 
111
131
  # works for indexed access
112
132
  result[0]
113
- expect(result.instance_variable_get('@result_cache').size).to be 1
133
+ expect(result.instance_variable_get(:@result_cache).size).to be 1
114
134
 
115
135
  result[2]
116
- expect(result.instance_variable_get('@result_cache').size).to be 3
136
+ expect(result.instance_variable_get(:@result_cache).size).to be 3
117
137
 
118
138
  # All cached when converted to array
119
139
  result.to_a
120
- expect(result.instance_variable_get('@result_cache').size).to eq 4
140
+ expect(result.instance_variable_get(:@result_cache).size).to eq 4
121
141
  end
122
142
 
123
- it "should evaluate filters lazily for range" do
124
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
143
+ it 'should evaluate filters lazily for range' do
144
+ skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
125
145
  result[0..1]
126
- expect(result.instance_variable_get('@result_cache').size).to be 2
146
+ expect(result.instance_variable_get(:@result_cache).size).to be 2
127
147
 
128
148
  expect(result[0..7].size).to eq 4
129
- expect(result.instance_variable_get('@result_cache').size).to be 4
149
+ expect(result.instance_variable_get(:@result_cache).size).to be 4
130
150
  end
131
151
 
132
- it "should evaluate filters lazily for idx and length" do
133
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
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?
134
154
  result[1, 2]
135
- expect(result.instance_variable_get('@result_cache').size).to be 3
155
+ expect(result.instance_variable_get(:@result_cache).size).to be 3
136
156
 
137
157
  expect(result[2, 5].size).to eq 2
138
- expect(result.instance_variable_get('@result_cache').size).to be 4
158
+ expect(result.instance_variable_get(:@result_cache).size).to be 4
139
159
  end
140
160
 
141
- it "should only need to evaluate one result for any?" do
142
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
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?
143
163
  result.any?
144
- expect(result.instance_variable_get('@result_cache').size).to be 1
164
+ expect(result.instance_variable_get(:@result_cache).size).to be 1
145
165
  end
146
166
 
147
- it "should evaluate all elements when #to_a called" do
167
+ it 'should evaluate all elements when #to_a called' do
148
168
  # All cached when converted to array
149
169
  result.to_a
150
- expect(result.instance_variable_get('@result_cache').size).to eq 4
170
+ expect(result.instance_variable_get(:@result_cache).size).to eq 4
151
171
  end
152
172
 
153
- context '#each' do
173
+ describe '#each' do
154
174
  it 'lazily evaluates' do
155
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
175
+ skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
156
176
  results = []
157
177
  result.each do |el|
158
178
  results << el
159
- expect(result.instance_variable_get('@result_cache').size).to eq results.size
179
+ expect(result.instance_variable_get(:@result_cache).size).to eq results.size
160
180
  end
161
181
 
162
182
  expect(results.size).to eq 4
@@ -168,27 +188,15 @@ RSpec.describe Capybara::Result do
168
188
  end
169
189
 
170
190
  it 'lazily evaluates' do
171
- skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
191
+ skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
172
192
  result.each.with_index do |_el, idx|
173
- expect(result.instance_variable_get('@result_cache').size).to eq(idx + 1) # 0 indexing
193
+ expect(result.instance_variable_get(:@result_cache).size).to eq(idx + 1) # 0 indexing
174
194
  end
175
195
  end
176
196
  end
177
197
  end
178
198
 
179
- context 'lazy select' do
180
- it 'is compatible' do
181
- # This test will let us know when JRuby fixes lazy select so we can re-enable it in Result
182
- pending 'JRuby has an issue with lazy enumberator evaluation' if RUBY_PLATFORM == 'java'
183
- eval_count = 0
184
- enum = %w[Text1 Text2 Text3].lazy.select do
185
- eval_count += 1
186
- true
187
- end
188
- expect(eval_count).to eq 0
189
- enum.next
190
- sleep 1
191
- expect(eval_count).to eq 1
192
- end
199
+ def jruby_lazy_enumerator_workaround?
200
+ RUBY_PLATFORM == 'java'
193
201
  end
194
202
  end
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable RSpec/MultipleDescribes
4
+
3
5
  require 'spec_helper'
4
6
  require 'capybara/rspec'
5
7
 
6
- RSpec.configuration.before(:each, file_path: "./spec/rspec/features_spec.rb") do
8
+ # rubocop:disable RSpec/InstanceVariable
9
+ RSpec.configuration.before(:each, file_path: './spec/rspec/features_spec.rb') do
7
10
  @in_filtered_hook = true
8
11
  end
9
12
 
@@ -12,25 +15,25 @@ feature "Capybara's feature DSL" do
12
15
  @in_background = true
13
16
  end
14
17
 
15
- scenario "includes Capybara" do
18
+ scenario 'includes Capybara' do
16
19
  visit('/')
17
20
  expect(page).to have_content('Hello world!')
18
21
  end
19
22
 
20
- scenario "preserves description" do |ex|
23
+ scenario 'preserves description' do |ex|
21
24
  expect(ex.metadata[:full_description])
22
25
  .to eq("Capybara's feature DSL preserves description")
23
26
  end
24
27
 
25
- scenario "allows driver switching", driver: :selenium do
28
+ scenario 'allows driver switching', driver: :selenium do
26
29
  expect(Capybara.current_driver).to eq(:selenium)
27
30
  end
28
31
 
29
- scenario "runs background" do
32
+ scenario 'runs background' do
30
33
  expect(@in_background).to be_truthy
31
34
  end
32
35
 
33
- scenario "runs hooks filtered by file path" do
36
+ scenario 'runs hooks filtered by file path' do
34
37
  expect(@in_filtered_hook).to be_truthy
35
38
  end
36
39
 
@@ -53,8 +56,9 @@ feature "Capybara's feature DSL" do
53
56
  end
54
57
  end
55
58
  end
59
+ # rubocop:enable RSpec/InstanceVariable
56
60
 
57
- feature "given and given! aliases to let and let!" do
61
+ feature 'given and given! aliases to let and let!' do
58
62
  given(:value) { :available }
59
63
  given!(:value_in_background) { :available }
60
64
 
@@ -62,35 +66,36 @@ feature "given and given! aliases to let and let!" do
62
66
  expect(value_in_background).to be(:available)
63
67
  end
64
68
 
65
- scenario "given and given! work as intended" do
69
+ scenario 'given and given! work as intended' do
66
70
  expect(value).to be(:available)
67
71
  expect(value_in_background).to be(:available)
68
72
  end
69
73
  end
70
74
 
71
75
  feature "Capybara's feature DSL with driver", driver: :culerity do
72
- scenario "switches driver" do
76
+ scenario 'switches driver' do
73
77
  expect(Capybara.current_driver).to eq(:culerity)
74
78
  end
75
79
  end
76
80
 
77
81
  # rubocop:disable RSpec/RepeatedExample
78
- xfeature "if xfeature aliases to pending then" do
82
+ xfeature 'if xfeature aliases to pending then' do
79
83
  scenario "this should be 'temporarily disabled with xfeature'" do
80
84
  # dummy
81
85
  end
86
+
82
87
  scenario "this also should be 'temporarily disabled with xfeature'" do
83
88
  # dummy
84
89
  end
85
90
  end
86
91
 
87
- ffeature "if ffeature aliases focused tag then" do # rubocop:disable RSpec/Focus
88
- scenario "scenario inside this feature has metatag focus tag" do |example|
89
- expect(example.metadata[:focus]).to eq true
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
90
95
  end
91
96
 
92
- scenario "other scenarios also has metatag focus tag " do |example|
93
- expect(example.metadata[:focus]).to eq true
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
96
- # rubocop:enable RSpec/RepeatedExample
101
+ # rubocop:enable RSpec/RepeatedExample, RSpec/MultipleDescribes
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable RSpec/MultipleDescribes
4
+
3
5
  require 'spec_helper'
4
6
  require 'capybara/rspec'
5
7
 
6
- RSpec.configuration.before(:each, file_path: "./spec/rspec/scenarios_spec.rb") do
8
+ RSpec.configuration.before(:each, file_path: './spec/rspec/scenarios_spec.rb') do
7
9
  @in_filtered_hook = true
8
10
  end
9
11
 
10
- feature "if fscenario aliases focused tag then" do
11
- fscenario "scenario should have focused meta tag" do |example| # rubocop:disable RSpec/Focus
12
- expect(example.metadata[:focus]).to eq true
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
13
15
  end
14
16
  end
15
17
 
16
- feature "if xscenario aliases to pending then" do
17
- 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
18
20
  end
19
21
  end
22
+
23
+ # rubocop:enable RSpec/MultipleDescribes