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/dsl_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/dsl'
4
5
 
@@ -6,20 +7,24 @@ class TestClass
6
7
  include Capybara::DSL
7
8
  end
8
9
 
9
- Capybara::SpecHelper.run_specs TestClass.new, "DSL", capybara_skip: [
10
- :js,
11
- :modals,
12
- :screenshot,
13
- :frames,
14
- :windows,
15
- :send_keys,
16
- :server,
17
- :hover,
18
- :about_scheme,
19
- :psc
20
- ]
10
+ Capybara::SpecHelper.run_specs TestClass.new, 'DSL', capybara_skip: %i[
11
+ js modals screenshot frames windows send_keys server hover about_scheme psc download css driver scroll spatial html_validation shadow_dom active_element
12
+ ] do |example|
13
+ case example.metadata[:full_description]
14
+ when /has_css\? should support case insensitive :class and :id options/
15
+ pending "Nokogiri doesn't support case insensitive CSS attribute matchers"
16
+ when /#click_button should follow permanent redirects that maintain method/
17
+ pending "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
18
+ when /#attach_file with multipart form should send prior hidden field if no file submitted/
19
+ skip 'Rack-test < 2 needs an empty file to detect multipart form' if Gem.loaded_specs['rack-test'].version < Gem::Version.new('2.0.0')
20
+ end
21
+ end
21
22
 
22
23
  RSpec.describe Capybara::DSL do
24
+ before do
25
+ Capybara.use_default_driver
26
+ end
27
+
23
28
  after do
24
29
  Capybara.session_name = nil
25
30
  Capybara.default_driver = nil
@@ -29,42 +34,42 @@ RSpec.describe Capybara::DSL do
29
34
  end
30
35
 
31
36
  describe '#default_driver' do
32
- it "should default to rack_test" do
37
+ it 'should default to rack_test' do
33
38
  expect(Capybara.default_driver).to eq(:rack_test)
34
39
  end
35
40
 
36
- it "should be changeable" do
41
+ it 'should be changeable' do
37
42
  Capybara.default_driver = :culerity
38
43
  expect(Capybara.default_driver).to eq(:culerity)
39
44
  end
40
45
  end
41
46
 
42
47
  describe '#current_driver' do
43
- it "should default to the default driver" do
48
+ it 'should default to the default driver' do
44
49
  expect(Capybara.current_driver).to eq(:rack_test)
45
50
  Capybara.default_driver = :culerity
46
51
  expect(Capybara.current_driver).to eq(:culerity)
47
52
  end
48
53
 
49
- it "should be changeable" do
54
+ it 'should be changeable' do
50
55
  Capybara.current_driver = :culerity
51
56
  expect(Capybara.current_driver).to eq(:culerity)
52
57
  end
53
58
  end
54
59
 
55
60
  describe '#javascript_driver' do
56
- it "should default to selenium" do
61
+ it 'should default to selenium' do
57
62
  expect(Capybara.javascript_driver).to eq(:selenium)
58
63
  end
59
64
 
60
- it "should be changeable" do
65
+ it 'should be changeable' do
61
66
  Capybara.javascript_driver = :culerity
62
67
  expect(Capybara.javascript_driver).to eq(:culerity)
63
68
  end
64
69
  end
65
70
 
66
71
  describe '#use_default_driver' do
67
- it "should restore the default driver" do
72
+ it 'should restore the default driver' do
68
73
  Capybara.current_driver = :culerity
69
74
  Capybara.use_default_driver
70
75
  expect(Capybara.current_driver).to eq(:rack_test)
@@ -73,7 +78,7 @@ RSpec.describe Capybara::DSL do
73
78
 
74
79
  describe '#using_driver' do
75
80
  before do
76
- expect(Capybara.current_driver).not_to eq(:selenium)
81
+ expect(Capybara.current_driver).not_to eq(:selenium) # rubocop:disable RSpec/ExpectInHook
77
82
  end
78
83
 
79
84
  it 'should set the driver using Capybara.current_driver=' do
@@ -92,8 +97,8 @@ RSpec.describe Capybara::DSL do
92
97
  it 'should reset the driver even if an exception occurs' do
93
98
  driver_before_block = Capybara.current_driver
94
99
  begin
95
- Capybara.using_driver(:selenium) { raise "ohnoes!" }
96
- rescue Exception
100
+ Capybara.using_driver(:selenium) { raise 'ohnoes!' }
101
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
97
102
  end
98
103
  expect(Capybara.current_driver).to eq(driver_before_block)
99
104
  end
@@ -112,20 +117,17 @@ RSpec.describe Capybara::DSL do
112
117
  it 'should yield the passed block' do
113
118
  called = false
114
119
  Capybara.using_driver(:selenium) { called = true }
115
- expect(called).to eq(true)
120
+ expect(called).to be(true)
116
121
  end
117
122
  end
118
123
 
124
+ # rubocop:disable RSpec/InstanceVariable
119
125
  describe '#using_wait_time' do
120
- before do
121
- @previous_wait_time = Capybara.default_max_wait_time
122
- end
126
+ before { @previous_wait_time = Capybara.default_max_wait_time }
123
127
 
124
- after do
125
- Capybara.default_max_wait_time = @previous_wait_time
126
- end
128
+ after { Capybara.default_max_wait_time = @previous_wait_time }
127
129
 
128
- it "should switch the wait time and switch it back" do
130
+ it 'should switch the wait time and switch it back' do
129
131
  in_block = nil
130
132
  Capybara.using_wait_time 6 do
131
133
  in_block = Capybara.default_max_wait_time
@@ -134,40 +136,41 @@ RSpec.describe Capybara::DSL do
134
136
  expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
135
137
  end
136
138
 
137
- it "should ensure wait time is reset" do
139
+ it 'should ensure wait time is reset' do
138
140
  expect do
139
141
  Capybara.using_wait_time 6 do
140
- raise "hell"
142
+ raise 'hell'
141
143
  end
142
- end.to raise_error(RuntimeError, "hell")
144
+ end.to raise_error(RuntimeError, 'hell')
143
145
  expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
144
146
  end
145
147
  end
148
+ # rubocop:enable RSpec/InstanceVariable
146
149
 
147
150
  describe '#app' do
148
- it "should be changeable" do
149
- Capybara.app = "foobar"
151
+ it 'should be changeable' do
152
+ Capybara.app = 'foobar'
150
153
  expect(Capybara.app).to eq('foobar')
151
154
  end
152
155
  end
153
156
 
154
157
  describe '#current_session' do
155
- it "should choose a session object of the current driver type" do
158
+ it 'should choose a session object of the current driver type' do
156
159
  expect(Capybara.current_session).to be_a(Capybara::Session)
157
160
  end
158
161
 
159
- it "should use #app as the application" do
162
+ it 'should use #app as the application' do
160
163
  Capybara.app = proc {}
161
164
  expect(Capybara.current_session.app).to eq(Capybara.app)
162
165
  end
163
166
 
164
- it "should change with the current driver" do
167
+ it 'should change with the current driver' do
165
168
  expect(Capybara.current_session.mode).to eq(:rack_test)
166
169
  Capybara.current_driver = :selenium
167
170
  expect(Capybara.current_session.mode).to eq(:selenium)
168
171
  end
169
172
 
170
- it "should be persistent even across driver changes" do
173
+ it 'should be persistent even across driver changes' do
171
174
  object_id = Capybara.current_session.object_id
172
175
  expect(Capybara.current_session.object_id).to eq(object_id)
173
176
  Capybara.current_driver = :selenium
@@ -178,7 +181,7 @@ RSpec.describe Capybara::DSL do
178
181
  expect(Capybara.current_session.object_id).to eq(object_id)
179
182
  end
180
183
 
181
- it "should change when changing application" do
184
+ it 'should change when changing application' do
182
185
  object_id = Capybara.current_session.object_id
183
186
  expect(Capybara.current_session.object_id).to eq(object_id)
184
187
  Capybara.app = proc {}
@@ -186,7 +189,7 @@ RSpec.describe Capybara::DSL do
186
189
  expect(Capybara.current_session.app).to eq(Capybara.app)
187
190
  end
188
191
 
189
- it "should change when the session name changes" do
192
+ it 'should change when the session name changes' do
190
193
  object_id = Capybara.current_session.object_id
191
194
  Capybara.session_name = :administrator
192
195
  expect(Capybara.session_name).to eq(:administrator)
@@ -197,8 +200,8 @@ RSpec.describe Capybara::DSL do
197
200
  end
198
201
  end
199
202
 
200
- describe "#using_session" do
201
- it "should change the session name for the duration of the block" do
203
+ describe '#using_session' do
204
+ it 'should change the session name for the duration of the block' do
202
205
  expect(Capybara.session_name).to eq(:default)
203
206
  Capybara.using_session(:administrator) do
204
207
  expect(Capybara.session_name).to eq(:administrator)
@@ -206,23 +209,23 @@ RSpec.describe Capybara::DSL do
206
209
  expect(Capybara.session_name).to eq(:default)
207
210
  end
208
211
 
209
- it "should reset the session to the default, even if an exception occurs" do
212
+ it 'should reset the session to the default, even if an exception occurs' do
210
213
  begin
211
214
  Capybara.using_session(:raise) do
212
215
  raise
213
216
  end
214
- rescue Exception
217
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
215
218
  end
216
219
  expect(Capybara.session_name).to eq(:default)
217
220
  end
218
221
 
219
- it "should yield the passed block" do
222
+ it 'should yield the passed block' do
220
223
  called = false
221
224
  Capybara.using_session(:administrator) { called = true }
222
- expect(called).to eq(true)
225
+ expect(called).to be(true)
223
226
  end
224
227
 
225
- it "should be nestable" do
228
+ it 'should be nestable' do
226
229
  Capybara.using_session(:outer) do
227
230
  expect(Capybara.session_name).to eq(:outer)
228
231
  Capybara.using_session(:inner) do
@@ -232,39 +235,57 @@ RSpec.describe Capybara::DSL do
232
235
  end
233
236
  expect(Capybara.session_name).to eq(:default)
234
237
  end
238
+
239
+ it 'should allow a session object' do
240
+ original_session = Capybara.current_session
241
+ new_session = Capybara::Session.new(:rack_test, proc {})
242
+ Capybara.using_session(new_session) do
243
+ expect(Capybara.current_session).to eq(new_session)
244
+ end
245
+ expect(Capybara.current_session).to eq(original_session)
246
+ end
247
+
248
+ it 'should pass the new session if block accepts' do
249
+ original_session = Capybara.current_session
250
+ Capybara.using_session(:administrator) do |admin_session, prev_session|
251
+ expect(admin_session).to be(Capybara.current_session)
252
+ expect(prev_session).to be(original_session)
253
+ expect(prev_session).not_to be(admin_session)
254
+ end
255
+ end
235
256
  end
236
257
 
237
- describe "#session_name" do
238
- it "should default to :default" do
258
+ describe '#session_name' do
259
+ it 'should default to :default' do
239
260
  expect(Capybara.session_name).to eq(:default)
240
261
  end
241
262
  end
242
263
 
243
264
  describe 'the DSL' do
244
- before do
245
- @session = Class.new { include Capybara::DSL }.new
246
- end
265
+ let(:session) { Class.new { include Capybara::DSL }.new }
247
266
 
248
- it "should be possible to include it in another class" do
249
- @session.visit('/with_html')
250
- @session.click_link('ullamco')
251
- expect(@session.body).to include('Another World')
267
+ it 'should be possible to include it in another class' do
268
+ session.visit('/with_html')
269
+ session.click_link('ullamco')
270
+ expect(session.body).to include('Another World')
252
271
  end
253
272
 
254
273
  it "should provide a 'page' shortcut for more expressive tests" do
255
- @session.page.visit('/with_html')
256
- @session.page.click_link('ullamco')
257
- expect(@session.page.body).to include('Another World')
274
+ session.page.visit('/with_html')
275
+ session.page.click_link('ullamco')
276
+ expect(session.page.body).to include('Another World')
258
277
  end
259
278
 
260
279
  it "should provide an 'using_session' shortcut" do
261
- expect(Capybara).to receive(:using_session).with(:name)
262
- @session.using_session(:name)
280
+ allow(Capybara).to receive(:using_session)
281
+ session.using_session(:name)
282
+ expect(Capybara).to have_received(:using_session).with(:name)
263
283
  end
264
284
 
265
285
  it "should provide a 'using_wait_time' shortcut" do
266
- expect(Capybara).to receive(:using_wait_time).with(6)
267
- @session.using_wait_time(6)
286
+ allow(Capybara).to receive(:using_wait_time)
287
+ session.using_wait_time(6)
288
+ expect(Capybara).to have_received(:using_wait_time).with(6)
268
289
  end
269
290
  end
270
291
  end
@@ -1,28 +1,46 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara::Selector::FilterSet do
5
6
  after do
6
- Capybara::Selector::FilterSet.remove(:test)
7
+ described_class.remove(:test)
7
8
  end
8
9
 
9
- it "allows node filters" do
10
- fs = Capybara::Selector::FilterSet.add(:test) do
11
- filter(:node_test, :boolean) { |node, value| true }
12
- expression_filter(:expression_test, :boolean) { |expr, value| true }
10
+ it 'allows node filters' do
11
+ fs = described_class.add(:test) do
12
+ node_filter(:node_test, :boolean) { |_node, _value| true }
13
+ expression_filter(:expression_test, :boolean) { |_expr, _value| true }
13
14
  end
14
15
 
15
16
  expect(fs.node_filters.keys).to include(:node_test)
16
17
  expect(fs.node_filters.keys).not_to include(:expression_test)
17
18
  end
18
19
 
19
- it "allows expression filters" do
20
- fs = Capybara::Selector::FilterSet.add(:test) do
21
- filter(:node_test, :boolean) { |node, value| true }
22
- expression_filter(:expression_test, :boolean) { |expr, value| true }
20
+ it 'allows expression filters' do
21
+ fs = described_class.add(:test) do
22
+ node_filter(:node_test, :boolean) { |_node, _value| true }
23
+ expression_filter(:expression_test, :boolean) { |_expr, _value| true }
23
24
  end
24
25
 
25
26
  expect(fs.expression_filters.keys).to include(:expression_test)
26
27
  expect(fs.expression_filters.keys).not_to include(:node_test)
27
28
  end
29
+
30
+ it 'allows node filter and expression filter with the same name' do
31
+ fs = described_class.add(:test) do
32
+ node_filter(:test, :boolean) { |_node, _value| true }
33
+ expression_filter(:test, :boolean) { |_expr, _value| true }
34
+ end
35
+
36
+ expect(fs.expression_filters[:test]).not_to eq fs.node_filters[:test]
37
+ end
38
+
39
+ it 'allows `filter` as an alias of `node_filter`' do
40
+ fs = described_class.add(:test) do
41
+ filter(:node_test, :boolean) { |_node, _value| true }
42
+ end
43
+
44
+ expect(fs.node_filters.keys).to include(:node_test)
45
+ end
28
46
  end
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEITCCAwmgAwIBAgIJALROkwd1gZHQMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNV
3
+ BAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMT
4
+ DWNhcHliYXJhLnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNv
5
+ bTAeFw0xODA1MDEyMDI5NDVaFw0yODA0MjgyMDI5NDVaMGgxCzAJBgNVBAYTAlVT
6
+ MQswCQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMTDWNhcHli
7
+ YXJhLnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNvbTCCASIw
8
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7icqMv9uApxRXlcIQ3hSEfmULk
9
+ 7CLT1aUAjEmTiqy8TkFqOeSuA3elnbVBhOW+emrb1uUyje20LvEOHbqYYw90ezlV
10
+ jqNWUapawqjxb+q7KVNpA5uDCtOHIC/1Z1kxQ+yZP/8St4SvnLGUMsUhu0h+ywJa
11
+ iGZ2xy8wdfjABUiUImRESdNkT7Xs0wxQGY0/FZ4K5Sec4kroOuvdxKKhyf5Js5xS
12
+ NRv2tXSMWlKHbYEvYzsVtFgv/4GjqN4wVvbfJmsS8thcyrSYSMN7eE0R6dcbJaLM
13
+ P/GTiw669zPJP164K84QoabLClgwyG+7mqjm7jutq9qXipwyrGsf/WR5fkUCAwEA
14
+ AaOBzTCByjAdBgNVHQ4EFgQU4ut9c0oB2OGMlN/nvn0Y7twBzJowgZoGA1UdIwSB
15
+ kjCBj4AU4ut9c0oB2OGMlN/nvn0Y7twBzJqhbKRqMGgxCzAJBgNVBAYTAlVTMQsw
16
+ CQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMTDWNhcHliYXJh
17
+ LnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNvbYIJALROkwd1
18
+ gZHQMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAANtqdDrdehBt20s
19
+ IVOsVzOp+tJI8pn6G62WJcZWGsvLLfx6Y6eJSP24r5NW4v39cqCgE76J2znzKxeo
20
+ VIShAJ1SLodR0GwzFGsl3TVKVoce6gBWZNXgkZyJTNqKGWeme8CH1EG3TqYlcybt
21
+ EXWLQ6wKndD+uHJIfqUy7HfaUv+TghJGLkv8QYqcAWILQko4xqZ1NULDQ2uhjxei
22
+ oaQlK9teHlVaH87dONesAg3f5rh9j6nvzGiC/T8ycdEhn/DxJMxRS2+mVZqKkk7U
23
+ 60+e9Foc6qTW8UaMShIFYMspoRnr9baBxzxh9V9LZznwqVTf3vuEIck2l2j2KL/R
24
+ SOBenCM=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAvuJyoy/24CnFFeVwhDeFIR+ZQuTsItPVpQCMSZOKrLxOQWo5
3
+ 5K4Dd6WdtUGE5b56atvW5TKN7bQu8Q4duphjD3R7OVWOo1ZRqlrCqPFv6rspU2kD
4
+ m4MK04cgL/VnWTFD7Jk//xK3hK+csZQyxSG7SH7LAlqIZnbHLzB1+MAFSJQiZERJ
5
+ 02RPtezTDFAZjT8VngrlJ5ziSug6693EoqHJ/kmznFI1G/a1dIxaUodtgS9jOxW0
6
+ WC//gaOo3jBW9t8maxLy2FzKtJhIw3t4TRHp1xslosw/8ZOLDrr3M8k/XrgrzhCh
7
+ pssKWDDIb7uaqObuO62r2peKnDKsax/9ZHl+RQIDAQABAoIBABhZepYmgC+IJIPu
8
+ iLPVAT6AcWR/H0AyFYa+0yZvk7kFLFZb3pa1O+v/TGbavMEx0xvef0Mtd71ixrop
9
+ OtGarshB65Ycu91KHZDFkx9J7STcSyFAvB0SUkc5bXmwrEZMaoW75tX65T4fyLU+
10
+ WlubOfC9e9gJBG1NqYrze5kHpaTkR8pBaSxECns5y2HLaMvs1t1kK7snqtGHFRAb
11
+ deAUl0ONENaO6PF797yM3bsIEgnljdKvaVP3kYq/eAzH4jyw+qG/xq0bZ+nalJzM
12
+ IL7xRSR/Yak7WZ3QUh99t3dng/z3De4yvhBLq/mc2mIVvt7aERPo/aDG4SrmQ9Jw
13
+ f1GUT+ECgYEA+i96w2zPHkq0djuuhNaa/R0vybD9hVCdB7enQ8skBzQAQyhp9X9W
14
+ by38VAbFRVIMrzdfbvwSFrE3Nd9BvyLWl16G+MVu+hq0jhM9p44a62vXvfgQmfFh
15
+ iXyGkzCTufeLEzOFnP8S+ezacodK1hbQTjllUndn6NUhXcbfozTPfx8CgYEAw1Il
16
+ xqfU7NkVX6UP/FvTx9aBKqwrD8YOPn9nj26Q45zVbmHJZZIvywlsMDCiJ6JJawEa
17
+ GSkiZTDpypEvS/2UtLEY0zfbSbQGkBTnagHIFAuVh0AD1EP+kCcnrxA5Vjr8v0WE
18
+ B0HBfMgoZxa8rmHMpPhrlCCo1ectRgu+dgzEKhsCgYAQ17lwBpc69tSHUSVClCAD
19
+ AkABWAT5QKARsO91xOs8AOgznTjk6hmrinD+RyZosEliUlv+YMHm/S82VT1b3MCN
20
+ mDOF8+SwubOGDQ2NhieRycTQaS7U7kcetl9o8VBAqMWYGVPZaeKhKKzcIPeMyiRj
21
+ 38FOd/Nq3U5NveG4XwnJCQKBgGrzmnfTAsbGf+uliMFYzviIPqZNLC8w9i/Gt8BU
22
+ fMYF5ODSbuNNTxpQiItCtigZtzX+nnnUil76j6o6IbnsmvbuWneeCFetWkKfD7B+
23
+ VT6UsUYkCXS73rK0nghATAUpu6hIumj22qonN+hrDNo390UGOnIcCBdIxQOr/pjJ
24
+ mMitAoGAB3tFzlzZHpCE38IqdHL7CKIML9cYJSOm07nFIEUAKN2bUHGsvMH/tMS1
25
+ I3hyeHxMmYCrOLn7xLqiOVgRjbYS9JiQVdDojqeSvvnLCtY9/lHWi50pqbPfwyfK
26
+ Og6QoFyxjBEsoSilc6dai58VTO6ufhoJXbXX9PcIl7le4dVPnzE=
27
+ -----END RSA PRIVATE KEY-----
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'selenium-webdriver'
4
5
 
5
6
  RSpec.describe Capybara::Selenium::Driver do
6
- it "should exit with a non-zero exit status" do
7
- options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
- options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
- browser = Capybara::Selenium::Driver.new(TestApp, options).browser
10
- expect(true).to eq(false)
7
+ it 'should exit with a non-zero exit status' do
8
+ options = { browser: ENV.fetch('SELENIUM_BROWSER', :firefox).to_sym }
9
+ browser = described_class.new(TestApp, options).browser
10
+ expect(browser).to be_truthy
11
+ expect(true).to be(false) # rubocop:disable RSpec/ExpectActual
11
12
  end
12
13
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'selenium-webdriver'
4
5
 
5
6
  RSpec.describe Capybara::Selenium::Driver do
6
- it "should exit with a zero exit status" do
7
- options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
- options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
- browser = Capybara::Selenium::Driver.new(TestApp, options ).browser
10
- expect(true).to eq(true)
7
+ it 'should exit with a zero exit status' do
8
+ options = { browser: ENV.fetch('SELENIUM_BROWSER', :firefox).to_sym }
9
+ browser = described_class.new(TestApp, **options).browser
10
+ expect(browser).to be_truthy
11
+ expect(true).to be(true) # rubocop:disable RSpec/ExpectActual,RSpec/IdenticalEqualityAssertion
11
12
  end
12
13
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/minitest'
4
5
 
@@ -14,8 +15,12 @@ class MinitestTest < Minitest::Test
14
15
  Capybara.reset_sessions!
15
16
  end
16
17
 
18
+ def self.test_order
19
+ :sorted
20
+ end
21
+
17
22
  def test_assert_text
18
- assert_text('Form')
23
+ assert_text('Form', normalize_ws: false)
19
24
  assert_no_text('Not on the page')
20
25
  refute_text('Also Not on the page')
21
26
  end
@@ -29,15 +34,16 @@ class MinitestTest < Minitest::Test
29
34
 
30
35
  def test_assert_current_path
31
36
  assert_current_path('/form')
37
+ assert_current_path('/form') { |url| url.query.nil? }
32
38
  assert_no_current_path('/not_form')
33
39
  refute_current_path('/not_form')
34
40
  end
35
41
 
36
42
  def test_assert_xpath
37
43
  assert_xpath('.//select[@id="form_title"]')
38
- assert_xpath('.//select', count: 1) { |el| el[:id] == "form_title" }
44
+ assert_xpath('.//select', count: 1) { |el| el[:id] == 'form_title' }
39
45
  assert_no_xpath('.//select[@id="not_form_title"]')
40
- assert_no_xpath('.//select') { |el| el[:id] == "not_form_title"}
46
+ assert_no_xpath('.//select') { |el| el[:id] == 'not_form_title' }
41
47
  refute_xpath('.//select[@id="not_form_title"]')
42
48
  end
43
49
 
@@ -46,16 +52,31 @@ class MinitestTest < Minitest::Test
46
52
  assert_no_css('select#not_form_title')
47
53
  end
48
54
 
55
+ def test_assert_selector
56
+ assert_selector(:css, 'select#form_title')
57
+ assert_selector(:xpath, './/select[@id="form_title"]')
58
+ assert_no_selector(:css, 'select#not_form_title')
59
+ assert_no_selector(:xpath, './/select[@id="not_form_title"]')
60
+ refute_selector(:css, 'select#not_form_title')
61
+ end
62
+
63
+ def test_assert_element
64
+ visit('/with_html')
65
+ assert_element('a', text: 'A link')
66
+ assert_element(count: 1) { |el| el.text == 'A link' }
67
+ assert_no_element(text: 'Not on page')
68
+ end
69
+
49
70
  def test_assert_link
50
71
  visit('/with_html')
51
72
  assert_link('A link')
52
- assert_link(count: 1){ |el| el.text == 'A link'}
73
+ assert_link(count: 1) { |el| el.text == 'A link' }
53
74
  assert_no_link('Not on page')
54
75
  end
55
76
 
56
77
  def test_assert_button
57
78
  assert_button('fresh_btn')
58
- assert_button(count: 1){ |el| el[:id] == 'fresh_btn' }
79
+ assert_button(count: 1) { |el| el[:id] == 'fresh_btn' }
59
80
  assert_no_button('not_btn')
60
81
  end
61
82
 
@@ -96,6 +117,10 @@ class MinitestTest < Minitest::Test
96
117
  assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
97
118
  end
98
119
 
120
+ def test_assert_any_of_selectors
121
+ assert_any_of_selectors(:css, 'input#not_on_page', 'select#form_other_title')
122
+ end
123
+
99
124
  def test_assert_matches_selector
100
125
  assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
101
126
  assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
@@ -111,6 +136,22 @@ class MinitestTest < Minitest::Test
111
136
  assert_matches_xpath(find(:select, 'form_title'), './/select[@id="form_title"]')
112
137
  refute_matches_xpath(find(:select, 'form_title'), './/select[@id="form_other_title"]')
113
138
  end
139
+
140
+ def test_assert_matches_style
141
+ skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
142
+ visit('/with_html')
143
+ assert_matches_style(find(:css, '#second'), display: 'inline')
144
+ end
145
+
146
+ def test_assert_ancestor
147
+ option = find(:option, 'Finnish')
148
+ assert_ancestor(option, :css, '#form_locale')
149
+ end
150
+
151
+ def test_assert_sibling
152
+ option = find(:css, '#form_title').find(:option, 'Mrs')
153
+ assert_sibling(option, :option, 'Mr')
154
+ end
114
155
  end
115
156
 
116
157
  RSpec.describe 'capybara/minitest' do
@@ -119,12 +160,16 @@ RSpec.describe 'capybara/minitest' do
119
160
  Capybara.app = TestApp
120
161
  end
121
162
 
122
- it "should support minitest" do
163
+ after do
164
+ Capybara.use_default_driver
165
+ end
166
+
167
+ it 'should support minitest' do
123
168
  output = StringIO.new
124
169
  reporter = Minitest::SummaryReporter.new(output)
125
170
  reporter.start
126
171
  MinitestTest.run reporter, {}
127
172
  reporter.report
128
- expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
173
+ expect(output.string).to include('23 runs, 56 assertions, 0 failures, 0 errors, 1 skips')
129
174
  end
130
175
  end