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,56 @@
1
+ require 'rails/generators/named_base'
2
+ require 'rspec/core'
3
+ require 'rspec/rails/feature_check'
4
+
5
+ # @private
6
+ # Weirdly named generators namespace (should be `RSpec`) for compatibility with
7
+ # rails loading.
8
+ module Rspec
9
+ # @private
10
+ module Generators
11
+ # @private
12
+ class Base < ::Rails::Generators::NamedBase
13
+ include RSpec::Rails::FeatureCheck
14
+
15
+ def self.source_root(path = nil)
16
+ if path
17
+ @_rspec_source_root = path
18
+ else
19
+ @_rspec_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'rspec', generator_name, 'templates'))
20
+ end
21
+ end
22
+
23
+ # @private
24
+ # Load configuration from RSpec to ensure `--default-path` is set
25
+ def self.configuration
26
+ @configuration ||=
27
+ begin
28
+ configuration = RSpec.configuration
29
+ options = RSpec::Core::ConfigurationOptions.new({})
30
+ options.configure(configuration)
31
+ configuration
32
+ end
33
+ end
34
+
35
+ def target_path(*paths)
36
+ File.join(self.class.configuration.default_path, *paths)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ # @private
43
+ module Rails
44
+ module Generators
45
+ # @private
46
+ class GeneratedAttribute
47
+ def input_type
48
+ @input_type ||= if type == :text
49
+ "textarea"
50
+ else
51
+ "input"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ module RSpec
2
+ module Rails
3
+ # Fake class to document RSpec ActiveRecord configuration options. In practice,
4
+ # these are dynamically added to the normal RSpec configuration object.
5
+ class ActiveRecordConfiguration
6
+ # @private
7
+ def self.initialize_activerecord_configuration(config)
8
+ config.before :suite do
9
+ # This allows dynamic columns etc to be used on ActiveRecord models when creating instance_doubles
10
+ if defined?(ActiveRecord) && defined?(ActiveRecord::Base) && defined?(::RSpec::Mocks) && (::RSpec::Mocks.respond_to?(:configuration))
11
+ ::RSpec::Mocks.configuration.when_declaring_verifying_double do |possible_model|
12
+ target = possible_model.target
13
+
14
+ if Class === target && ActiveRecord::Base > target && !target.abstract_class?
15
+ target.define_attribute_methods
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ initialize_activerecord_configuration RSpec.configuration
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,196 @@
1
+ require 'delegate'
2
+ require 'active_support'
3
+ require 'active_support/concern'
4
+ require 'active_support/core_ext/string'
5
+
6
+ module RSpec
7
+ module Rails
8
+ # @private
9
+ def self.disable_testunit_autorun
10
+ # `Test::Unit::AutoRunner.need_auto_run=` was introduced to the test-unit
11
+ # gem in version 2.4.9. Previous to this version `Test::Unit.run=` was
12
+ # used. The implementation of test-unit included with Ruby has neither
13
+ # method.
14
+ if defined?(Test::Unit::AutoRunner.need_auto_run = ())
15
+ Test::Unit::AutoRunner.need_auto_run = false
16
+ elsif defined?(Test::Unit.run = ())
17
+ Test::Unit.run = false
18
+ end
19
+ end
20
+ private_class_method :disable_testunit_autorun
21
+
22
+ if defined?(Kernel.gem)
23
+ gem 'minitest'
24
+ else
25
+ require 'minitest'
26
+ end
27
+ require 'minitest/assertions'
28
+ # Constant aliased to either Minitest or TestUnit, depending on what is
29
+ # loaded.
30
+ Assertions = Minitest::Assertions
31
+
32
+ # @private
33
+ class AssertionDelegator < Module
34
+ def initialize(*assertion_modules)
35
+ assertion_class = Class.new(SimpleDelegator) do
36
+ include ::RSpec::Rails::Assertions
37
+ include ::RSpec::Rails::MinitestCounters
38
+ assertion_modules.each { |mod| include mod }
39
+ end
40
+
41
+ super() do
42
+ define_method :build_assertion_instance do
43
+ assertion_class.new(self)
44
+ end
45
+
46
+ def assertion_instance
47
+ @assertion_instance ||= build_assertion_instance
48
+ end
49
+
50
+ assertion_modules.each do |mod|
51
+ mod.public_instance_methods.each do |method|
52
+ next if method == :method_missing || method == "method_missing"
53
+
54
+ define_method(method.to_sym) do |*args, &block|
55
+ assertion_instance.send(method.to_sym, *args, &block)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ # Adapts example groups for `Minitest::Test::LifecycleHooks`
64
+ #
65
+ # @private
66
+ module MinitestLifecycleAdapter
67
+ extend ActiveSupport::Concern
68
+
69
+ included do |group|
70
+ group.before { after_setup }
71
+ group.after { before_teardown }
72
+
73
+ group.around do |example|
74
+ before_setup
75
+ example.run
76
+ after_teardown
77
+ end
78
+ end
79
+
80
+ def before_setup
81
+ end
82
+
83
+ def after_setup
84
+ end
85
+
86
+ def before_teardown
87
+ end
88
+
89
+ def after_teardown
90
+ end
91
+ end
92
+
93
+ # @private
94
+ module MinitestCounters
95
+ attr_writer :assertions
96
+ def assertions
97
+ @assertions ||= 0
98
+ end
99
+ end
100
+
101
+ # @private
102
+ module SetupAndTeardownAdapter
103
+ extend ActiveSupport::Concern
104
+
105
+ module ClassMethods
106
+ # Wraps `setup` calls from within Rails' testing framework in `before`
107
+ # hooks.
108
+ def setup(*methods, &block)
109
+ methods.each do |method|
110
+ if method.to_s =~ /^setup_(with_controller|fixtures|controller_request_and_response)$/
111
+ prepend_before { __send__ method }
112
+ else
113
+ before { __send__ method }
114
+ end
115
+ end
116
+ before(&block) if block
117
+ end
118
+
119
+ # @api private
120
+ #
121
+ # Wraps `teardown` calls from within Rails' testing framework in
122
+ # `after` hooks.
123
+ def teardown(*methods, &block)
124
+ methods.each { |method| after { __send__ method } }
125
+ after(&block) if block
126
+ end
127
+ end
128
+
129
+ def initialize(*args)
130
+ super
131
+ @example = nil
132
+ end
133
+
134
+ def method_name
135
+ @example
136
+ end
137
+ end
138
+
139
+ # @private
140
+ module MinitestAssertionAdapter
141
+ extend ActiveSupport::Concern
142
+
143
+ # @private
144
+ module ClassMethods
145
+ # Returns the names of assertion methods that we want to expose to
146
+ # examples without exposing non-assertion methods in Test::Unit or
147
+ # Minitest.
148
+ def assertion_method_names
149
+ ::RSpec::Rails::Assertions
150
+ .public_instance_methods
151
+ .select do |m|
152
+ m.to_s =~ /^(assert|flunk|refute)/
153
+ end
154
+ end
155
+
156
+ def define_assertion_delegators
157
+ assertion_method_names.each do |m|
158
+ define_method(m.to_sym) do |*args, &block|
159
+ assertion_delegator.send(m.to_sym, *args, &block)
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ class AssertionDelegator
166
+ include ::RSpec::Rails::Assertions
167
+ include ::RSpec::Rails::MinitestCounters
168
+ end
169
+
170
+ def assertion_delegator
171
+ @assertion_delegator ||= AssertionDelegator.new
172
+ end
173
+
174
+ included do
175
+ define_assertion_delegators
176
+ end
177
+ end
178
+
179
+ # Backwards compatibility. It's unlikely that anyone is using this
180
+ # constant, but we had forgotten to mark it as `@private` earlier
181
+ #
182
+ # @private
183
+ TestUnitAssertionAdapter = MinitestAssertionAdapter
184
+
185
+ # @private
186
+ module TaggedLoggingAdapter
187
+ private
188
+ # Vendored from activesupport/lib/active_support/testing/tagged_logging.rb
189
+ # This implements the tagged_logger method where it is expected, but
190
+ # doesn't call `name` or set it up like Rails does.
191
+ def tagged_logger
192
+ @tagged_logger ||= (defined?(Rails.logger) && Rails.logger)
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,222 @@
1
+ # rubocop: disable Metrics/ModuleLength
2
+ module RSpec
3
+ module Rails
4
+ # Fake class to document RSpec Rails configuration options. In practice,
5
+ # these are dynamically added to the normal RSpec configuration object.
6
+ class Configuration
7
+ # @!method infer_spec_type_from_file_location!
8
+ # Automatically tag specs in conventional directories with matching `type`
9
+ # metadata so that they have relevant helpers available to them. See
10
+ # `RSpec::Rails::DIRECTORY_MAPPINGS` for details on which metadata is
11
+ # applied to each directory.
12
+
13
+ # @!method render_views=(val)
14
+ #
15
+ # When set to `true`, controller specs will render the relevant view as
16
+ # well. Defaults to `false`.
17
+
18
+ # @!method render_views(val)
19
+ # Enables view rendering for controllers specs.
20
+
21
+ # @!method render_views?
22
+ # Reader for currently value of `render_views` setting.
23
+ end
24
+
25
+ # Mappings used by `infer_spec_type_from_file_location!`.
26
+ #
27
+ # @api private
28
+ DIRECTORY_MAPPINGS = {
29
+ channel: %w[spec channels],
30
+ controller: %w[spec controllers],
31
+ generator: %w[spec generator],
32
+ helper: %w[spec helpers],
33
+ job: %w[spec jobs],
34
+ mailer: %w[spec mailers],
35
+ model: %w[spec models],
36
+ request: %w[spec (requests|integration|api)],
37
+ routing: %w[spec routing],
38
+ view: %w[spec views],
39
+ feature: %w[spec features],
40
+ system: %w[spec system],
41
+ mailbox: %w[spec mailboxes]
42
+ }
43
+
44
+ # Sets up the different example group modules for the different spec types
45
+ #
46
+ # @api private
47
+ def self.add_test_type_configurations(config)
48
+ config.include RSpec::Rails::ControllerExampleGroup, type: :controller
49
+ config.include RSpec::Rails::HelperExampleGroup, type: :helper
50
+ config.include RSpec::Rails::ModelExampleGroup, type: :model
51
+ config.include RSpec::Rails::RequestExampleGroup, type: :request
52
+ config.include RSpec::Rails::RoutingExampleGroup, type: :routing
53
+ config.include RSpec::Rails::ViewExampleGroup, type: :view
54
+ config.include RSpec::Rails::FeatureExampleGroup, type: :feature
55
+ config.include RSpec::Rails::Matchers
56
+ config.include RSpec::Rails::SystemExampleGroup, type: :system
57
+ end
58
+
59
+ # @private
60
+ def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/PerceivedComplexity
61
+ config.backtrace_exclusion_patterns << /vendor\//
62
+ config.backtrace_exclusion_patterns << %r{lib/rspec/rails}
63
+
64
+ # controller settings
65
+ config.add_setting :infer_base_class_for_anonymous_controllers, default: true
66
+
67
+ # fixture support
68
+ config.add_setting :use_active_record, default: true
69
+ config.add_setting :use_transactional_fixtures, alias_with: :use_transactional_examples
70
+ config.add_setting :use_instantiated_fixtures
71
+ config.add_setting :global_fixtures
72
+
73
+ if ::Rails::VERSION::STRING < "7.1.0"
74
+ config.add_setting :fixture_path
75
+ else
76
+ config.add_setting :fixture_paths
77
+ end
78
+
79
+ config.include RSpec::Rails::FixtureSupport, :use_fixtures
80
+
81
+ # We'll need to create a deprecated module in order to properly report to
82
+ # gems / projects which are relying on this being loaded globally.
83
+ #
84
+ # See rspec/rspec-rails#1355 for history
85
+ #
86
+ # @deprecated Include `RSpec::Rails::RailsExampleGroup` or
87
+ # `RSpec::Rails::FixtureSupport` directly instead
88
+ config.include RSpec::Rails::FixtureSupport
89
+
90
+ config.add_setting :file_fixture_path, default: 'spec/fixtures/files'
91
+ config.include RSpec::Rails::FileFixtureSupport
92
+
93
+ # Add support for fixture_path on fixture_file_upload
94
+ config.include RSpec::Rails::FixtureFileUploadSupport
95
+
96
+ # This allows us to expose `render_views` as a config option even though it
97
+ # breaks the convention of other options by using `render_views` as a
98
+ # command (i.e. `render_views = true`), where it would normally be used
99
+ # as a getter. This makes it easier for rspec-rails users because we use
100
+ # `render_views` directly in example groups, so this aligns the two APIs,
101
+ # but requires this workaround:
102
+ config.add_setting :rendering_views, default: false
103
+
104
+ config.instance_exec do
105
+ def render_views=(val)
106
+ self.rendering_views = val
107
+ end
108
+
109
+ def render_views
110
+ self.rendering_views = true
111
+ end
112
+
113
+ def render_views?
114
+ rendering_views?
115
+ end
116
+
117
+ undef :rendering_views? if respond_to?(:rendering_views?)
118
+ def rendering_views?
119
+ !!rendering_views
120
+ end
121
+
122
+ # Define boolean predicates rather than relying on rspec-core due
123
+ # to the bug fix in rspec/rspec-core#2736, note some of these
124
+ # predicates are a bit nonsensical, but they exist for backwards
125
+ # compatibility, we can tidy these up in `rspec-rails` 5.
126
+ undef :fixture_path? if respond_to?(:fixture_path?)
127
+ def fixture_path?
128
+ !!fixture_path
129
+ end
130
+
131
+ undef :global_fixtures? if respond_to?(:global_fixtures?)
132
+ def global_fixtures?
133
+ !!global_fixtures
134
+ end
135
+
136
+ undef :infer_base_class_for_anonymous_controllers? if respond_to?(:infer_base_class_for_anonymous_controllers?)
137
+ def infer_base_class_for_anonymous_controllers?
138
+ !!infer_base_class_for_anonymous_controllers
139
+ end
140
+
141
+ undef :use_instantiated_fixtures? if respond_to?(:use_instantiated_fixtures?)
142
+ def use_instantiated_fixtures?
143
+ !!use_instantiated_fixtures
144
+ end
145
+
146
+ undef :use_transactional_fixtures? if respond_to?(:use_transactional_fixtures?)
147
+ def use_transactional_fixtures?
148
+ !!use_transactional_fixtures
149
+ end
150
+
151
+ def infer_spec_type_from_file_location!
152
+ DIRECTORY_MAPPINGS.each do |type, dir_parts|
153
+ escaped_path = Regexp.compile(dir_parts.join('[\\\/]') + '[\\\/]')
154
+ define_derived_metadata(file_path: escaped_path) do |metadata|
155
+ metadata[:type] ||= type
156
+ end
157
+ end
158
+ end
159
+
160
+ # Adds exclusion filters for gems included with Rails
161
+ def filter_rails_from_backtrace!
162
+ filter_gems_from_backtrace "actionmailer", "actionpack", "actionview"
163
+ filter_gems_from_backtrace "activemodel", "activerecord",
164
+ "activesupport", "activejob"
165
+ end
166
+
167
+ # @deprecated TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2
168
+ if ::Rails::VERSION::STRING >= "7.1.0"
169
+ def fixture_path
170
+ RSpec.deprecate(
171
+ "config.fixture_path",
172
+ replacement: "config.fixture_paths",
173
+ message: "Rails 7.1 has deprecated the singular fixture_path in favour of an array." \
174
+ "You should migrate to plural:"
175
+ )
176
+ fixture_paths&.first
177
+ end
178
+
179
+ def fixture_path=(path)
180
+ RSpec.deprecate(
181
+ "config.fixture_path = #{path.inspect}",
182
+ replacement: "config.fixture_paths = [#{path.inspect}]",
183
+ message: "Rails 7.1 has deprecated the singular fixture_path in favour of an array." \
184
+ "You should migrate to plural:"
185
+ )
186
+ self.fixture_paths = Array(path)
187
+ end
188
+ end
189
+ end
190
+
191
+ add_test_type_configurations(config)
192
+
193
+ if defined?(::Rails::Controller::Testing)
194
+ [:controller, :view, :request].each do |type|
195
+ config.include ::Rails::Controller::Testing::TestProcess, type: type
196
+ config.include ::Rails::Controller::Testing::TemplateAssertions, type: type
197
+ config.include ::Rails::Controller::Testing::Integration, type: type
198
+ end
199
+ end
200
+
201
+ if RSpec::Rails::FeatureCheck.has_action_mailer?
202
+ config.include RSpec::Rails::MailerExampleGroup, type: :mailer
203
+ config.after { ActionMailer::Base.deliveries.clear }
204
+ end
205
+
206
+ if RSpec::Rails::FeatureCheck.has_active_job?
207
+ config.include RSpec::Rails::JobExampleGroup, type: :job
208
+ end
209
+
210
+ if RSpec::Rails::FeatureCheck.has_action_cable_testing?
211
+ config.include RSpec::Rails::ChannelExampleGroup, type: :channel
212
+ end
213
+
214
+ if RSpec::Rails::FeatureCheck.has_action_mailbox?
215
+ config.include RSpec::Rails::MailboxExampleGroup, type: :mailbox
216
+ end
217
+ end
218
+
219
+ initialize_configuration RSpec.configuration
220
+ end
221
+ end
222
+ # rubocop: enable Metrics/ModuleLength
@@ -0,0 +1,93 @@
1
+ require "rspec/rails/matchers/action_cable/have_streams"
2
+
3
+ module RSpec
4
+ module Rails
5
+ # @api public
6
+ # Container module for channel spec functionality. It is only available if
7
+ # ActionCable has been loaded before it.
8
+ module ChannelExampleGroup
9
+ # @private
10
+ module ClassMethods
11
+ # These blank modules are only necessary for YARD processing. It doesn't
12
+ # handle the conditional check below very well and reports undocumented objects.
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ if RSpec::Rails::FeatureCheck.has_action_cable_testing?
19
+ module RSpec
20
+ module Rails
21
+ # @api public
22
+ # Container module for channel spec functionality.
23
+ module ChannelExampleGroup
24
+ extend ActiveSupport::Concern
25
+ include RSpec::Rails::RailsExampleGroup
26
+ include ActionCable::Connection::TestCase::Behavior
27
+ include ActionCable::Channel::TestCase::Behavior
28
+
29
+ # Class-level DSL for channel specs.
30
+ module ClassMethods
31
+ # @private
32
+ def channel_class
33
+ (_channel_class || described_class).tap do |klass|
34
+ next if klass <= ::ActionCable::Channel::Base
35
+
36
+ raise "Described class is not a channel class.\n" \
37
+ "Specify the channel class in the `describe` statement " \
38
+ "or set it manually using `tests MyChannelClass`"
39
+ end
40
+ end
41
+
42
+ # @private
43
+ def connection_class
44
+ (_connection_class || described_class).tap do |klass|
45
+ next if klass <= ::ActionCable::Connection::Base
46
+
47
+ raise "Described class is not a connection class.\n" \
48
+ "Specify the connection class in the `describe` statement " \
49
+ "or set it manually using `tests MyConnectionClass`"
50
+ end
51
+ end
52
+ end
53
+
54
+ # Checks that the connection attempt has been rejected.
55
+ #
56
+ # @example
57
+ # expect { connect }.to have_rejected_connection
58
+ def have_rejected_connection
59
+ raise_error(::ActionCable::Connection::Authorization::UnauthorizedError)
60
+ end
61
+
62
+ # Checks that the subscription is subscribed to at least one stream.
63
+ #
64
+ # @example
65
+ # expect(subscription).to have_streams
66
+ def have_streams
67
+ check_subscribed!
68
+
69
+ RSpec::Rails::Matchers::ActionCable::HaveStream.new
70
+ end
71
+
72
+ # Checks that the channel has been subscribed to the given stream
73
+ #
74
+ # @example
75
+ # expect(subscription).to have_stream_from("chat_1")
76
+ def have_stream_from(stream)
77
+ check_subscribed!
78
+
79
+ RSpec::Rails::Matchers::ActionCable::HaveStream.new(stream)
80
+ end
81
+
82
+ # Checks that the channel has been subscribed to a stream for the given model
83
+ #
84
+ # @example
85
+ # expect(subscription).to have_stream_for(user)
86
+ def have_stream_for(object)
87
+ check_subscribed!
88
+ RSpec::Rails::Matchers::ActionCable::HaveStream.new(broadcasting_for(object))
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end