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