capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  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 +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  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 +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  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 +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  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 +85 -8
  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 +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  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 +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  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 +460 -170
  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 +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  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 +126 -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 +135 -44
  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.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → 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 +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  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.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -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 +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  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 +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  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 +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  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.rb → 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 +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → 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 +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
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,62 +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'
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]
73
92
  end
74
93
 
75
- it 'works with filter blocks' do
76
- result = string.all('//li') { |node| node.text == 'Alpha' }
77
- 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]
78
105
  end
79
106
 
80
- it 'should catch invalid element errors during filtering' do
81
- allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
82
- allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [StandardError])))
83
- result = string.all('//li', text: 'Alpha')
84
- expect(result.size).to eq 0
107
+ it 'supports exclusive positive beginless ranges' do
108
+ expect(result[...2].map(&:text)).to eq %w[Alpha Beta]
85
109
  end
86
110
 
87
- it 'should return non-invalid element errors during filtering' do
88
- allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
89
- allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [ArgumentError])))
90
- expect do
91
- string.all('//li', text: 'Alpha').to_a
92
- end.to raise_error(StandardError)
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
93
119
  end
94
120
 
95
121
  # Not a great test but it indirectly tests what is needed
96
- it "should evaluate filters lazily" do
97
- 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?
98
124
  # Not processed until accessed
99
- expect(result.instance_variable_get('@result_cache').size).to be 0
125
+ expect(result.instance_variable_get(:@result_cache).size).to be 0
100
126
 
101
127
  # Only one retrieved when needed
102
128
  result.first
103
- expect(result.instance_variable_get('@result_cache').size).to be 1
129
+ expect(result.instance_variable_get(:@result_cache).size).to be 1
104
130
 
105
131
  # works for indexed access
106
132
  result[0]
107
- expect(result.instance_variable_get('@result_cache').size).to be 1
133
+ expect(result.instance_variable_get(:@result_cache).size).to be 1
108
134
 
109
135
  result[2]
110
- 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
111
160
 
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
112
168
  # All cached when converted to array
113
169
  result.to_a
114
- expect(result.instance_variable_get('@result_cache').size).to eq 4
170
+ expect(result.instance_variable_get(:@result_cache).size).to eq 4
115
171
  end
116
172
 
117
- context '#each' do
173
+ describe '#each' do
118
174
  it 'lazily evaluates' do
119
- 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?
120
176
  results = []
121
177
  result.each do |el|
122
178
  results << el
123
- 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
124
180
  end
125
181
 
126
182
  expect(results.size).to eq 4
@@ -132,11 +188,15 @@ RSpec.describe Capybara::Result do
132
188
  end
133
189
 
134
190
  it 'lazily evaluates' do
135
- 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?
136
192
  result.each.with_index do |_el, idx|
137
- 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
138
194
  end
139
195
  end
140
196
  end
141
197
  end
198
+
199
+ def jruby_lazy_enumerator_workaround?
200
+ RUBY_PLATFORM == 'java'
201
+ end
142
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,34 +15,30 @@ feature "Capybara's feature DSL" do
12
15
  @in_background = true
13
16
  end
14
17
 
15
- def current_example(context)
16
- RSpec.respond_to?(:current_example) ? RSpec.current_example : context.example
17
- end
18
-
19
- scenario "includes Capybara" do
18
+ scenario 'includes Capybara' do
20
19
  visit('/')
21
20
  expect(page).to have_content('Hello world!')
22
21
  end
23
22
 
24
- scenario "preserves description" do
25
- expect(current_example(self).metadata[:full_description])
23
+ scenario 'preserves description' do |ex|
24
+ expect(ex.metadata[:full_description])
26
25
  .to eq("Capybara's feature DSL preserves description")
27
26
  end
28
27
 
29
- scenario "allows driver switching", driver: :selenium do
28
+ scenario 'allows driver switching', driver: :selenium do
30
29
  expect(Capybara.current_driver).to eq(:selenium)
31
30
  end
32
31
 
33
- scenario "runs background" do
32
+ scenario 'runs background' do
34
33
  expect(@in_background).to be_truthy
35
34
  end
36
35
 
37
- scenario "runs hooks filtered by file path" do
36
+ scenario 'runs hooks filtered by file path' do
38
37
  expect(@in_filtered_hook).to be_truthy
39
38
  end
40
39
 
41
40
  scenario "doesn't pollute the Object namespace" do
42
- expect(Object.new.respond_to?(:feature, true)).to be_falsey
41
+ expect(Object.new).not_to respond_to(:feature)
43
42
  end
44
43
 
45
44
  feature 'nested features' do
@@ -48,17 +47,18 @@ feature "Capybara's feature DSL" do
48
47
  expect(page).to have_content 'Hello world!'
49
48
  end
50
49
 
51
- scenario 'are marked in the metadata as capybara_feature' do
52
- 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
53
52
  end
54
53
 
55
- scenario 'have a type of :feature' do
56
- 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
57
56
  end
58
57
  end
59
58
  end
59
+ # rubocop:enable RSpec/InstanceVariable
60
60
 
61
- feature "given and given! aliases to let and let!" do
61
+ feature 'given and given! aliases to let and let!' do
62
62
  given(:value) { :available }
63
63
  given!(:value_in_background) { :available }
64
64
 
@@ -66,33 +66,36 @@ feature "given and given! aliases to let and let!" do
66
66
  expect(value_in_background).to be(:available)
67
67
  end
68
68
 
69
- scenario "given and given! work as intended" do
69
+ scenario 'given and given! work as intended' do
70
70
  expect(value).to be(:available)
71
71
  expect(value_in_background).to be(:available)
72
72
  end
73
73
  end
74
74
 
75
75
  feature "Capybara's feature DSL with driver", driver: :culerity do
76
- scenario "switches driver" do
76
+ scenario 'switches driver' do
77
77
  expect(Capybara.current_driver).to eq(:culerity)
78
78
  end
79
79
  end
80
80
 
81
- xfeature "if xfeature aliases to pending then" do
81
+ # rubocop:disable RSpec/RepeatedExample
82
+ xfeature 'if xfeature aliases to pending then' do
82
83
  scenario "this should be 'temporarily disabled with xfeature'" do
83
84
  # dummy
84
85
  end
86
+
85
87
  scenario "this also should be 'temporarily disabled with xfeature'" do
86
88
  # dummy
87
89
  end
88
90
  end
89
91
 
90
- ffeature "if ffeature aliases focused tag then" do
91
- scenario "scenario inside this feature has metatag focus tag" do |example|
92
- 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
93
95
  end
94
96
 
95
- scenario "other scenarios also has metatag focus tag " do |example|
96
- 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
97
99
  end
98
100
  end
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|
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