capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +380 -142
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +528 -97
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -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/action_pauser.rb +26 -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 +63 -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 +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  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_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  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 +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  206. data/lib/capybara/spec/session/select_spec.rb +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/minitest'
5
+
6
+ class MinitestTest < Minitest::Test
7
+ include Capybara::DSL
8
+ include Capybara::Minitest::Assertions
9
+
10
+ def setup
11
+ visit('/form')
12
+ end
13
+
14
+ def teardown
15
+ Capybara.reset_sessions!
16
+ end
17
+
18
+ def test_assert_text
19
+ assert_text('Form', normalize_ws: false)
20
+ assert_no_text('Not on the page')
21
+ refute_text('Also Not on the page')
22
+ end
23
+
24
+ def test_assert_title
25
+ visit('/with_title')
26
+ assert_title('Test Title')
27
+ assert_no_title('Not the title')
28
+ refute_title('Not the title')
29
+ end
30
+
31
+ def test_assert_current_path
32
+ assert_current_path('/form')
33
+ assert_current_path('/form') { |url| url.query.nil? }
34
+ assert_no_current_path('/not_form')
35
+ refute_current_path('/not_form')
36
+ end
37
+
38
+ def test_assert_xpath
39
+ assert_xpath('.//select[@id="form_title"]')
40
+ assert_xpath('.//select', count: 1) { |el| el[:id] == 'form_title' }
41
+ assert_no_xpath('.//select[@id="not_form_title"]')
42
+ assert_no_xpath('.//select') { |el| el[:id] == 'not_form_title' }
43
+ refute_xpath('.//select[@id="not_form_title"]')
44
+ end
45
+
46
+ def test_assert_css
47
+ assert_css('select#form_title')
48
+ assert_no_css('select#not_form_title')
49
+ end
50
+
51
+ def test_assert_selector
52
+ assert_selector(:css, 'select#form_title')
53
+ assert_selector(:xpath, './/select[@id="form_title"]')
54
+ assert_no_selector(:css, 'select#not_form_title')
55
+ assert_no_selector(:xpath, './/select[@id="not_form_title"]')
56
+ refute_selector(:css, 'select#not_form_title')
57
+ end
58
+
59
+ def test_assert_link
60
+ visit('/with_html')
61
+ assert_link('A link')
62
+ assert_link(count: 1) { |el| el.text == 'A link' }
63
+ assert_no_link('Not on page')
64
+ end
65
+
66
+ def test_assert_button
67
+ assert_button('fresh_btn')
68
+ assert_button(count: 1) { |el| el[:id] == 'fresh_btn' }
69
+ assert_no_button('not_btn')
70
+ end
71
+
72
+ def test_assert_field
73
+ assert_field('customer_email')
74
+ assert_no_field('not_on_the_form')
75
+ end
76
+
77
+ def test_assert_select
78
+ assert_select('form_title')
79
+ assert_no_select('not_form_title')
80
+ end
81
+
82
+ def test_assert_checked_field
83
+ assert_checked_field('form_pets_dog')
84
+ assert_no_checked_field('form_pets_cat')
85
+ refute_checked_field('form_pets_snake')
86
+ end
87
+
88
+ def test_assert_unchecked_field
89
+ assert_unchecked_field('form_pets_cat')
90
+ assert_no_unchecked_field('form_pets_dog')
91
+ refute_unchecked_field('form_pets_snake')
92
+ end
93
+
94
+ def test_assert_table
95
+ visit('/tables')
96
+ assert_table('agent_table')
97
+ assert_no_table('not_on_form')
98
+ refute_table('not_on_form')
99
+ end
100
+
101
+ def test_assert_all_of_selectors
102
+ assert_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
103
+ end
104
+
105
+ def test_assert_none_of_selectors
106
+ assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
107
+ end
108
+
109
+ def test_assert_any_of_selectors
110
+ assert_any_of_selectors(:css, 'input#not_on_page', 'select#form_other_title')
111
+ end
112
+
113
+ def test_assert_matches_selector
114
+ assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
115
+ assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
116
+ refute_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
117
+ end
118
+
119
+ def test_assert_matches_css
120
+ assert_matches_css(find(:select, 'form_title'), 'select#form_title')
121
+ refute_matches_css(find(:select, 'form_title'), 'select#form_other_title')
122
+ end
123
+
124
+ def test_assert_matches_xpath
125
+ assert_matches_xpath(find(:select, 'form_title'), './/select[@id="form_title"]')
126
+ refute_matches_xpath(find(:select, 'form_title'), './/select[@id="form_other_title"]')
127
+ end
128
+
129
+ def test_assert_matches_style
130
+ skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
131
+ visit('/with_html')
132
+ assert_matches_style(find(:css, '#second'), display: 'inline')
133
+ end
134
+
135
+ def test_assert_ancestor
136
+ option = find(:option, 'Finnish')
137
+ assert_ancestor(option, :css, '#form_locale')
138
+ end
139
+
140
+ def test_assert_sibling
141
+ option = find(:css, '#form_title').find(:option, 'Mrs')
142
+ assert_sibling(option, :option, 'Mr')
143
+ end
144
+ end
145
+
146
+ RSpec.describe 'capybara/minitest' do
147
+ before do
148
+ Capybara.current_driver = :rack_test
149
+ Capybara.app = TestApp
150
+ end
151
+
152
+ after do
153
+ Capybara.use_default_driver
154
+ end
155
+
156
+ it 'should support minitest' do
157
+ output = StringIO.new
158
+ reporter = Minitest::SummaryReporter.new(output)
159
+ reporter.start
160
+ MinitestTest.run reporter, {}
161
+ reporter.report
162
+ expect(output.string).to include('22 runs, 53 assertions, 0 failures, 0 errors, 1 skips')
163
+ end
164
+ end
@@ -0,0 +1,162 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/minitest'
5
+ require 'capybara/minitest/spec'
6
+
7
+ class MinitestSpecTest < Minitest::Spec
8
+ include ::Capybara::DSL
9
+ include ::Capybara::Minitest::Assertions
10
+
11
+ before do
12
+ visit('/form')
13
+ end
14
+
15
+ after do
16
+ Capybara.reset_sessions!
17
+ end
18
+
19
+ it 'supports text expectations' do
20
+ _(page).must_have_text('Form', minimum: 1)
21
+ _(page).wont_have_text('Not a form')
22
+ form = find(:css, 'form', text: 'Title')
23
+ _(form).must_have_text('Customer Email')
24
+ _(form).wont_have_text('Some other email')
25
+ end
26
+
27
+ it 'supports current_path expectations' do
28
+ _(page).must_have_current_path('/form')
29
+ _(page).wont_have_current_path('/form2')
30
+ end
31
+
32
+ it 'supports title expectations' do
33
+ visit('/with_title')
34
+ _(page).must_have_title('Test Title')
35
+ _(page).wont_have_title('Not the title')
36
+ end
37
+
38
+ it 'supports xpath expectations' do
39
+ _(page).must_have_xpath('.//input[@id="customer_email"]')
40
+ _(page).wont_have_xpath('.//select[@id="not_form_title"]')
41
+ _(page).wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == 'not_customer_email' }
42
+ select = find(:select, 'form_title')
43
+ _(select).must_have_xpath('.//option[@class="title"]')
44
+ _(select).must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled? }
45
+ _(select).wont_have_xpath('.//input[@id="customer_email"]')
46
+ end
47
+
48
+ it 'support css expectations' do
49
+ _(page).must_have_css('input#customer_email')
50
+ _(page).wont_have_css('select#not_form_title')
51
+ el = find(:select, 'form_title')
52
+ _(el).must_have_css('option.title')
53
+ _(el).wont_have_css('input#customer_email')
54
+ end
55
+
56
+ it 'supports link expectations' do
57
+ visit('/with_html')
58
+ _(page).must_have_link('A link')
59
+ _(page).wont_have_link('Not on page')
60
+ end
61
+
62
+ it 'supports button expectations' do
63
+ _(page).must_have_button('fresh_btn')
64
+ _(page).wont_have_button('not_btn')
65
+ end
66
+
67
+ it 'supports field expectations' do
68
+ _(page).must_have_field('customer_email')
69
+ _(page).wont_have_field('not_on_the_form')
70
+ end
71
+
72
+ it 'supports select expectations' do
73
+ _(page).must_have_select('form_title')
74
+ _(page).wont_have_select('not_form_title')
75
+ end
76
+
77
+ it 'supports checked_field expectations' do
78
+ _(page).must_have_checked_field('form_pets_dog')
79
+ _(page).wont_have_checked_field('form_pets_cat')
80
+ end
81
+
82
+ it 'supports unchecked_field expectations' do
83
+ _(page).must_have_unchecked_field('form_pets_cat')
84
+ _(page).wont_have_unchecked_field('form_pets_dog')
85
+ end
86
+
87
+ it 'supports table expectations' do
88
+ visit('/tables')
89
+ _(page).must_have_table('agent_table')
90
+ _(page).wont_have_table('not_on_form')
91
+ end
92
+
93
+ it 'supports all_of_selectors expectations' do
94
+ _(page).must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
95
+ end
96
+
97
+ it 'supports none_of_selectors expectations' do
98
+ _(page).must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
99
+ end
100
+
101
+ it 'supports any_of_selectors expectations' do
102
+ _(page).must_have_any_of_selectors(:css, 'select#form_other_title', 'input#not_on_page')
103
+ end
104
+
105
+ it 'supports match_selector expectations' do
106
+ _(find(:field, 'customer_email')).must_match_selector(:field, 'customer_email')
107
+ _(find(:select, 'form_title')).wont_match_selector(:field, 'customer_email')
108
+ end
109
+
110
+ it 'supports match_css expectations' do
111
+ _(find(:select, 'form_title')).must_match_css('select#form_title')
112
+ _(find(:select, 'form_title')).wont_match_css('select#form_other_title')
113
+ end
114
+
115
+ it 'supports match_xpath expectations' do
116
+ _(find(:select, 'form_title')).must_match_xpath('.//select[@id="form_title"]')
117
+ _(find(:select, 'form_title')).wont_match_xpath('.//select[@id="not_on_page"]')
118
+ end
119
+
120
+ it 'handles failures' do
121
+ _(page).must_have_select('non_existing_form_title')
122
+ end
123
+
124
+ it 'supports style expectations' do
125
+ skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
126
+ visit('/with_html')
127
+ _(find(:css, '#second')).must_have_style('display' => 'inline') # deprecated
128
+ _(find(:css, '#second')).must_match_style('display' => 'inline')
129
+ end
130
+
131
+ it 'supports ancestor expectations' do
132
+ option = find(:option, 'Finnish')
133
+ _(option).must_have_ancestor(:css, '#form_locale')
134
+ end
135
+
136
+ it 'supports sibling expectations' do
137
+ option = find(:css, '#form_title').find(:option, 'Mrs')
138
+ _(option).must_have_sibling(:option, 'Mr')
139
+ end
140
+ end
141
+
142
+ RSpec.describe 'capybara/minitest/spec' do
143
+ before do
144
+ Capybara.current_driver = :rack_test
145
+ Capybara.app = TestApp
146
+ end
147
+
148
+ after do
149
+ Capybara.use_default_driver
150
+ end
151
+
152
+ it 'should support minitest spec' do
153
+ output = StringIO.new
154
+ reporter = Minitest::SummaryReporter.new(output)
155
+ reporter.start
156
+ MinitestSpecTest.run reporter, {}
157
+ reporter.report
158
+ expect(output.string).to include('22 runs, 44 assertions, 1 failures, 0 errors, 1 skips')
159
+ # Make sure error messages are displayed
160
+ expect(output.string).to match(/expected to find select box "non_existing_form_title" .*but there were no matches/)
161
+ end
162
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/dsl'
5
+
6
+ RSpec.describe Capybara::SessionConfig do
7
+ describe 'threadsafe' do
8
+ it 'defaults to global session options' do
9
+ Capybara.threadsafe = true
10
+ session = Capybara::Session.new(:rack_test, TestApp)
11
+ %i[default_host app_host always_include_port run_server
12
+ default_selector default_max_wait_time ignore_hidden_elements
13
+ automatic_reload match exact raise_server_errors visible_text_only
14
+ automatic_label_click enable_aria_label save_path
15
+ asset_host].each do |m|
16
+ expect(session.config.public_send(m)).to eq Capybara.public_send(m)
17
+ end
18
+ end
19
+
20
+ it "doesn't change global session when changed" do
21
+ Capybara.threadsafe = true
22
+ host = 'http://my.example.com'
23
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
24
+ config.default_host = host
25
+ config.automatic_label_click = !config.automatic_label_click
26
+ config.server_errors << ArgumentError
27
+ end
28
+ expect(Capybara.default_host).not_to eq host
29
+ expect(session.config.default_host).to eq host
30
+ expect(Capybara.automatic_label_click).not_to eq session.config.automatic_label_click
31
+ expect(Capybara.server_errors).not_to eq session.config.server_errors
32
+ end
33
+
34
+ it "doesn't allow session configuration block when false" do
35
+ Capybara.threadsafe = false
36
+ expect do
37
+ Capybara::Session.new(:rack_test, TestApp) { |config| }
38
+ end.to raise_error 'A configuration block is only accepted when Capybara.threadsafe == true'
39
+ end
40
+
41
+ it "doesn't allow session config when false" do
42
+ Capybara.threadsafe = false
43
+ session = Capybara::Session.new(:rack_test, TestApp)
44
+ expect { session.config.default_selector = :title }.to raise_error(/Per session settings are only supported when Capybara.threadsafe == true/)
45
+ expect do
46
+ session.configure do |config|
47
+ config.exact = true
48
+ end
49
+ end.to raise_error(/Session configuration is only supported when Capybara.threadsafe == true/)
50
+ end
51
+
52
+ it 'uses the config from the session' do
53
+ Capybara.threadsafe = true
54
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
55
+ config.default_selector = :link
56
+ end
57
+ session.visit('/with_html')
58
+ expect(session.find('foo').tag_name).to eq 'a'
59
+ end
60
+
61
+ it "won't change threadsafe once a session is created" do
62
+ Capybara.threadsafe = true
63
+ Capybara.threadsafe = false
64
+ Capybara::Session.new(:rack_test, TestApp)
65
+ expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
66
+ end
67
+ end
68
+ end
@@ -1,186 +1,279 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
4
+ nokogumbo_required = begin
5
+ require 'nokogumbo'
6
+ true
7
+ rescue LoadError
8
+ false
9
+ end
3
10
 
4
11
  module TestSessions
5
12
  RackTest = Capybara::Session.new(:rack_test, TestApp)
6
13
  end
7
14
 
8
- Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", :capybara_skip => [
9
- :js,
10
- :modals,
11
- :screenshot,
12
- :frames,
13
- :windows,
14
- :send_keys,
15
- :server,
16
- :hover,
17
- :about_scheme,
15
+ skipped_tests = %i[
16
+ js
17
+ modals
18
+ screenshot
19
+ frames
20
+ windows
21
+ send_keys
22
+ server
23
+ hover
24
+ about_scheme
25
+ download
26
+ css
27
+ scroll
28
+ spatial
29
+ html_validation
30
+ shadow_dom
18
31
  ]
32
+ Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip: skipped_tests do |example|
33
+ case example.metadata[:full_description]
34
+ when /has_css\? should support case insensitive :class and :id options/
35
+ skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
36
+ when /#click_button should follow permanent redirects that maintain method/
37
+ skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
38
+ end
39
+ end
19
40
 
20
- RSpec.describe Capybara::Session do
41
+ RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
42
+ include Capybara::RSpecMatchers
21
43
  context 'with rack test driver' do
22
- before do
23
- @session = TestSessions::RackTest
24
- end
44
+ let(:session) { TestSessions::RackTest }
25
45
 
26
46
  describe '#driver' do
27
- it "should be a rack test driver" do
28
- expect(@session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
47
+ it 'should be a rack test driver' do
48
+ expect(session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
29
49
  end
30
50
  end
31
51
 
32
52
  describe '#mode' do
33
- it "should remember the mode" do
34
- expect(@session.mode).to eq(:rack_test)
53
+ it 'should remember the mode' do
54
+ expect(session.mode).to eq(:rack_test)
35
55
  end
36
56
  end
37
57
 
38
58
  describe '#click_link' do
39
- it "should use data-method if option is true" do
40
- @session.driver.options[:respect_data_method] = true
41
- @session.visit "/with_html"
42
- @session.click_link "A link with data-method"
43
- expect(@session.html).to include('The requested object was deleted')
59
+ after do
60
+ session.driver.options[:respect_data_method] = false
61
+ end
62
+
63
+ it 'should use data-method if option is true' do
64
+ session.driver.options[:respect_data_method] = true
65
+ session.visit '/with_html'
66
+ session.click_link 'A link with data-method'
67
+ expect(session.html).to include('The requested object was deleted')
44
68
  end
45
69
 
46
- it "should not use data-method if option is false" do
47
- @session.driver.options[:respect_data_method] = false
48
- @session.visit "/with_html"
49
- @session.click_link "A link with data-method"
50
- expect(@session.html).to include('Not deleted')
70
+ it 'should not use data-method if option is false' do
71
+ session.driver.options[:respect_data_method] = false
72
+ session.visit '/with_html'
73
+ session.click_link 'A link with data-method'
74
+ expect(session.html).to include('Not deleted')
51
75
  end
52
76
 
53
77
  it "should use data-method if available even if it's capitalized" do
54
- @session.driver.options[:respect_data_method] = true
55
- @session.visit "/with_html"
56
- @session.click_link "A link with capitalized data-method"
57
- expect(@session.html).to include('The requested object was deleted')
78
+ session.driver.options[:respect_data_method] = true
79
+ session.visit '/with_html'
80
+ session.click_link 'A link with capitalized data-method'
81
+ expect(session.html).to include('The requested object was deleted')
58
82
  end
83
+ end
59
84
 
60
- after do
61
- @session.driver.options[:respect_data_method] = false
85
+ describe '#fill_in' do
86
+ it 'should warn that :fill_options are not supported' do
87
+ session.visit '/with_html'
88
+ expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
89
+ output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
90
+ expect(session).to have_field('test_field', with: 'not_monkey')
62
91
  end
63
92
  end
64
93
 
65
- describe "#fill_in" do
66
- it "should warn that :fill_options are not supported" do
67
- expect_any_instance_of(Capybara::Node::Element).to receive(:warn)
68
- .with("Options passed to Capybara::Node#set but the driver doesn't support them")
69
- @session.visit "/with_html"
70
- @session.fill_in 'test_field', with: 'not_moneky', fill_options: { random: true }
94
+ describe '#attach_file' do
95
+ context 'with multipart form' do
96
+ it 'should submit an empty form-data section if no file is submitted' do
97
+ session.visit('/form')
98
+ session.click_button('Upload Empty')
99
+ expect(session.html).to include('Successfully ignored empty file field.')
100
+ end
101
+ end
102
+
103
+ it 'should not submit an obsolete mime type' do
104
+ test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
105
+ session.visit('/form')
106
+ session.attach_file 'form_document', test_jpg_file_path
107
+ session.click_button('Upload Single')
108
+ expect(session).to have_content('Content-type: text/csv')
71
109
  end
72
110
  end
73
111
 
74
- describe "#attach_file" do
75
- context "with multipart form" do
76
- it "should submit an empty form-data section if no file is submitted" do
77
- @session.visit("/form")
78
- @session.click_button("Upload Empty")
79
- expect(@session.html).to include('Successfully ignored empty file field.')
112
+ describe '#click' do
113
+ context 'on a label' do
114
+ it 'should toggle the associated checkbox' do
115
+ session.visit('/form')
116
+ expect(session).to have_unchecked_field('form_pets_cat')
117
+ session.find(:label, 'Cat').click
118
+ expect(session).to have_checked_field('form_pets_cat')
119
+ session.find(:label, 'Cat').click
120
+ expect(session).to have_unchecked_field('form_pets_cat')
121
+ session.find(:label, 'McLaren').click
122
+ expect(session).to have_checked_field('form_cars_mclaren', visible: :hidden)
123
+ end
124
+
125
+ it 'should toggle the associated radio' do
126
+ session.visit('/form')
127
+ expect(session).to have_unchecked_field('gender_male')
128
+ session.find(:label, 'Male').click
129
+ expect(session).to have_checked_field('gender_male')
130
+ session.find(:label, 'Female').click
131
+ expect(session).to have_unchecked_field('gender_male')
132
+ end
133
+
134
+ it 'should rewrite the forms action query for get submission' do
135
+ session.visit('/form')
136
+ session.click_button('mediocre')
137
+ expect(session).not_to have_current_path(/foo|bar/)
138
+ end
139
+
140
+ it 'should rewrite the submit buttons formaction query for get submission' do
141
+ session.visit('/form')
142
+ session.click_button('mediocre2')
143
+ expect(session).not_to have_current_path(/foo|bar/)
80
144
  end
81
145
  end
82
146
  end
147
+
148
+ describe '#send_keys' do
149
+ it 'raises an UnsupportedMethodError' do
150
+ session.visit('/form')
151
+
152
+ expect { session.send_keys(:tab) }.to raise_error(Capybara::NotSupportedByDriverError)
153
+ end
154
+ end
155
+
156
+ describe '#text' do
157
+ it 'should return original text content for textareas' do
158
+ session.visit('/with_html')
159
+ session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
160
+ normal = session.find(:css, '#normal')
161
+ expect(normal.value).to eq 'hello'
162
+ expect(normal.text).to eq 'banana'
163
+ end
164
+ end
165
+
166
+ describe '#style' do
167
+ it 'should raise an error' do
168
+ session.visit('/with_html')
169
+ el = session.find(:css, '#first')
170
+ expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
171
+ end
172
+ end
83
173
  end
84
174
  end
85
175
 
86
176
  RSpec.describe Capybara::RackTest::Driver do
87
- before do
88
- @driver = TestSessions::RackTest.driver
89
- end
177
+ let(:driver) { TestSessions::RackTest.driver }
90
178
 
91
179
  describe ':headers option' do
92
180
  it 'should always set headers' do
93
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
94
- @driver.visit('/get_header')
95
- expect(@driver.html).to include('foobar')
181
+ driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
182
+ driver.visit('/get_header')
183
+ expect(driver.html).to include('foobar')
96
184
  end
97
185
 
98
186
  it 'should keep headers on link clicks' do
99
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
100
- @driver.visit('/header_links')
101
- @driver.find_xpath('.//a').first.click
102
- expect(@driver.html).to include('foobar')
187
+ driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
188
+ driver.visit('/header_links')
189
+ driver.find_xpath('.//a').first.click
190
+ expect(driver.html).to include('foobar')
103
191
  end
104
192
 
105
193
  it 'should keep headers on form submit' do
106
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
107
- @driver.visit('/header_links')
108
- @driver.find_xpath('.//input').first.click
109
- expect(@driver.html).to include('foobar')
194
+ driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
195
+ driver.visit('/header_links')
196
+ driver.find_xpath('.//input').first.click
197
+ expect(driver.html).to include('foobar')
110
198
  end
111
199
 
112
200
  it 'should keep headers on redirects' do
113
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
114
- @driver.visit('/get_header_via_redirect')
115
- expect(@driver.html).to include('foobar')
201
+ driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
202
+ driver.visit('/get_header_via_redirect')
203
+ expect(driver.html).to include('foobar')
116
204
  end
117
205
  end
118
206
 
119
207
  describe ':follow_redirects option' do
120
- it "defaults to following redirects" do
121
- @driver = Capybara::RackTest::Driver.new(TestApp)
208
+ it 'defaults to following redirects' do
209
+ driver = described_class.new(TestApp)
122
210
 
123
- @driver.visit('/redirect')
124
- expect(@driver.response.header['Location']).to be_nil
125
- expect(@driver.current_url).to match %r{/landed$}
211
+ driver.visit('/redirect')
212
+ expect(driver.response.header['Location']).to be_nil
213
+ expect(driver.current_url).to match %r{/landed$}
126
214
  end
127
215
 
128
- it "is possible to not follow redirects" do
129
- @driver = Capybara::RackTest::Driver.new(TestApp, :follow_redirects => false)
216
+ it 'is possible to not follow redirects' do
217
+ driver = described_class.new(TestApp, follow_redirects: false)
130
218
 
131
- @driver.visit('/redirect')
132
- expect(@driver.response.header['Location']).to match %r{/redirect_again$}
133
- expect(@driver.current_url).to match %r{/redirect$}
219
+ driver.visit('/redirect')
220
+ expect(driver.response.header['Location']).to match %r{/redirect_again$}
221
+ expect(driver.current_url).to match %r{/redirect$}
134
222
  end
135
223
  end
136
224
 
137
225
  describe ':redirect_limit option' do
138
- context "with default redirect limit" do
139
- before do
140
- @driver = Capybara::RackTest::Driver.new(TestApp)
141
- end
226
+ context 'with default redirect limit' do
227
+ let(:driver) { described_class.new(TestApp) }
142
228
 
143
- it "should follow 5 redirects" do
144
- @driver.visit("/redirect/5/times")
145
- expect(@driver.html).to include('redirection complete')
229
+ it 'should follow 5 redirects' do
230
+ driver.visit('/redirect/5/times')
231
+ expect(driver.html).to include('redirection complete')
146
232
  end
147
233
 
148
- it "should not follow more than 6 redirects" do
234
+ it 'should not follow more than 6 redirects' do
149
235
  expect do
150
- @driver.visit("/redirect/6/times")
236
+ driver.visit('/redirect/6/times')
151
237
  end.to raise_error(Capybara::InfiniteRedirectError)
152
238
  end
153
239
  end
154
240
 
155
- context "with 21 redirect limit" do
156
- before do
157
- @driver = Capybara::RackTest::Driver.new(TestApp, :redirect_limit => 21)
158
- end
241
+ context 'with 21 redirect limit' do
242
+ let(:driver) { described_class.new(TestApp, redirect_limit: 21) }
159
243
 
160
- it "should follow 21 redirects" do
161
- @driver.visit("/redirect/21/times")
162
- expect(@driver.html).to include('redirection complete')
244
+ it 'should follow 21 redirects' do
245
+ driver.visit('/redirect/21/times')
246
+ expect(driver.html).to include('redirection complete')
163
247
  end
164
248
 
165
- it "should not follow more than 21 redirects" do
249
+ it 'should not follow more than 21 redirects' do
166
250
  expect do
167
- @driver.visit("/redirect/22/times")
251
+ driver.visit('/redirect/22/times')
168
252
  end.to raise_error(Capybara::InfiniteRedirectError)
169
253
  end
170
254
  end
171
255
  end
172
256
  end
173
257
 
258
+ RSpec.describe 'Capybara::String' do
259
+ it 'should use gumbo' do
260
+ skip 'Only valid if gumbo is included' unless nokogumbo_required
261
+ allow(Nokogiri).to receive(:HTML5).and_call_original
262
+ Capybara.string('<div id=test_div></div>')
263
+ expect(Nokogiri).to have_received(:HTML5)
264
+ end
265
+ end
266
+
174
267
  module CSSHandlerIncludeTester
175
268
  def dont_extend_css_handler
176
269
  raise 'should never be called'
177
270
  end
178
271
  end
179
- include CSSHandlerIncludeTester
180
272
 
181
- RSpec.describe Capybara::RackTest::CSSHandlers do
182
- it "should not be extended by global includes" do
183
- expect(Capybara::RackTest::CSSHandlers.new).not_to respond_to(:dont_extend_css_handler)
273
+ RSpec.describe Capybara::RackTest::CSSHandlers do
274
+ include CSSHandlerIncludeTester
275
+
276
+ it 'should not be extended by global includes' do
277
+ expect(described_class.new).not_to respond_to(:dont_extend_css_handler)
184
278
  end
185
279
  end
186
-