rspec-rails 1.3.2 → 7.0.2

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 (268) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.document +4 -6
  4. data/.yardopts +11 -0
  5. data/Capybara.md +28 -0
  6. data/Changelog.md +1343 -0
  7. data/LICENSE.md +25 -0
  8. data/README.md +383 -0
  9. data/lib/generators/rspec/channel/channel_generator.rb +12 -0
  10. data/lib/generators/rspec/channel/templates/channel_spec.rb.erb +7 -0
  11. data/lib/generators/rspec/controller/controller_generator.rb +51 -0
  12. data/lib/generators/rspec/controller/templates/controller_spec.rb +16 -0
  13. data/lib/generators/rspec/controller/templates/request_spec.rb +19 -0
  14. data/lib/generators/rspec/controller/templates/routing_spec.rb +13 -0
  15. data/lib/generators/rspec/controller/templates/view_spec.rb +5 -0
  16. data/lib/generators/rspec/feature/feature_generator.rb +29 -0
  17. data/lib/generators/rspec/feature/templates/feature_singular_spec.rb +5 -0
  18. data/lib/generators/rspec/feature/templates/feature_spec.rb +5 -0
  19. data/lib/generators/rspec/generator/generator_generator.rb +24 -0
  20. data/lib/generators/rspec/generator/templates/generator_spec.rb +5 -0
  21. data/lib/generators/rspec/helper/helper_generator.rb +16 -0
  22. data/lib/generators/rspec/helper/templates/helper_spec.rb +17 -0
  23. data/lib/generators/rspec/install/install_generator.rb +80 -0
  24. data/lib/generators/rspec/install/templates/spec/rails_helper.rb +89 -0
  25. data/lib/generators/rspec/job/job_generator.rb +13 -0
  26. data/lib/generators/rspec/job/templates/job_spec.rb.erb +7 -0
  27. data/lib/generators/rspec/mailbox/mailbox_generator.rb +14 -0
  28. data/lib/generators/rspec/mailbox/templates/mailbox_spec.rb.erb +7 -0
  29. data/lib/generators/rspec/mailer/mailer_generator.rb +30 -0
  30. data/lib/generators/rspec/mailer/templates/fixture +3 -0
  31. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +25 -0
  32. data/lib/generators/rspec/mailer/templates/preview.rb +13 -0
  33. data/lib/generators/rspec/model/model_generator.rb +37 -0
  34. data/lib/generators/rspec/model/templates/fixtures.yml +19 -0
  35. data/lib/generators/rspec/model/templates/model_spec.rb +7 -0
  36. data/lib/generators/rspec/request/request_generator.rb +17 -0
  37. data/lib/generators/rspec/request/templates/request_spec.rb +10 -0
  38. data/lib/generators/rspec/scaffold/scaffold_generator.rb +136 -0
  39. data/lib/generators/rspec/scaffold/templates/api_controller_spec.rb +129 -0
  40. data/lib/generators/rspec/scaffold/templates/api_request_spec.rb +131 -0
  41. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +145 -0
  42. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +27 -0
  43. data/lib/generators/rspec/scaffold/templates/index_spec.rb +26 -0
  44. data/lib/generators/rspec/scaffold/templates/new_spec.rb +22 -0
  45. data/lib/generators/rspec/scaffold/templates/request_spec.rb +138 -0
  46. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +46 -0
  47. data/lib/generators/rspec/scaffold/templates/show_spec.rb +21 -0
  48. data/lib/generators/rspec/system/system_generator.rb +24 -0
  49. data/lib/generators/rspec/system/templates/system_spec.rb +9 -0
  50. data/lib/generators/rspec/view/templates/view_spec.rb +5 -0
  51. data/lib/generators/rspec/view/view_generator.rb +22 -0
  52. data/lib/generators/rspec.rb +56 -0
  53. data/lib/rspec/rails/active_record.rb +25 -0
  54. data/lib/rspec/rails/adapters.rb +196 -0
  55. data/lib/rspec/rails/configuration.rb +222 -0
  56. data/lib/rspec/rails/example/channel_example_group.rb +93 -0
  57. data/lib/rspec/rails/example/controller_example_group.rb +217 -0
  58. data/lib/rspec/rails/example/feature_example_group.rb +53 -0
  59. data/lib/rspec/rails/example/helper_example_group.rb +42 -0
  60. data/lib/rspec/rails/example/job_example_group.rb +23 -0
  61. data/lib/rspec/rails/example/mailbox_example_group.rb +80 -0
  62. data/lib/rspec/rails/example/mailer_example_group.rb +38 -0
  63. data/lib/rspec/rails/example/model_example_group.rb +11 -0
  64. data/lib/rspec/rails/example/rails_example_group.rb +23 -0
  65. data/lib/rspec/rails/example/request_example_group.rb +27 -0
  66. data/lib/rspec/rails/example/routing_example_group.rb +61 -0
  67. data/lib/rspec/rails/example/system_example_group.rb +180 -0
  68. data/lib/rspec/rails/example/view_example_group.rb +214 -0
  69. data/lib/rspec/rails/example.rb +13 -0
  70. data/lib/rspec/rails/extensions/active_record/proxy.rb +11 -0
  71. data/lib/rspec/rails/extensions.rb +1 -0
  72. data/lib/rspec/rails/feature_check.rb +51 -0
  73. data/lib/rspec/rails/file_fixture_support.rb +18 -0
  74. data/lib/rspec/rails/fixture_file_upload_support.rb +45 -0
  75. data/lib/rspec/rails/fixture_support.rb +88 -0
  76. data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +173 -0
  77. data/lib/rspec/rails/matchers/action_cable/have_streams.rb +58 -0
  78. data/lib/rspec/rails/matchers/action_cable.rb +65 -0
  79. data/lib/rspec/rails/matchers/action_mailbox.rb +73 -0
  80. data/lib/rspec/rails/matchers/active_job.rb +517 -0
  81. data/lib/rspec/rails/matchers/base_matcher.rb +179 -0
  82. data/lib/rspec/rails/matchers/be_a_new.rb +83 -0
  83. data/lib/rspec/rails/matchers/be_new_record.rb +30 -0
  84. data/lib/rspec/rails/matchers/be_valid.rb +49 -0
  85. data/lib/rspec/rails/matchers/have_enqueued_mail.rb +258 -0
  86. data/lib/rspec/rails/matchers/have_http_status.rb +381 -0
  87. data/lib/rspec/rails/matchers/have_rendered.rb +64 -0
  88. data/lib/rspec/rails/matchers/redirect_to.rb +38 -0
  89. data/lib/rspec/rails/matchers/relation_match_array.rb +3 -0
  90. data/lib/rspec/rails/matchers/routing_matchers.rb +125 -0
  91. data/lib/rspec/rails/matchers/send_email.rb +122 -0
  92. data/lib/rspec/rails/matchers.rb +36 -0
  93. data/lib/rspec/rails/tasks/rspec.rake +49 -0
  94. data/lib/rspec/rails/vendor/capybara.rb +32 -0
  95. data/lib/rspec/rails/version.rb +9 -0
  96. data/lib/rspec/rails/view_assigns.rb +27 -0
  97. data/lib/rspec/rails/view_path_builder.rb +29 -0
  98. data/lib/rspec/rails/view_rendering.rb +166 -0
  99. data/lib/rspec/rails/view_spec_methods.rb +56 -0
  100. data/lib/rspec/rails.rb +18 -0
  101. data/lib/rspec-rails.rb +97 -0
  102. data.tar.gz.sig +0 -0
  103. metadata +307 -261
  104. metadata.gz.sig +0 -0
  105. data/Contribute.rdoc +0 -4
  106. data/History.rdoc +0 -302
  107. data/License.txt +0 -33
  108. data/Manifest.txt +0 -165
  109. data/README.rdoc +0 -45
  110. data/Rakefile +0 -72
  111. data/TODO.txt +0 -17
  112. data/Upgrade.rdoc +0 -148
  113. data/generators/integration_spec/integration_spec_generator.rb +0 -10
  114. data/generators/integration_spec/templates/integration_spec.rb +0 -4
  115. data/generators/rspec/CHANGES +0 -1
  116. data/generators/rspec/rspec_generator.rb +0 -72
  117. data/generators/rspec/templates/previous_failures.txt +0 -0
  118. data/generators/rspec/templates/rcov.opts +0 -2
  119. data/generators/rspec/templates/rspec.rake +0 -144
  120. data/generators/rspec/templates/script/autospec +0 -6
  121. data/generators/rspec/templates/script/spec +0 -10
  122. data/generators/rspec/templates/spec.opts +0 -4
  123. data/generators/rspec/templates/spec_helper.rb +0 -54
  124. data/generators/rspec_controller/USAGE +0 -33
  125. data/generators/rspec_controller/rspec_controller_generator.rb +0 -47
  126. data/generators/rspec_controller/templates/controller_spec.rb +0 -25
  127. data/generators/rspec_controller/templates/helper_spec.rb +0 -11
  128. data/generators/rspec_controller/templates/view_spec.rb +0 -12
  129. data/generators/rspec_default_values.rb +0 -28
  130. data/generators/rspec_model/USAGE +0 -18
  131. data/generators/rspec_model/rspec_model_generator.rb +0 -35
  132. data/generators/rspec_model/templates/model_spec.rb +0 -13
  133. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +0 -154
  134. data/generators/rspec_scaffold/templates/controller_spec.rb +0 -131
  135. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +0 -25
  136. data/generators/rspec_scaffold/templates/helper_spec.rb +0 -11
  137. data/generators/rspec_scaffold/templates/index_erb_spec.rb +0 -27
  138. data/generators/rspec_scaffold/templates/new_erb_spec.rb +0 -25
  139. data/generators/rspec_scaffold/templates/routing_spec.rb +0 -33
  140. data/generators/rspec_scaffold/templates/show_erb_spec.rb +0 -22
  141. data/init.rb +0 -9
  142. data/lib/autotest/discover.rb +0 -5
  143. data/lib/autotest/rails_rspec.rb +0 -76
  144. data/lib/spec/rails/example/assigns_hash_proxy.rb +0 -39
  145. data/lib/spec/rails/example/controller_example_group.rb +0 -285
  146. data/lib/spec/rails/example/cookies_proxy.rb +0 -29
  147. data/lib/spec/rails/example/functional_example_group.rb +0 -106
  148. data/lib/spec/rails/example/helper_example_group.rb +0 -153
  149. data/lib/spec/rails/example/integration_example_group.rb +0 -16
  150. data/lib/spec/rails/example/model_example_group.rb +0 -15
  151. data/lib/spec/rails/example/render_observer.rb +0 -80
  152. data/lib/spec/rails/example/routing_example_group.rb +0 -13
  153. data/lib/spec/rails/example/routing_helpers.rb +0 -66
  154. data/lib/spec/rails/example/view_example_group.rb +0 -199
  155. data/lib/spec/rails/example.rb +0 -48
  156. data/lib/spec/rails/extensions/action_controller/rescue.rb +0 -42
  157. data/lib/spec/rails/extensions/action_controller/test_case.rb +0 -16
  158. data/lib/spec/rails/extensions/action_controller/test_response.rb +0 -21
  159. data/lib/spec/rails/extensions/action_view/base.rb +0 -33
  160. data/lib/spec/rails/extensions/active_record/base.rb +0 -45
  161. data/lib/spec/rails/extensions/active_support/test_case.rb +0 -7
  162. data/lib/spec/rails/extensions/spec/matchers/have.rb +0 -23
  163. data/lib/spec/rails/extensions/spec/runner/configuration.rb +0 -44
  164. data/lib/spec/rails/extensions.rb +0 -11
  165. data/lib/spec/rails/interop/testcase.rb +0 -14
  166. data/lib/spec/rails/matchers/ar_be_valid.rb +0 -27
  167. data/lib/spec/rails/matchers/assert_select.rb +0 -180
  168. data/lib/spec/rails/matchers/change.rb +0 -13
  169. data/lib/spec/rails/matchers/have_text.rb +0 -57
  170. data/lib/spec/rails/matchers/include_text.rb +0 -54
  171. data/lib/spec/rails/matchers/redirect_to.rb +0 -126
  172. data/lib/spec/rails/matchers/render_template.rb +0 -129
  173. data/lib/spec/rails/matchers/route_to.rb +0 -149
  174. data/lib/spec/rails/matchers.rb +0 -32
  175. data/lib/spec/rails/mocks.rb +0 -136
  176. data/lib/spec/rails/version.rb +0 -16
  177. data/lib/spec/rails.rb +0 -26
  178. data/spec/autotest/mappings_spec.rb +0 -86
  179. data/spec/rails_suite.rb +0 -7
  180. data/spec/resources/controllers/action_view_base_spec_controller.rb +0 -2
  181. data/spec/resources/controllers/application.rb +0 -9
  182. data/spec/resources/controllers/controller_spec_controller.rb +0 -127
  183. data/spec/resources/controllers/example.txt +0 -1
  184. data/spec/resources/controllers/redirect_spec_controller.rb +0 -70
  185. data/spec/resources/controllers/render_spec_controller.rb +0 -34
  186. data/spec/resources/controllers/rjs_spec_controller.rb +0 -58
  187. data/spec/resources/helpers/addition_helper.rb +0 -5
  188. data/spec/resources/helpers/explicit_helper.rb +0 -46
  189. data/spec/resources/helpers/more_explicit_helper.rb +0 -5
  190. data/spec/resources/helpers/plugin_application_helper.rb +0 -6
  191. data/spec/resources/helpers/view_spec_helper.rb +0 -13
  192. data/spec/resources/models/animal.rb +0 -4
  193. data/spec/resources/models/person.rb +0 -18
  194. data/spec/resources/models/thing.rb +0 -3
  195. data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  196. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +0 -1
  197. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +0 -1
  198. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  199. data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +0 -1
  200. data/spec/resources/views/controller_spec/action_with_template.html.erb +0 -1
  201. data/spec/resources/views/layouts/application.html.erb +0 -0
  202. data/spec/resources/views/layouts/simple.html.erb +0 -0
  203. data/spec/resources/views/objects/_object.html.erb +0 -1
  204. data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  205. data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  206. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  207. data/spec/resources/views/render_spec/some_action.js.rjs +0 -1
  208. data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +0 -1
  209. data/spec/resources/views/rjs_spec/hide_div.js.rjs +0 -1
  210. data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +0 -1
  211. data/spec/resources/views/rjs_spec/insert_html.js.rjs +0 -1
  212. data/spec/resources/views/rjs_spec/replace.js.rjs +0 -1
  213. data/spec/resources/views/rjs_spec/replace_html.js.rjs +0 -1
  214. data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +0 -1
  215. data/spec/resources/views/rjs_spec/visual_effect.js.rjs +0 -1
  216. data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +0 -1
  217. data/spec/resources/views/tag_spec/no_tags.html.erb +0 -1
  218. data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +0 -1
  219. data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +0 -1
  220. data/spec/resources/views/view_spec/_partial.html.erb +0 -2
  221. data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  222. data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +0 -1
  223. data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +0 -1
  224. data/spec/resources/views/view_spec/_spacer.html.erb +0 -1
  225. data/spec/resources/views/view_spec/accessor.html.erb +0 -6
  226. data/spec/resources/views/view_spec/block_helper.html.erb +0 -3
  227. data/spec/resources/views/view_spec/entry_form.html.erb +0 -2
  228. data/spec/resources/views/view_spec/explicit_helper.html.erb +0 -2
  229. data/spec/resources/views/view_spec/foo/show.html.erb +0 -1
  230. data/spec/resources/views/view_spec/implicit_helper.html.erb +0 -2
  231. data/spec/resources/views/view_spec/multiple_helpers.html.erb +0 -3
  232. data/spec/resources/views/view_spec/path_params.html.erb +0 -1
  233. data/spec/resources/views/view_spec/should_not_receive.html.erb +0 -3
  234. data/spec/resources/views/view_spec/template_with_partial.html.erb +0 -5
  235. data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +0 -3
  236. data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +0 -1
  237. data/spec/resources/views/view_spec/view_helpers.html.erb +0 -1
  238. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +0 -109
  239. data/spec/spec/rails/example/configuration_spec.rb +0 -65
  240. data/spec/spec/rails/example/controller_example_group_spec.rb +0 -307
  241. data/spec/spec/rails/example/controller_isolation_spec.rb +0 -75
  242. data/spec/spec/rails/example/cookies_proxy_spec.rb +0 -87
  243. data/spec/spec/rails/example/error_handling_spec.rb +0 -90
  244. data/spec/spec/rails/example/example_group_factory_spec.rb +0 -112
  245. data/spec/spec/rails/example/helper_example_group_spec.rb +0 -233
  246. data/spec/spec/rails/example/model_example_group_spec.rb +0 -32
  247. data/spec/spec/rails/example/routing_example_group_spec.rb +0 -10
  248. data/spec/spec/rails/example/shared_routing_example_group_examples.rb +0 -237
  249. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +0 -33
  250. data/spec/spec/rails/example/view_example_group_spec.rb +0 -346
  251. data/spec/spec/rails/extensions/action_view_base_spec.rb +0 -74
  252. data/spec/spec/rails/extensions/active_record_spec.rb +0 -14
  253. data/spec/spec/rails/interop/testcase_spec.rb +0 -70
  254. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +0 -19
  255. data/spec/spec/rails/matchers/assert_select_spec.rb +0 -835
  256. data/spec/spec/rails/matchers/errors_on_spec.rb +0 -37
  257. data/spec/spec/rails/matchers/have_text_spec.rb +0 -69
  258. data/spec/spec/rails/matchers/include_text_spec.rb +0 -62
  259. data/spec/spec/rails/matchers/redirect_to_spec.rb +0 -253
  260. data/spec/spec/rails/matchers/render_template_spec.rb +0 -208
  261. data/spec/spec/rails/matchers/should_change_spec.rb +0 -15
  262. data/spec/spec/rails/mocks/ar_classes.rb +0 -10
  263. data/spec/spec/rails/mocks/mock_model_spec.rb +0 -109
  264. data/spec/spec/rails/mocks/stub_model_spec.rb +0 -80
  265. data/spec/spec/rails/sample_modified_fixture.rb +0 -8
  266. data/spec/spec/rails/sample_spec.rb +0 -8
  267. data/spec/spec/rails/spec_spec.rb +0 -11
  268. data/spec/spec_helper.rb +0 -78
@@ -0,0 +1,180 @@
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container class for system tests
5
+ module SystemExampleGroup
6
+ extend ActiveSupport::Concern
7
+ include RSpec::Rails::RailsExampleGroup
8
+ include RSpec::Rails::Matchers::RedirectTo
9
+ include RSpec::Rails::Matchers::RenderTemplate
10
+ include ActionDispatch::Integration::Runner
11
+ include ActionDispatch::Assertions
12
+ include ActionController::TemplateAssertions
13
+
14
+ # Special characters to translate into underscores for #method_name
15
+ CHARS_TO_TRANSLATE = ['/', '.', ':', ',', "'", '"', " "].freeze
16
+
17
+ # @private
18
+ module BlowAwayTeardownHooks
19
+ # @private
20
+ def before_teardown
21
+ end
22
+
23
+ # @private
24
+ def after_teardown
25
+ end
26
+ end
27
+
28
+ # for the SystemTesting Screenshot situation
29
+ def passed?
30
+ return false if RSpec.current_example.exception
31
+ return true unless defined?(::RSpec::Expectations::FailureAggregator)
32
+
33
+ failure_notifier = ::RSpec::Support.failure_notifier
34
+ return true unless failure_notifier.is_a?(::RSpec::Expectations::FailureAggregator)
35
+
36
+ failure_notifier.failures.empty? && failure_notifier.other_errors.empty?
37
+ end
38
+
39
+ # @private
40
+ def method_name
41
+ @method_name ||= [
42
+ self.class.name.underscore,
43
+ RSpec.current_example.description.underscore
44
+ ].join("_").tr(CHARS_TO_TRANSLATE.join, "_").byteslice(0...200).scrub("") + "_#{rand(1000)}"
45
+ end
46
+
47
+ if ::Rails::VERSION::STRING.to_f >= 7.1
48
+ # @private
49
+ # Allows failure screenshot to work whilst not exposing metadata
50
+ class SuppressRailsScreenshotMetadata
51
+ def initialize
52
+ @example_data = {}
53
+ end
54
+
55
+ def [](key)
56
+ if @example_data.key?(key)
57
+ @example_data[key]
58
+ else
59
+ raise_wrong_scope_error
60
+ end
61
+ end
62
+
63
+ def []=(key, value)
64
+ if key == :failure_screenshot_path
65
+ @example_data[key] = value
66
+ else
67
+ raise_wrong_scope_error
68
+ end
69
+ end
70
+
71
+ def method_missing(_name, *_args, &_block)
72
+ raise_wrong_scope_error
73
+ end
74
+
75
+ private
76
+
77
+ def raise_wrong_scope_error
78
+ raise RSpec::Core::ExampleGroup::WrongScopeError,
79
+ "`metadata` is not available from within an example " \
80
+ "(e.g. an `it` block) or from constructs that run in the " \
81
+ "scope of an example (e.g. `before`, `let`, etc). It is " \
82
+ "only available on an example group (e.g. a `describe` or "\
83
+ "`context` block)"
84
+ end
85
+ end
86
+
87
+ # @private
88
+ def metadata
89
+ @metadata ||= SuppressRailsScreenshotMetadata.new
90
+ end
91
+ end
92
+
93
+ # Delegates to `Rails.application`.
94
+ def app
95
+ ::Rails.application
96
+ end
97
+
98
+ # Default driver to assign if none specified.
99
+ DEFAULT_DRIVER =
100
+ if ::Rails::VERSION::STRING.to_f >= 7.2
101
+ :selenium_chrome_headless
102
+ else
103
+ :selenium
104
+ end
105
+
106
+ included do |other|
107
+ ActiveSupport.on_load(:action_dispatch_system_test_case) do
108
+ ActionDispatch::SystemTesting::Server.silence_puma = true
109
+ end
110
+
111
+ require 'action_dispatch/system_test_case'
112
+
113
+ begin
114
+ require 'capybara'
115
+ rescue LoadError => e
116
+ abort """
117
+ LoadError: #{e.message}
118
+ System test integration has a hard
119
+ dependency on a webserver and `capybara`, please add capybara to
120
+ your Gemfile and configure a webserver (e.g. `Capybara.server =
121
+ :puma`) before attempting to use system specs.
122
+ """.gsub(/\s+/, ' ').strip
123
+ end
124
+
125
+ original_before_teardown =
126
+ ::ActionDispatch::SystemTesting::TestHelpers::SetupAndTeardown.instance_method(:before_teardown)
127
+
128
+ original_after_teardown =
129
+ ::ActionDispatch::SystemTesting::TestHelpers::SetupAndTeardown.instance_method(:after_teardown)
130
+
131
+ other.include ::ActionDispatch::SystemTesting::TestHelpers::SetupAndTeardown
132
+ other.include ::ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper
133
+ other.include BlowAwayTeardownHooks
134
+
135
+ attr_reader :driver
136
+
137
+ if ActionDispatch::SystemTesting::Server.respond_to?(:silence_puma=)
138
+ ActionDispatch::SystemTesting::Server.silence_puma = true
139
+ end
140
+
141
+ def initialize(*args, &blk)
142
+ super(*args, &blk)
143
+ @driver = nil
144
+
145
+ self.class.before do
146
+ # A user may have already set the driver, so only default if driver
147
+ # is not set
148
+ driven_by(DEFAULT_DRIVER) unless @driver
149
+ end
150
+ end
151
+
152
+ def driven_by(driver, **driver_options, &blk)
153
+ @driver = ::ActionDispatch::SystemTestCase.driven_by(driver, **driver_options, &blk).tap(&:use)
154
+ end
155
+
156
+ before do
157
+ @routes = ::Rails.application.routes
158
+ end
159
+
160
+ after do
161
+ orig_stdout = $stdout
162
+ $stdout = StringIO.new
163
+ begin
164
+ original_before_teardown.bind(self).call
165
+ ensure
166
+ myio = $stdout
167
+ myio.rewind
168
+ RSpec.current_example.metadata[:extra_failure_lines] = myio.readlines
169
+ $stdout = orig_stdout
170
+ end
171
+ end
172
+
173
+ around do |example|
174
+ example.run
175
+ original_after_teardown.bind(self).call
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,214 @@
1
+ require 'rspec/rails/view_assigns'
2
+ require 'rspec/rails/view_spec_methods'
3
+ require 'rspec/rails/view_path_builder'
4
+
5
+ module RSpec
6
+ module Rails
7
+ # @api public
8
+ # Container class for view spec functionality.
9
+ module ViewExampleGroup
10
+ extend ActiveSupport::Concern
11
+ include RSpec::Rails::RailsExampleGroup
12
+ include ActionView::TestCase::Behavior
13
+ include RSpec::Rails::ViewAssigns
14
+ include RSpec::Rails::Matchers::RenderTemplate
15
+
16
+ # @private
17
+ module StubResolverCache
18
+ def self.resolver_for(hash)
19
+ @resolvers ||= {}
20
+ @resolvers[hash] ||= ActionView::FixtureResolver.new(hash)
21
+ end
22
+ end
23
+
24
+ # @private
25
+ module ClassMethods
26
+ def _default_helper
27
+ base = metadata[:description].split('/')[0..-2].join('/')
28
+ (base.camelize + 'Helper').constantize unless base.to_s.empty?
29
+ rescue NameError
30
+ nil
31
+ end
32
+
33
+ def _default_helpers
34
+ helpers = [_default_helper].compact
35
+ helpers << ApplicationHelper if Object.const_defined?('ApplicationHelper')
36
+ helpers
37
+ end
38
+ end
39
+
40
+ # DSL exposed to view specs.
41
+ module ExampleMethods
42
+ extend ActiveSupport::Concern
43
+
44
+ included do
45
+ include ::Rails.application.routes.url_helpers
46
+ include ::Rails.application.routes.mounted_helpers
47
+ end
48
+
49
+ # @overload render
50
+ # @overload render({partial: path_to_file})
51
+ # @overload render({partial: path_to_file}, {... locals ...})
52
+ # @overload render({partial: path_to_file}, {... locals ...}) do ... end
53
+ #
54
+ # Delegates to ActionView::Base#render, so see documentation on that
55
+ # for more info.
56
+ #
57
+ # The only addition is that you can call render with no arguments, and
58
+ # RSpec will pass the top level description to render:
59
+ #
60
+ # describe "widgets/new.html.erb" do
61
+ # it "shows all the widgets" do
62
+ # render # => view.render(file: "widgets/new.html.erb")
63
+ # # ...
64
+ # end
65
+ # end
66
+ def render(options = {}, local_assigns = {}, &block)
67
+ options = _default_render_options if Hash === options && options.empty?
68
+ options = options.merge(_default_render_options) if Hash === options && options.keys == [:locals]
69
+ super(options, local_assigns, &block)
70
+ end
71
+
72
+ # The instance of `ActionView::Base` that is used to render the template.
73
+ # Use this to stub methods _before_ calling `render`.
74
+ #
75
+ # describe "widgets/new.html.erb" do
76
+ # it "shows all the widgets" do
77
+ # view.stub(:foo) { "foo" }
78
+ # render
79
+ # # ...
80
+ # end
81
+ # end
82
+ def view
83
+ _view
84
+ end
85
+
86
+ # Simulates the presence of a template on the file system by adding a
87
+ # Rails' FixtureResolver to the front of the view_paths list. Designed to
88
+ # help isolate view examples from partials rendered by the view template
89
+ # that is the subject of the example.
90
+ #
91
+ # stub_template("widgets/_widget.html.erb" => "This content.")
92
+ def stub_template(hash)
93
+ controller.prepend_view_path(StubResolverCache.resolver_for(hash))
94
+ end
95
+
96
+ # Provides access to the params hash that will be available within the
97
+ # view.
98
+ #
99
+ # params[:foo] = 'bar'
100
+ def params
101
+ controller.params
102
+ end
103
+
104
+ # @deprecated Use `view` instead.
105
+ def template
106
+ RSpec.deprecate("template", replacement: "view")
107
+ view
108
+ end
109
+
110
+ # @deprecated Use `rendered` instead.
111
+ def response
112
+ # `assert_template` expects `response` to implement a #body method
113
+ # like an `ActionDispatch::Response` does to force the view to
114
+ # render. For backwards compatibility, we use #response as an alias
115
+ # for #rendered, but it needs to implement #body to avoid
116
+ # `assert_template` raising a `NoMethodError`.
117
+ unless rendered.respond_to?(:body)
118
+ def rendered.body
119
+ self
120
+ end
121
+ end
122
+
123
+ rendered
124
+ end
125
+
126
+ private
127
+
128
+ def _default_render_options
129
+ formats = if ActionView::Template::Types.respond_to?(:symbols)
130
+ ActionView::Template::Types.symbols
131
+ else
132
+ [:html, :text, :js, :css, :xml, :json].map(&:to_s)
133
+ end.map { |x| Regexp.escape(x) }.join("|")
134
+
135
+ handlers = ActionView::Template::Handlers.extensions.map { |x| Regexp.escape(x) }.join("|")
136
+ locales = "[a-z]{2}(?:-[A-Z]{2})?"
137
+ variants = "[^.]*"
138
+ path_regex = %r{
139
+ \A
140
+ (?<template>.*?)
141
+ (?:\.(?<locale>#{locales}))??
142
+ (?:\.(?<format>#{formats}))??
143
+ (?:\+(?<variant>#{variants}))??
144
+ (?:\.(?<handler>#{handlers}))?
145
+ \z
146
+ }x
147
+
148
+ # This regex should always find a match.
149
+ # Worst case, everything will be nil, and :template will just be
150
+ # the original string.
151
+ match = path_regex.match(_default_file_to_render)
152
+
153
+ render_options = { template: match[:template] }
154
+ render_options[:handlers] = [match[:handler].to_sym] if match[:handler]
155
+ render_options[:formats] = [match[:format].to_sym] if match[:format]
156
+ render_options[:locales] = [match[:locale].to_sym] if match[:locale]
157
+ render_options[:variants] = [match[:variant].to_sym] if match[:variant]
158
+
159
+ render_options
160
+ end
161
+
162
+ def _path_parts
163
+ _default_file_to_render.split("/")
164
+ end
165
+
166
+ def _controller_path
167
+ _path_parts[0..-2].join("/")
168
+ end
169
+
170
+ def _inferred_action
171
+ _path_parts.last.split(".").first
172
+ end
173
+
174
+ def _include_controller_helpers
175
+ helpers = controller._helpers
176
+ view.singleton_class.class_exec do
177
+ include helpers unless included_modules.include?(helpers)
178
+ end
179
+ end
180
+ end
181
+
182
+ included do
183
+ include ExampleMethods
184
+
185
+ helper(*_default_helpers)
186
+
187
+ before do
188
+ _include_controller_helpers
189
+ view.lookup_context.prefixes << _controller_path
190
+
191
+ controller.controller_path = _controller_path
192
+
193
+ path_params_to_merge = {}
194
+ path_params_to_merge[:controller] = _controller_path
195
+ path_params_to_merge[:action] = _inferred_action unless _inferred_action =~ /^_/
196
+
197
+ path_params = controller.request.path_parameters
198
+
199
+ controller.request.path_parameters = path_params.reverse_merge(path_params_to_merge)
200
+ controller.request.path = ViewPathBuilder.new(::Rails.application.routes).path_for(controller.request.path_parameters)
201
+ ViewSpecMethods.add_to(::ActionView::TestCase::TestController)
202
+ end
203
+
204
+ after do
205
+ ViewSpecMethods.remove_from(::ActionView::TestCase::TestController)
206
+ end
207
+
208
+ let(:_default_file_to_render) do |example|
209
+ example.example_group.top_level_description
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,13 @@
1
+ require 'rspec/rails/example/rails_example_group'
2
+ require 'rspec/rails/example/controller_example_group'
3
+ require 'rspec/rails/example/request_example_group'
4
+ require 'rspec/rails/example/helper_example_group'
5
+ require 'rspec/rails/example/view_example_group'
6
+ require 'rspec/rails/example/mailer_example_group'
7
+ require 'rspec/rails/example/routing_example_group'
8
+ require 'rspec/rails/example/model_example_group'
9
+ require 'rspec/rails/example/job_example_group'
10
+ require 'rspec/rails/example/feature_example_group'
11
+ require 'rspec/rails/example/system_example_group'
12
+ require 'rspec/rails/example/channel_example_group'
13
+ require 'rspec/rails/example/mailbox_example_group'
@@ -0,0 +1,11 @@
1
+ RSpec.configure do |rspec|
2
+ # Delay this in order to give users a chance to configure `expect_with`...
3
+ rspec.before(:suite) do
4
+ if defined?(RSpec::Matchers) &&
5
+ RSpec::Matchers.configuration.respond_to?(:syntax) && # RSpec 4 dropped support for monkey-patching `should` syntax
6
+ RSpec::Matchers.configuration.syntax.include?(:should) &&
7
+ defined?(ActiveRecord::Associations)
8
+ RSpec::Matchers.configuration.add_should_and_should_not_to ActiveRecord::Associations::CollectionProxy
9
+ end
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'rspec/rails/extensions/active_record/proxy'
@@ -0,0 +1,51 @@
1
+ module RSpec
2
+ module Rails
3
+ # @private
4
+ module FeatureCheck
5
+ module_function
6
+ def has_active_job?
7
+ defined?(::ActiveJob)
8
+ end
9
+
10
+ def has_active_record?
11
+ defined?(::ActiveRecord)
12
+ end
13
+
14
+ def has_active_record_migration?
15
+ has_active_record? && defined?(::ActiveRecord::Migration)
16
+ end
17
+
18
+ def has_action_mailer?
19
+ defined?(::ActionMailer)
20
+ end
21
+
22
+ def has_action_mailer_preview?
23
+ has_action_mailer? && defined?(::ActionMailer::Preview)
24
+ end
25
+
26
+ def has_action_cable_testing?
27
+ defined?(::ActionCable)
28
+ end
29
+
30
+ def has_action_mailer_parameterized?
31
+ has_action_mailer? && defined?(::ActionMailer::Parameterized::DeliveryJob)
32
+ end
33
+
34
+ def has_action_mailer_unified_delivery?
35
+ has_action_mailer? && defined?(::ActionMailer::MailDeliveryJob)
36
+ end
37
+
38
+ def has_action_mailer_legacy_delivery_job?
39
+ defined?(ActionMailer::DeliveryJob)
40
+ end
41
+
42
+ def has_action_mailbox?
43
+ defined?(::ActionMailbox)
44
+ end
45
+
46
+ def type_metatag(type)
47
+ "type: :#{type}"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_support/testing/file_fixtures'
2
+
3
+ module RSpec
4
+ module Rails
5
+ # @private
6
+ module FileFixtureSupport
7
+ extend ActiveSupport::Concern
8
+ include ActiveSupport::Testing::FileFixtures
9
+
10
+ included do
11
+ self.file_fixture_path = RSpec.configuration.file_fixture_path
12
+ if defined?(ActiveStorage::FixtureSet)
13
+ ActiveStorage::FixtureSet.file_fixture_path = RSpec.configuration.file_fixture_path
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,45 @@
1
+ module RSpec
2
+ module Rails
3
+ # @private
4
+ module FixtureFileUploadSupport
5
+ delegate :fixture_file_upload, to: :rails_fixture_file_wrapper
6
+
7
+ private
8
+
9
+ # In Rails 7.0 fixture file path needs to be relative to `file_fixture_path` instead, this change
10
+ # was brought in with a deprecation warning on 6.1. In Rails 7.0 expect to rework this to remove
11
+ # the old accessor.
12
+ def rails_fixture_file_wrapper
13
+ RailsFixtureFileWrapper.file_fixture_path = nil
14
+ resolved_fixture_path =
15
+ if respond_to?(:file_fixture_path) && !file_fixture_path.nil?
16
+ file_fixture_path.to_s
17
+ elsif respond_to?(:fixture_paths)
18
+ (RSpec.configuration.fixture_paths&.first || '').to_s
19
+ else
20
+ (RSpec.configuration.fixture_path || '').to_s
21
+ end
22
+ RailsFixtureFileWrapper.file_fixture_path = File.join(resolved_fixture_path, '') unless resolved_fixture_path.strip.empty?
23
+ RailsFixtureFileWrapper.instance
24
+ end
25
+
26
+ class RailsFixtureFileWrapper
27
+ include ActionDispatch::TestProcess if defined?(ActionDispatch::TestProcess)
28
+ include ActiveSupport::Testing::FileFixtures
29
+
30
+ class << self
31
+ if ::Rails::VERSION::STRING < "7.1.0"
32
+ attr_accessor :fixture_path
33
+ else
34
+ attr_accessor :fixture_paths
35
+ end
36
+
37
+ # Get instance of wrapper
38
+ def instance
39
+ @instance ||= new
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,88 @@
1
+ module RSpec
2
+ module Rails
3
+ # @private
4
+ module FixtureSupport
5
+ if defined?(ActiveRecord::TestFixtures)
6
+ extend ActiveSupport::Concern
7
+ include RSpec::Rails::SetupAndTeardownAdapter
8
+ include RSpec::Rails::MinitestLifecycleAdapter
9
+ include RSpec::Rails::MinitestAssertionAdapter
10
+ include ActiveRecord::TestFixtures
11
+
12
+ # @private prevent ActiveSupport::TestFixtures to start a DB transaction.
13
+ # Monkey patched to avoid collisions with 'let(:name)' since Rails 6.1
14
+ def run_in_transaction?
15
+ current_example_name = (RSpec.current_example && RSpec.current_example.metadata[:description])
16
+ use_transactional_tests && !self.class.uses_transaction?(current_example_name)
17
+ end
18
+
19
+ included do
20
+ if RSpec.configuration.use_active_record?
21
+ include Fixtures
22
+
23
+ # TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2
24
+ if respond_to?(:fixture_paths=)
25
+ self.fixture_paths = RSpec.configuration.fixture_paths
26
+ else
27
+ self.fixture_path = RSpec.configuration.fixture_path
28
+ end
29
+
30
+ self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures
31
+ self.use_instantiated_fixtures = RSpec.configuration.use_instantiated_fixtures
32
+
33
+ fixtures RSpec.configuration.global_fixtures if RSpec.configuration.global_fixtures
34
+ end
35
+ end
36
+
37
+ module Fixtures
38
+ extend ActiveSupport::Concern
39
+
40
+ # rubocop:disable Metrics/BlockLength
41
+ class_methods do
42
+ if ::Rails.version.to_f >= 7.1
43
+ def fixtures(*args)
44
+ super.tap do
45
+ fixture_sets.each_pair do |method_name, fixture_name|
46
+ proxy_method_warning_if_called_in_before_context_scope(method_name, fixture_name)
47
+ end
48
+ end
49
+ end
50
+
51
+ def proxy_method_warning_if_called_in_before_context_scope(method_name, fixture_name)
52
+ define_method(method_name) do |*args, **kwargs, &blk|
53
+ if RSpec.current_scope == :before_context_hook
54
+ RSpec.warn_with("Calling fixture method in before :context ")
55
+ else
56
+ access_fixture(fixture_name, *args, **kwargs, &blk)
57
+ end
58
+ end
59
+ end
60
+ else
61
+ def fixtures(*args)
62
+ orig_methods = private_instance_methods
63
+ super.tap do
64
+ new_methods = private_instance_methods - orig_methods
65
+ new_methods.each do |method_name|
66
+ proxy_method_warning_if_called_in_before_context_scope(method_name)
67
+ end
68
+ end
69
+ end
70
+
71
+ def proxy_method_warning_if_called_in_before_context_scope(method_name)
72
+ orig_implementation = instance_method(method_name)
73
+ define_method(method_name) do |*args, &blk|
74
+ if RSpec.current_scope == :before_context_hook
75
+ RSpec.warn_with("Calling fixture method in before :context ")
76
+ else
77
+ orig_implementation.bind(self).call(*args, &blk)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ # rubocop:enable Metrics/BlockLength
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end