capybara 3.13.2 → 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 (260) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +587 -16
  4. data/README.md +240 -90
  5. data/lib/capybara/config.rb +24 -11
  6. data/lib/capybara/cucumber.rb +1 -1
  7. data/lib/capybara/driver/base.rb +8 -0
  8. data/lib/capybara/driver/node.rb +20 -4
  9. data/lib/capybara/dsl.rb +5 -3
  10. data/lib/capybara/helpers.rb +25 -4
  11. data/lib/capybara/minitest/spec.rb +174 -90
  12. data/lib/capybara/minitest.rb +256 -142
  13. data/lib/capybara/node/actions.rb +123 -77
  14. data/lib/capybara/node/base.rb +20 -12
  15. data/lib/capybara/node/document.rb +2 -2
  16. data/lib/capybara/node/document_matchers.rb +3 -3
  17. data/lib/capybara/node/element.rb +223 -117
  18. data/lib/capybara/node/finders.rb +81 -71
  19. data/lib/capybara/node/matchers.rb +271 -134
  20. data/lib/capybara/node/simple.rb +18 -5
  21. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +8 -9
  24. data/lib/capybara/queries/base_query.rb +3 -2
  25. data/lib/capybara/queries/current_path_query.rb +15 -5
  26. data/lib/capybara/queries/selector_query.rb +364 -54
  27. data/lib/capybara/queries/sibling_query.rb +8 -6
  28. data/lib/capybara/queries/style_query.rb +2 -2
  29. data/lib/capybara/queries/text_query.rb +13 -1
  30. data/lib/capybara/queries/title_query.rb +1 -1
  31. data/lib/capybara/rack_test/browser.rb +76 -11
  32. data/lib/capybara/rack_test/driver.rb +10 -5
  33. data/lib/capybara/rack_test/errors.rb +6 -0
  34. data/lib/capybara/rack_test/form.rb +31 -9
  35. data/lib/capybara/rack_test/node.rb +74 -23
  36. data/lib/capybara/registration_container.rb +41 -0
  37. data/lib/capybara/registrations/drivers.rb +42 -0
  38. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  39. data/lib/capybara/registrations/servers.rb +66 -0
  40. data/lib/capybara/result.rb +44 -20
  41. data/lib/capybara/rspec/matcher_proxies.rb +13 -11
  42. data/lib/capybara/rspec/matchers/base.rb +31 -16
  43. data/lib/capybara/rspec/matchers/compound.rb +1 -1
  44. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  45. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  46. data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
  47. data/lib/capybara/rspec/matchers/have_selector.rb +21 -21
  48. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  49. data/lib/capybara/rspec/matchers/have_text.rb +4 -4
  50. data/lib/capybara/rspec/matchers/have_title.rb +2 -2
  51. data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
  52. data/lib/capybara/rspec/matchers/match_style.rb +7 -2
  53. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  54. data/lib/capybara/rspec/matchers.rb +111 -68
  55. data/lib/capybara/rspec.rb +2 -0
  56. data/lib/capybara/selector/builders/css_builder.rb +11 -7
  57. data/lib/capybara/selector/builders/xpath_builder.rb +5 -3
  58. data/lib/capybara/selector/css.rb +11 -9
  59. data/lib/capybara/selector/definition/button.rb +68 -0
  60. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  61. data/lib/capybara/selector/definition/css.rb +10 -0
  62. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  63. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  64. data/lib/capybara/selector/definition/element.rb +28 -0
  65. data/lib/capybara/selector/definition/field.rb +40 -0
  66. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  67. data/lib/capybara/selector/definition/file_field.rb +13 -0
  68. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  69. data/lib/capybara/selector/definition/frame.rb +17 -0
  70. data/lib/capybara/selector/definition/id.rb +6 -0
  71. data/lib/capybara/selector/definition/label.rb +62 -0
  72. data/lib/capybara/selector/definition/link.rb +55 -0
  73. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  74. data/lib/capybara/selector/definition/option.rb +27 -0
  75. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  76. data/lib/capybara/selector/definition/select.rb +81 -0
  77. data/lib/capybara/selector/definition/table.rb +109 -0
  78. data/lib/capybara/selector/definition/table_row.rb +21 -0
  79. data/lib/capybara/selector/definition/xpath.rb +5 -0
  80. data/lib/capybara/selector/definition.rb +280 -0
  81. data/lib/capybara/selector/filter_set.rb +19 -18
  82. data/lib/capybara/selector/filters/base.rb +11 -2
  83. data/lib/capybara/selector/filters/locator_filter.rb +13 -3
  84. data/lib/capybara/selector/regexp_disassembler.rb +11 -7
  85. data/lib/capybara/selector/selector.rb +50 -440
  86. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  87. data/lib/capybara/selector.rb +473 -482
  88. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  89. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  90. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  91. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  92. data/lib/capybara/selenium/driver.rb +174 -62
  93. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +74 -18
  94. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  95. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +37 -3
  96. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +14 -1
  97. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  98. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  99. data/lib/capybara/selenium/extensions/find.rb +68 -45
  100. data/lib/capybara/selenium/extensions/html5_drag.rb +192 -22
  101. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  102. data/lib/capybara/selenium/extensions/scroll.rb +8 -10
  103. data/lib/capybara/selenium/node.rb +268 -72
  104. data/lib/capybara/selenium/nodes/chrome_node.rb +105 -9
  105. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  106. data/lib/capybara/selenium/nodes/firefox_node.rb +51 -61
  107. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  108. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  109. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  110. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  111. data/lib/capybara/selenium/patches/logs.rb +45 -0
  112. data/lib/capybara/selenium/patches/pause_duration_fix.rb +1 -1
  113. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  114. data/lib/capybara/server/animation_disabler.rb +43 -21
  115. data/lib/capybara/server/checker.rb +6 -2
  116. data/lib/capybara/server/middleware.rb +25 -13
  117. data/lib/capybara/server.rb +20 -4
  118. data/lib/capybara/session/config.rb +15 -11
  119. data/lib/capybara/session/matchers.rb +11 -11
  120. data/lib/capybara/session.rb +162 -131
  121. data/lib/capybara/spec/public/offset.js +6 -0
  122. data/lib/capybara/spec/public/test.js +105 -6
  123. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  124. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  125. data/lib/capybara/spec/session/all_spec.rb +89 -15
  126. data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
  127. data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
  128. data/lib/capybara/spec/session/assert_text_spec.rb +26 -22
  129. data/lib/capybara/spec/session/attach_file_spec.rb +64 -31
  130. data/lib/capybara/spec/session/check_spec.rb +26 -4
  131. data/lib/capybara/spec/session/choose_spec.rb +14 -2
  132. data/lib/capybara/spec/session/click_button_spec.rb +109 -61
  133. data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
  134. data/lib/capybara/spec/session/click_link_spec.rb +23 -1
  135. data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
  136. data/lib/capybara/spec/session/current_url_spec.rb +11 -1
  137. data/lib/capybara/spec/session/element/matches_selector_spec.rb +40 -39
  138. data/lib/capybara/spec/session/evaluate_script_spec.rb +12 -0
  139. data/lib/capybara/spec/session/fill_in_spec.rb +46 -5
  140. data/lib/capybara/spec/session/find_link_spec.rb +10 -0
  141. data/lib/capybara/spec/session/find_spec.rb +80 -7
  142. data/lib/capybara/spec/session/first_spec.rb +2 -2
  143. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
  144. data/lib/capybara/spec/session/frame/within_frame_spec.rb +14 -1
  145. data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
  146. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  147. data/lib/capybara/spec/session/has_any_selectors_spec.rb +6 -2
  148. data/lib/capybara/spec/session/has_button_spec.rb +81 -0
  149. data/lib/capybara/spec/session/has_css_spec.rb +45 -8
  150. data/lib/capybara/spec/session/has_current_path_spec.rb +22 -7
  151. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  152. data/lib/capybara/spec/session/has_field_spec.rb +59 -1
  153. data/lib/capybara/spec/session/has_link_spec.rb +40 -0
  154. data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
  155. data/lib/capybara/spec/session/has_select_spec.rb +42 -8
  156. data/lib/capybara/spec/session/has_selector_spec.rb +19 -4
  157. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  158. data/lib/capybara/spec/session/has_table_spec.rb +177 -0
  159. data/lib/capybara/spec/session/has_text_spec.rb +31 -3
  160. data/lib/capybara/spec/session/html_spec.rb +1 -1
  161. data/lib/capybara/spec/session/matches_style_spec.rb +6 -4
  162. data/lib/capybara/spec/session/node_spec.rb +697 -23
  163. data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
  164. data/lib/capybara/spec/session/refresh_spec.rb +2 -1
  165. data/lib/capybara/spec/session/reset_session_spec.rb +21 -7
  166. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  167. data/lib/capybara/spec/session/save_page_spec.rb +4 -4
  168. data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -4
  169. data/lib/capybara/spec/session/scroll_spec.rb +9 -7
  170. data/lib/capybara/spec/session/select_spec.rb +5 -10
  171. data/lib/capybara/spec/session/selectors_spec.rb +24 -3
  172. data/lib/capybara/spec/session/uncheck_spec.rb +3 -3
  173. data/lib/capybara/spec/session/unselect_spec.rb +1 -1
  174. data/lib/capybara/spec/session/visit_spec.rb +20 -0
  175. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  176. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -1
  177. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -1
  178. data/lib/capybara/spec/session/window/window_spec.rb +54 -57
  179. data/lib/capybara/spec/session/window/windows_spec.rb +2 -2
  180. data/lib/capybara/spec/session/within_spec.rb +36 -0
  181. data/lib/capybara/spec/spec_helper.rb +30 -19
  182. data/lib/capybara/spec/test_app.rb +122 -34
  183. data/lib/capybara/spec/views/animated.erb +49 -0
  184. data/lib/capybara/spec/views/form.erb +86 -8
  185. data/lib/capybara/spec/views/frame_child.erb +3 -2
  186. data/lib/capybara/spec/views/frame_one.erb +2 -1
  187. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  188. data/lib/capybara/spec/views/frame_two.erb +1 -1
  189. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  190. data/lib/capybara/spec/views/layout.erb +10 -0
  191. data/lib/capybara/spec/views/obscured.erb +10 -10
  192. data/lib/capybara/spec/views/offset.erb +33 -0
  193. data/lib/capybara/spec/views/path.erb +2 -2
  194. data/lib/capybara/spec/views/popup_one.erb +1 -1
  195. data/lib/capybara/spec/views/popup_two.erb +1 -1
  196. data/lib/capybara/spec/views/react.erb +45 -0
  197. data/lib/capybara/spec/views/scroll.erb +2 -1
  198. data/lib/capybara/spec/views/spatial.erb +31 -0
  199. data/lib/capybara/spec/views/tables.erb +67 -0
  200. data/lib/capybara/spec/views/with_animation.erb +39 -4
  201. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  202. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  203. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  204. data/lib/capybara/spec/views/with_hover.erb +3 -2
  205. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  206. data/lib/capybara/spec/views/with_html.erb +34 -6
  207. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  208. data/lib/capybara/spec/views/with_js.erb +7 -4
  209. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  210. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  211. data/lib/capybara/spec/views/with_scope.erb +2 -2
  212. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  213. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  214. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  215. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  216. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  217. data/lib/capybara/spec/views/with_windows.erb +1 -1
  218. data/lib/capybara/spec/views/within_frames.erb +1 -1
  219. data/lib/capybara/version.rb +1 -1
  220. data/lib/capybara/window.rb +14 -18
  221. data/lib/capybara.rb +91 -126
  222. data/spec/basic_node_spec.rb +30 -16
  223. data/spec/capybara_spec.rb +40 -28
  224. data/spec/counter_spec.rb +35 -0
  225. data/spec/css_builder_spec.rb +3 -1
  226. data/spec/css_splitter_spec.rb +1 -1
  227. data/spec/dsl_spec.rb +33 -22
  228. data/spec/filter_set_spec.rb +5 -5
  229. data/spec/fixtures/selenium_driver_rspec_failure.rb +3 -3
  230. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -3
  231. data/spec/minitest_spec.rb +24 -2
  232. data/spec/minitest_spec_spec.rb +60 -45
  233. data/spec/per_session_config_spec.rb +1 -1
  234. data/spec/rack_test_spec.rb +131 -98
  235. data/spec/regexp_dissassembler_spec.rb +53 -39
  236. data/spec/result_spec.rb +68 -66
  237. data/spec/rspec/features_spec.rb +9 -4
  238. data/spec/rspec/scenarios_spec.rb +6 -2
  239. data/spec/rspec/shared_spec_matchers.rb +137 -98
  240. data/spec/rspec_matchers_spec.rb +25 -0
  241. data/spec/rspec_spec.rb +23 -21
  242. data/spec/sauce_spec_chrome.rb +43 -0
  243. data/spec/selector_spec.rb +77 -21
  244. data/spec/selenium_spec_chrome.rb +141 -39
  245. data/spec/selenium_spec_chrome_remote.rb +32 -17
  246. data/spec/selenium_spec_edge.rb +36 -8
  247. data/spec/selenium_spec_firefox.rb +110 -68
  248. data/spec/selenium_spec_firefox_remote.rb +22 -15
  249. data/spec/selenium_spec_ie.rb +29 -22
  250. data/spec/selenium_spec_safari.rb +162 -0
  251. data/spec/server_spec.rb +153 -81
  252. data/spec/session_spec.rb +11 -4
  253. data/spec/shared_selenium_node.rb +79 -0
  254. data/spec/shared_selenium_session.rb +179 -74
  255. data/spec/spec_helper.rb +80 -5
  256. data/spec/whitespace_normalizer_spec.rb +54 -0
  257. data/spec/xpath_builder_spec.rb +3 -1
  258. metadata +218 -30
  259. data/lib/capybara/spec/session/source_spec.rb +0 -0
  260. data/lib/capybara/spec/views/with_title.erb +0 -5
@@ -31,8 +31,8 @@ module Capybara
31
31
  raise NotImplementedError
32
32
  end
33
33
 
34
- # @param value String or Array. Array is only allowed if node has 'multiple' attribute
35
- # @param options [Hash{}] Driver specific options for how to set a value on a node
34
+ # @param value [String, Array] Array is only allowed if node has 'multiple' attribute
35
+ # @param options [Hash] Driver specific options for how to set a value on a node
36
36
  def set(value, **options)
37
37
  raise NotImplementedError
38
38
  end
@@ -65,7 +65,11 @@ module Capybara
65
65
  raise NotImplementedError
66
66
  end
67
67
 
68
- def drag_to(element)
68
+ def drag_to(element, **options)
69
+ raise NotImplementedError
70
+ end
71
+
72
+ def drop(*args)
69
73
  raise NotImplementedError
70
74
  end
71
75
 
@@ -85,6 +89,10 @@ module Capybara
85
89
  raise NotImplementedError
86
90
  end
87
91
 
92
+ def obscured?
93
+ raise NotImplementedError
94
+ end
95
+
88
96
  def checked?
89
97
  raise NotImplementedError
90
98
  end
@@ -105,6 +113,10 @@ module Capybara
105
113
  !!self[:multiple]
106
114
  end
107
115
 
116
+ def rect
117
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#rect'
118
+ end
119
+
108
120
  def path
109
121
  raise NotSupportedByDriverError, 'Capybara::Driver::Node#path'
110
122
  end
@@ -113,6 +125,10 @@ module Capybara
113
125
  raise NotSupportedByDriverError, 'Capybara::Driver::Node#trigger'
114
126
  end
115
127
 
128
+ def shadow_root
129
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#shadow_root'
130
+ end
131
+
116
132
  def inspect
117
133
  %(#<#{self.class} tag="#{tag_name}" path="#{path}">)
118
134
  rescue NotSupportedByDriverError
@@ -120,7 +136,7 @@ module Capybara
120
136
  end
121
137
 
122
138
  def ==(other)
123
- raise NotSupportedByDriverError, 'Capybara::Driver::Node#=='
139
+ eql?(other) || (other.respond_to?(:native) && native == other.native)
124
140
  end
125
141
  end
126
142
  end
data/lib/capybara/dsl.rb CHANGED
@@ -47,9 +47,11 @@ module Capybara
47
47
  end
48
48
 
49
49
  Session::DSL_METHODS.each do |method|
50
- define_method method do |*args, &block|
51
- page.send method, *args, &block
52
- end
50
+ class_eval <<~METHOD, __FILE__, __LINE__ + 1
51
+ def #{method}(...)
52
+ page.method("#{method}").call(...)
53
+ end
54
+ METHOD
53
55
  end
54
56
  end
55
57
 
@@ -15,7 +15,7 @@ module Capybara
15
15
  # @return [String] Normalized text
16
16
  #
17
17
  def normalize_whitespace(text)
18
- warn 'DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver'
18
+ Capybara::Helpers.warn 'DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver'
19
19
  text.to_s.gsub(/[[:space:]]+/, ' ').strip
20
20
  end
21
21
 
@@ -41,7 +41,7 @@ module Capybara
41
41
  ##
42
42
  #
43
43
  # Injects a `<base>` tag into the given HTML code, pointing to
44
- # `Capybara.asset_host`.
44
+ # {Capybara.configure asset_host}.
45
45
  #
46
46
  # @param [String] html HTML code to inject into
47
47
  # @param [URL] host (Capybara.asset_host) The host from which assets should be loaded
@@ -70,7 +70,26 @@ module Capybara
70
70
  count == 1 ? singular : plural
71
71
  end
72
72
 
73
- if defined?(Process::CLOCK_MONOTONIC)
73
+ def filter_backtrace(trace)
74
+ return 'No backtrace' unless trace
75
+
76
+ filter = %r{lib/capybara/|lib/rspec/|lib/minitest/|delegate.rb}
77
+ new_trace = trace.take_while { |line| line !~ filter }
78
+ new_trace = trace.grep_v(filter) if new_trace.empty?
79
+ new_trace = trace.dup if new_trace.empty?
80
+
81
+ new_trace.first.split(':in ', 2).first
82
+ end
83
+
84
+ def warn(message, uplevel: 1)
85
+ Kernel.warn(message, uplevel: uplevel)
86
+ end
87
+
88
+ if defined?(Process::CLOCK_MONOTONIC_RAW)
89
+ def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC_RAW; end
90
+ elsif defined?(Process::CLOCK_MONOTONIC_PRECISE)
91
+ def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC_PRECISE; end
92
+ elsif defined?(Process::CLOCK_MONOTONIC)
74
93
  def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC; end
75
94
  else
76
95
  def monotonic_time; Time.now.to_f; end
@@ -87,7 +106,9 @@ module Capybara
87
106
  end
88
107
 
89
108
  def expired?
90
- raise Capybara::FrozenInTime, 'Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead' if stalled?
109
+ if stalled?
110
+ raise Capybara::FrozenInTime, 'Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead'
111
+ end
91
112
 
92
113
  current - @start >= @expire_in
93
114
  end
@@ -5,179 +5,263 @@ require 'minitest/spec'
5
5
  module Capybara
6
6
  module Minitest
7
7
  module Expectations
8
- %w[text content title current_path].each do |assertion|
9
- infect_an_assertion "assert_#{assertion}", "must_have_#{assertion}", :reverse
10
- infect_an_assertion "refute_#{assertion}", "wont_have_#{assertion}", :reverse
11
- end
8
+ ##
9
+ # Expectation that there is an ancestor
10
+ #
11
+ # @!method must_have_ancestor
12
+ # See {Capybara::Node::Matchers#has_ancestor?}
12
13
 
13
- # rubocop:disable Style/MultilineBlockChain
14
- (%w[selector xpath css link button field select table checked_field unchecked_field].flat_map do |assertion|
15
- [%W[assert_#{assertion} must_have_#{assertion}],
16
- %W[refute_#{assertion} wont_have_#{assertion}]]
17
- end + [%w[assert_all_of_selectors must_have_all_of_selectors],
18
- %w[assert_none_of_selectors must_have_none_of_selectors],
19
- %w[assert_any_of_selectors must_have_any_of_selectors],
20
- %w[assert_matches_style must_match_style]] +
21
- %w[selector xpath css].flat_map do |assertion|
22
- [%W[assert_matches_#{assertion} must_match_#{assertion}],
23
- %W[refute_matches_#{assertion} wont_match_#{assertion}]]
24
- end).each do |(meth, new_name)|
25
- class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
26
- def #{new_name} *args, &block
27
- ::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(*args, &block)
28
- end
29
- ASSERTION
14
+ ##
15
+ # Expectation that there is button
16
+ #
17
+ # @!method must_have_button
18
+ # See {Capybara::Node::Matchers#has_button?}
30
19
 
31
- ::Minitest::Expectation.class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
32
- def #{new_name} *args, &block
33
- ctx.#{meth}(target, *args, &block)
34
- end
35
- ASSERTION
36
- end
37
- # rubocop:enable Style/MultilineBlockChain
20
+ ##
21
+ # Expectation that there is no button
22
+ #
23
+ # @!method wont_have_button
24
+ # See {Capybara::Node::Matchers#has_no_button?}
38
25
 
39
26
  ##
40
- # @deprecated
41
- def must_have_style(*args, &block)
42
- warn 'must_have_style is deprecated, please use must_match_style'
43
- must_match_style(*args, &block)
44
- end
27
+ # Expectation that there is checked_field
28
+ #
29
+ # @!method must_have_checked_field
30
+ # See {Capybara::Node::Matchers#has_checked_field?}
45
31
 
46
32
  ##
47
- # Expectation that there is xpath
33
+ # Expectation that there is no checked_field
48
34
  #
49
- # @!method must_have_xpath
50
- # see Capybara::Node::Matchers#has_xpath?
35
+ # @!method wont_have_checked_field
36
+ # See {Capybara::Node::Matchers#has_no_checked_field?}
51
37
 
52
38
  ##
53
- # Expectation that there is no xpath
39
+ # Expectation that there is unchecked_field
54
40
  #
55
- # @!method wont_have_xpath
56
- # see Capybara::Node::Matchers#has_no_xpath?
41
+ # @!method must_have_unchecked_field
42
+ # See {Capybara::Node::Matchers#has_unchecked_field?}
57
43
 
58
44
  ##
59
- # Expectation that there is css
45
+ # Expectation that there is no unchecked_field
60
46
  #
61
- # @!method must_have_css
62
- # see Capybara::Node::Matchers#has_css?
47
+ # @!method wont_have_unchecked_field
48
+ # See {Capybara::Node::Matchers#has_no_unchecked_field?}
63
49
 
64
50
  ##
65
- # Expectation that there is no css
51
+ # Expectation that page content does match
66
52
  #
67
- # @!method wont_have_css
68
- # see Capybara::Node::Matchers#has_no_css?
53
+ # @!method must_have_content
54
+ # See {Capybara::Node::Matchers#has_content?}
69
55
 
70
56
  ##
71
- # Expectation that there is link
57
+ # Expectation that page content does not match
72
58
  #
73
- # @!method must_have_link
74
- # see {Capybara::Node::Matchers#has_link?}
59
+ # @!method wont_have_content
60
+ # See {Capybara::Node::Matchers#has_no_content?}
75
61
 
76
62
  ##
77
- # Expectation that there is no link
63
+ # Expectation that there is css
78
64
  #
79
- # @!method wont_have_link
80
- # see {Capybara::Node::Matchers#has_no_link?}
65
+ # @!method must_have_css
66
+ # See {Capybara::Node::Matchers#has_css?}
81
67
 
82
68
  ##
83
- # Expectation that there is button
69
+ # Expectation that there is no css
84
70
  #
85
- # @!method must_have_button
86
- # see {Capybara::Node::Matchers#has_button?}
71
+ # @!method wont_have_css
72
+ # See {Capybara::Node::Matchers#has_no_css?}
87
73
 
88
74
  ##
89
- # Expectation that there is no button
75
+ # Expectation that current path matches
90
76
  #
91
- # @!method wont_have_button
92
- # see {Capybara::Node::Matchers#has_no_button?}
77
+ # @!method must_have_current_path
78
+ # See {Capybara::SessionMatchers#has_current_path?}
79
+
80
+ ##
81
+ # Expectation that current page does not match
82
+ #
83
+ # @!method wont_have_current_path
84
+ # See {Capybara::SessionMatchers#has_no_current_path?}
93
85
 
94
86
  ##
95
87
  # Expectation that there is field
96
88
  #
97
89
  # @!method must_have_field
98
- # see {Capybara::Node::Matchers#has_field?}
90
+ # See {Capybara::Node::Matchers#has_field?}
99
91
 
100
92
  ##
101
93
  # Expectation that there is no field
102
94
  #
103
95
  # @!method wont_have_field
104
- # see {Capybara::Node::Matchers#has_no_field?}
96
+ # See {Capybara::Node::Matchers#has_no_field?}
105
97
 
106
98
  ##
107
- # Expectation that there is checked_field
99
+ # Expectation that there is element
108
100
  #
109
- # @!method must_have_checked_field
110
- # see {Capybara::Node::Matchers#has_checked_field?}
101
+ # @!method must_have_element
102
+ # See {Capybara::Node::Matchers#has_element?}
111
103
 
112
104
  ##
113
- # Expectation that there is no checked_field
105
+ # Expectation that there is no element
114
106
  #
115
- # @!method wont_have_chceked_field
107
+ # @!method wont_have_element
108
+ # See {Capybara::Node::Matchers#has_no_element?}
116
109
 
117
110
  ##
118
- # Expectation that there is unchecked_field
111
+ # Expectation that there is link
119
112
  #
120
- # @!method must_have_unchecked_field
121
- # see {Capybara::Node::Matchers#has_unchecked_field?}
113
+ # @!method must_have_link
114
+ # See {Capybara::Node::Matchers#has_link?}
122
115
 
123
116
  ##
124
- # Expectation that there is no unchecked_field
117
+ # Expectation that there is no link
125
118
  #
126
- # @!method wont_have_unchceked_field
119
+ # @!method wont_have_link
120
+ # See {Capybara::Node::Matchers#has_no_link?}
121
+
122
+ ##
123
+ # Expectation that page text does match
124
+ #
125
+ # @!method must_have_text
126
+ # See {Capybara::Node::Matchers#has_text?}
127
+
128
+ ##
129
+ # Expectation that page text does not match
130
+ #
131
+ # @!method wont_have_text
132
+ # See {Capybara::Node::Matchers#has_no_text?}
133
+
134
+ ##
135
+ # Expectation that page title does match
136
+ #
137
+ # @!method must_have_title
138
+ # See {Capybara::Node::DocumentMatchers#has_title?}
139
+
140
+ ##
141
+ # Expectation that page title does not match
142
+ #
143
+ # @!method wont_have_title
144
+ # See {Capybara::Node::DocumentMatchers#has_no_title?}
127
145
 
128
146
  ##
129
147
  # Expectation that there is select
130
148
  #
131
149
  # @!method must_have_select
132
- # see {Capybara::Node::Matchers#has_select?}
150
+ # See {Capybara::Node::Matchers#has_select?}
133
151
 
134
152
  ##
135
153
  # Expectation that there is no select
136
154
  #
137
155
  # @!method wont_have_select
138
- # see {Capybara::Node::Matchers#has_no_select?}
156
+ # See {Capybara::Node::Matchers#has_no_select?}
139
157
 
140
158
  ##
141
- # Expectation that there is table
159
+ # Expectation that there is a selector
142
160
  #
143
- # @!method must_have_table
144
- # see {Capybara::Node::Matchers#has_table?}
161
+ # @!method must_have_selector
162
+ # See {Capybara::Node::Matchers#has_selector?}
145
163
 
146
164
  ##
147
- # Expectation that there is no table
165
+ # Expectation that there is no selector
148
166
  #
149
- # @!method wont_have_table
150
- # see {Capybara::Node::Matchers#has_no_table?}
167
+ # @!method wont_have_selector
168
+ # See {Capybara::Node::Matchers#has_no_selector?}
151
169
 
152
170
  ##
153
- # Expectation that page title does match
171
+ # Expectation that all of the provided selectors are present
154
172
  #
155
- # @!method must_have_title
156
- # see {Capybara::Node::DocumentMatchers#assert_title}
173
+ # @!method must_have_all_of_selectors
174
+ # See {Capybara::Node::Matchers#assert_all_of_selectors}
157
175
 
158
176
  ##
159
- # Expectation that page title does not match
177
+ # Expectation that none of the provided selectors are present
160
178
  #
161
- # @!method wont_have_title
162
- # see {Capybara::Node::DocumentMatchers#assert_no_title}
179
+ # @!method must_have_none_of_selectors
180
+ # See {Capybara::Node::Matchers#assert_none_of_selectors}
163
181
 
164
182
  ##
165
- # Expectation that current path matches
183
+ # Expectation that any of the provided selectors are present
166
184
  #
167
- # @!method must_have_current_path
168
- # see {Capybara::SessionMatchers#assert_current_path}
185
+ # @!method must_have_any_of_selectors
186
+ # See {Capybara::Node::Matchers#assert_any_of_selectors}
169
187
 
170
188
  ##
171
- # Expectation that current page does not match
189
+ # Expectation that there is a sibling
172
190
  #
173
- # @!method wont_have_current_path
174
- # see {Capybara::SessionMatchers#assert_no_current_path}
191
+ # @!method must_have_sibling
192
+ # See {Capybara::Node::Matchers#has_sibling?}
175
193
 
176
194
  ##
177
195
  # Expectation that element has style
178
196
  #
179
197
  # @!method must_match_style
180
- # see {Capybara::Node::Matchers#assert_matches_style}
198
+ # See {Capybara::Node::Matchers#matches_style?}
199
+
200
+ ##
201
+ # Expectation that there is table
202
+ #
203
+ # @!method must_have_table
204
+ # See {Capybara::Node::Matchers#has_table?}
205
+
206
+ ##
207
+ # Expectation that there is no table
208
+ #
209
+ # @!method wont_have_table
210
+ # See {Capybara::Node::Matchers#has_no_table?}
211
+
212
+ ##
213
+ # Expectation that there is xpath
214
+ #
215
+ # @!method must_have_xpath
216
+ # See {Capybara::Node::Matchers#has_xpath?}
217
+
218
+ ##
219
+ # Expectation that there is no xpath
220
+ #
221
+ # @!method wont_have_xpath
222
+ # See {Capybara::Node::Matchers#has_no_xpath?}
223
+
224
+ # This currently doesn't work for Ruby 2.8 due to Minitest not forwarding keyword args separately
225
+ # %w[text content title current_path].each do |assertion|
226
+ # infect_an_assertion "assert_#{assertion}", "must_have_#{assertion}", :reverse
227
+ # infect_an_assertion "refute_#{assertion}", "wont_have_#{assertion}", :reverse
228
+ # end
229
+
230
+ # rubocop:disable Style/MultilineBlockChain
231
+ (%w[text content title current_path
232
+ selector xpath css link button field select table checked_field unchecked_field
233
+ ancestor sibling].flat_map do |assertion|
234
+ [%W[assert_#{assertion} must_have_#{assertion}],
235
+ %W[refute_#{assertion} wont_have_#{assertion}]]
236
+ end + [%w[assert_all_of_selectors must_have_all_of_selectors],
237
+ %w[assert_none_of_selectors must_have_none_of_selectors],
238
+ %w[assert_any_of_selectors must_have_any_of_selectors],
239
+ %w[assert_matches_style must_match_style]] +
240
+ %w[selector xpath css].flat_map do |assertion|
241
+ [%W[assert_matches_#{assertion} must_match_#{assertion}],
242
+ %W[refute_matches_#{assertion} wont_match_#{assertion}]]
243
+ end).each do |(meth, new_name)|
244
+ class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
245
+ def #{new_name}(...)
246
+ ::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(...)
247
+ end
248
+ ASSERTION
249
+
250
+ ::Minitest::Expectation.class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
251
+ def #{new_name}(...)
252
+ raise "Calling ##{new_name} outside of test." unless ctx
253
+ ctx.#{meth}(target, ...)
254
+ end
255
+ ASSERTION
256
+ end
257
+ # rubocop:enable Style/MultilineBlockChain
258
+
259
+ ##
260
+ # @deprecated
261
+ def must_have_style(...)
262
+ warn 'must_have_style is deprecated, please use must_match_style'
263
+ must_match_style(...)
264
+ end
181
265
  end
182
266
  end
183
267
  end