rspec-rails 2.14.2 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.document +1 -1
  4. data/.yardopts +4 -2
  5. data/Capybara.md +6 -57
  6. data/Changelog.md +715 -37
  7. data/{License.txt → LICENSE.md} +5 -2
  8. data/README.md +287 -362
  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 +23 -5
  12. data/lib/generators/rspec/controller/templates/controller_spec.rb +5 -5
  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 +2 -2
  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 +6 -0
  21. data/lib/generators/rspec/helper/helper_generator.rb +2 -1
  22. data/lib/generators/rspec/helper/templates/helper_spec.rb +2 -2
  23. data/lib/generators/rspec/install/install_generator.rb +44 -5
  24. data/lib/generators/rspec/install/templates/spec/rails_helper.rb +79 -0
  25. data/lib/generators/rspec/integration/integration_generator.rb +8 -13
  26. data/lib/generators/rspec/integration/templates/request_spec.rb +4 -9
  27. data/lib/generators/rspec/job/job_generator.rb +12 -0
  28. data/lib/generators/rspec/{observer/templates/observer_spec.rb → job/templates/job_spec.rb.erb} +2 -2
  29. data/lib/generators/rspec/mailbox/mailbox_generator.rb +14 -0
  30. data/lib/generators/rspec/mailbox/templates/mailbox_spec.rb.erb +7 -0
  31. data/lib/generators/rspec/mailer/mailer_generator.rb +9 -1
  32. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +7 -7
  33. data/lib/generators/rspec/mailer/templates/preview.rb +13 -0
  34. data/lib/generators/rspec/model/model_generator.rb +21 -6
  35. data/lib/generators/rspec/model/templates/fixtures.yml +1 -1
  36. data/lib/generators/rspec/model/templates/model_spec.rb +2 -2
  37. data/lib/generators/rspec/request/request_generator.rb +10 -0
  38. data/lib/generators/rspec/scaffold/scaffold_generator.rb +88 -148
  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 +105 -80
  42. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +10 -14
  43. data/lib/generators/rspec/scaffold/templates/index_spec.rb +5 -12
  44. data/lib/generators/rspec/scaffold/templates/new_spec.rb +11 -15
  45. data/lib/generators/rspec/scaffold/templates/request_spec.rb +137 -0
  46. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +19 -12
  47. data/lib/generators/rspec/scaffold/templates/show_spec.rb +5 -12
  48. data/lib/generators/rspec/system/system_generator.rb +26 -0
  49. data/lib/generators/rspec/system/templates/system_spec.rb +9 -0
  50. data/lib/generators/rspec/view/templates/view_spec.rb +2 -2
  51. data/lib/generators/rspec/view/view_generator.rb +3 -2
  52. data/lib/generators/rspec.rb +18 -10
  53. data/lib/rspec/rails/active_record.rb +25 -0
  54. data/lib/rspec/rails/adapters.rb +49 -47
  55. data/lib/rspec/rails/configuration.rb +194 -0
  56. data/lib/rspec/rails/example/channel_example_group.rb +93 -0
  57. data/lib/rspec/rails/example/controller_example_group.rb +188 -138
  58. data/lib/rspec/rails/example/feature_example_group.rb +43 -20
  59. data/lib/rspec/rails/example/helper_example_group.rb +28 -26
  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 +30 -14
  63. data/lib/rspec/rails/example/model_example_group.rb +8 -7
  64. data/lib/rspec/rails/example/rails_example_group.rb +4 -2
  65. data/lib/rspec/rails/example/request_example_group.rb +23 -16
  66. data/lib/rspec/rails/example/routing_example_group.rb +49 -40
  67. data/lib/rspec/rails/example/system_example_group.rb +125 -0
  68. data/lib/rspec/rails/example/view_example_group.rb +178 -134
  69. data/lib/rspec/rails/example.rb +4 -33
  70. data/lib/rspec/rails/extensions/active_record/proxy.rb +5 -11
  71. data/lib/rspec/rails/extensions.rb +0 -1
  72. data/lib/rspec/rails/feature_check.rb +47 -0
  73. data/lib/rspec/rails/file_fixture_support.rb +17 -0
  74. data/lib/rspec/rails/fixture_file_upload_support.rb +35 -0
  75. data/lib/rspec/rails/fixture_support.rb +54 -23
  76. data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +170 -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 +64 -0
  80. data/lib/rspec/rails/matchers/active_job.rb +465 -0
  81. data/lib/rspec/rails/matchers/base_matcher.rb +179 -0
  82. data/lib/rspec/rails/matchers/be_a_new.rb +69 -62
  83. data/lib/rspec/rails/matchers/be_new_record.rb +24 -21
  84. data/lib/rspec/rails/matchers/be_valid.rb +42 -33
  85. data/lib/rspec/rails/matchers/have_enqueued_mail.rb +198 -0
  86. data/lib/rspec/rails/matchers/have_http_status.rb +385 -0
  87. data/lib/rspec/rails/matchers/have_rendered.rb +55 -31
  88. data/lib/rspec/rails/matchers/redirect_to.rb +30 -29
  89. data/lib/rspec/rails/matchers/relation_match_array.rb +2 -2
  90. data/lib/rspec/rails/matchers/routing_matchers.rb +107 -93
  91. data/lib/rspec/rails/matchers.rb +22 -14
  92. data/lib/rspec/rails/tasks/rspec.rake +8 -18
  93. data/lib/rspec/rails/vendor/capybara.rb +12 -11
  94. data/lib/rspec/rails/version.rb +3 -1
  95. data/lib/rspec/rails/view_assigns.rb +18 -18
  96. data/lib/rspec/rails/view_path_builder.rb +29 -0
  97. data/lib/rspec/rails/view_rendering.rb +100 -63
  98. data/lib/rspec/rails/view_spec_methods.rb +56 -0
  99. data/lib/rspec/rails.rb +10 -10
  100. data/lib/rspec-rails.rb +67 -3
  101. data.tar.gz.sig +0 -0
  102. metadata +121 -94
  103. metadata.gz.sig +0 -0
  104. data/lib/autotest/rails_rspec2.rb +0 -85
  105. data/lib/generators/rspec/install/templates/.rspec +0 -1
  106. data/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt +0 -49
  107. data/lib/generators/rspec/observer/observer_generator.rb +0 -12
  108. data/lib/rspec/rails/extensions/active_record/base.rb +0 -58
  109. data/lib/rspec/rails/matchers/have_extension.rb +0 -36
  110. data/lib/rspec/rails/mocks.rb +0 -274
  111. data/lib/rspec/rails/module_inclusion.rb +0 -19
  112. data/lib/rspec/rails/vendor/webrat.rb +0 -33
@@ -1,5 +1,5 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
- describe "<%= file_path %>/<%= @action %>" do
3
+ RSpec.describe "<%= file_path %>/<%= @action %>", <%= type_metatag(:view) %> do
4
4
  pending "add some examples to (or delete) #{__FILE__}"
5
5
  end
@@ -2,10 +2,11 @@ require 'generators/rspec'
2
2
 
3
3
  module Rspec
4
4
  module Generators
5
+ # @private
5
6
  class ViewGenerator < Base
6
- argument :actions, :type => :array, :default => [], :banner => "action action"
7
+ argument :actions, type: :array, default: [], banner: "action action"
7
8
 
8
- class_option :template_engine, :desc => "Template engine to generate view files"
9
+ class_option :template_engine, desc: "Template engine to generate view files"
9
10
 
10
11
  def create_view_specs
11
12
  empty_directory File.join("spec", "views", file_path)
@@ -1,30 +1,38 @@
1
1
  require 'rails/generators/named_base'
2
+ require 'rspec/rails/feature_check'
2
3
 
4
+ # @private
5
+ # Weirdly named generators namespace (should be `RSpec`) for compatability with
6
+ # rails loading.
3
7
  module Rspec
8
+ # @private
4
9
  module Generators
10
+ # @private
5
11
  class Base < ::Rails::Generators::NamedBase
6
- def self.source_root
7
- @_rspec_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'rspec', generator_name, 'templates'))
8
- end
12
+ include RSpec::Rails::FeatureCheck
9
13
 
10
- if ::Rails::VERSION::STRING < '3.1'
11
- def module_namespacing
12
- yield if block_given?
14
+ def self.source_root(path = nil)
15
+ if path
16
+ @_rspec_source_root = path
17
+ else
18
+ @_rspec_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'rspec', generator_name, 'templates'))
13
19
  end
14
20
  end
15
21
  end
16
22
  end
17
23
  end
18
24
 
25
+ # @private
19
26
  module Rails
20
27
  module Generators
28
+ # @private
21
29
  class GeneratedAttribute
22
30
  def input_type
23
31
  @input_type ||= if type == :text
24
- "textarea"
25
- else
26
- "input"
27
- end
32
+ "textarea"
33
+ else
34
+ "input"
35
+ end
28
36
  end
29
37
  end
30
38
  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
@@ -1,27 +1,36 @@
1
1
  require 'delegate'
2
2
  require 'active_support'
3
3
  require 'active_support/concern'
4
+ require 'active_support/core_ext/string'
4
5
 
5
6
  module RSpec
6
7
  module Rails
7
- if ::Rails::VERSION::STRING >= '4.1.0'
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)
8
23
  gem 'minitest'
9
- require 'minitest/assertions'
10
- Assertions = Minitest::Assertions
11
24
  else
12
- begin
13
- require 'test/unit/assertions'
14
- rescue LoadError
15
- # work around for Rubinius not having a std std-lib
16
- require 'rubysl-test-unit' if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
17
- require 'test/unit/assertions'
18
- end
19
- Assertions = Test::Unit::Assertions
25
+ require 'minitest'
20
26
  end
27
+ require 'minitest/assertions'
28
+ # Constant aliased to either Minitest or TestUnit, depending on what is
29
+ # loaded.
30
+ Assertions = Minitest::Assertions
21
31
 
22
- # @api private
32
+ # @private
23
33
  class AssertionDelegator < Module
24
- # @api private
25
34
  def initialize(*assertion_modules)
26
35
  assertion_class = Class.new(SimpleDelegator) do
27
36
  include ::RSpec::Rails::Assertions
@@ -30,12 +39,10 @@ module RSpec
30
39
  end
31
40
 
32
41
  super() do
33
- # @api private
34
42
  define_method :build_assertion_instance do
35
43
  assertion_class.new(self)
36
44
  end
37
45
 
38
- # @api private
39
46
  def assertion_instance
40
47
  @assertion_instance ||= build_assertion_instance
41
48
  end
@@ -43,11 +50,10 @@ module RSpec
43
50
  assertion_modules.each do |mod|
44
51
  mod.public_instance_methods.each do |method|
45
52
  next if method == :method_missing || method == "method_missing"
46
- class_eval <<-EOM, __FILE__, __LINE__ + 1
47
- def #{method}(*args, &block)
48
- assertion_instance.send(:#{method}, *args, &block)
49
- end
50
- EOM
53
+
54
+ define_method(method.to_sym) do |*args, &block|
55
+ assertion_instance.send(method.to_sym, *args, &block)
56
+ end
51
57
  end
52
58
  end
53
59
  end
@@ -56,7 +62,7 @@ module RSpec
56
62
 
57
63
  # Adapts example groups for `Minitest::Test::LifecycleHooks`
58
64
  #
59
- # @api private
65
+ # @private
60
66
  module MinitestLifecycleAdapter
61
67
  extend ActiveSupport::Concern
62
68
 
@@ -84,29 +90,22 @@ module RSpec
84
90
  end
85
91
  end
86
92
 
87
- # @api private
93
+ # @private
88
94
  module MinitestCounters
89
- # @api private
95
+ attr_writer :assertions
90
96
  def assertions
91
97
  @assertions ||= 0
92
98
  end
93
-
94
- # @api private
95
- def assertions=(assertions)
96
- @assertions = assertions
97
- end
98
99
  end
99
100
 
100
- # @api private
101
+ # @private
101
102
  module SetupAndTeardownAdapter
102
103
  extend ActiveSupport::Concern
103
104
 
104
105
  module ClassMethods
105
- # @api private
106
- #
107
106
  # Wraps `setup` calls from within Rails' testing framework in `before`
108
107
  # hooks.
109
- def setup(*methods)
108
+ def setup(*methods, &block)
110
109
  methods.each do |method|
111
110
  if method.to_s =~ /^setup_(with_controller|fixtures|controller_request_and_response)$/
112
111
  prepend_before { __send__ method }
@@ -114,18 +113,24 @@ module RSpec
114
113
  before { __send__ method }
115
114
  end
116
115
  end
116
+ before(&block) if block
117
117
  end
118
118
 
119
119
  # @api private
120
120
  #
121
121
  # Wraps `teardown` calls from within Rails' testing framework in
122
122
  # `after` hooks.
123
- def teardown(*methods)
123
+ def teardown(*methods, &block)
124
124
  methods.each { |method| after { __send__ method } }
125
+ after(&block) if block
125
126
  end
126
127
  end
127
128
 
128
- # @api private
129
+ def initialize(*args)
130
+ super
131
+ @example = nil
132
+ end
133
+
129
134
  def method_name
130
135
  @example
131
136
  end
@@ -135,36 +140,33 @@ module RSpec
135
140
  module MinitestAssertionAdapter
136
141
  extend ActiveSupport::Concern
137
142
 
143
+ # @private
138
144
  module ClassMethods
139
- # @api private
140
- #
141
145
  # Returns the names of assertion methods that we want to expose to
142
146
  # examples without exposing non-assertion methods in Test::Unit or
143
147
  # Minitest.
144
148
  def assertion_method_names
145
- ::RSpec::Rails::Assertions.public_instance_methods.select{|m| m.to_s =~ /^(assert|flunk|refute)/} +
146
- [:build_message]
149
+ ::RSpec::Rails::Assertions
150
+ .public_instance_methods
151
+ .select do |m|
152
+ m.to_s =~ /^(assert|flunk|refute)/
153
+ end
147
154
  end
148
155
 
149
- # @api private
150
156
  def define_assertion_delegators
151
157
  assertion_method_names.each do |m|
152
- class_eval <<-CODE, __FILE__, __LINE__ + 1
153
- def #{m}(*args, &block)
154
- assertion_delegator.send :#{m}, *args, &block
155
- end
156
- CODE
158
+ define_method(m.to_sym) do |*args, &block|
159
+ assertion_delegator.send(m.to_sym, *args, &block)
160
+ end
157
161
  end
158
162
  end
159
163
  end
160
164
 
161
- # @api private
162
165
  class AssertionDelegator
163
166
  include ::RSpec::Rails::Assertions
164
167
  include ::RSpec::Rails::MinitestCounters
165
168
  end
166
169
 
167
- # @api private
168
170
  def assertion_delegator
169
171
  @assertion_delegator ||= AssertionDelegator.new
170
172
  end
@@ -177,7 +179,7 @@ module RSpec
177
179
  # Backwards compatibility. It's unlikely that anyone is using this
178
180
  # constant, but we had forgotten to mark it as `@private` earlier
179
181
  #
180
- # @api private
182
+ # @private
181
183
  TestUnitAssertionAdapter = MinitestAssertionAdapter
182
184
  end
183
185
  end
@@ -0,0 +1,194 @@
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
+ helper: %w[spec helpers],
32
+ job: %w[spec jobs],
33
+ mailer: %w[spec mailers],
34
+ model: %w[spec models],
35
+ request: %w[spec (requests|integration|api)],
36
+ routing: %w[spec routing],
37
+ view: %w[spec views],
38
+ feature: %w[spec features],
39
+ system: %w[spec system],
40
+ mailbox: %w[spec mailboxes]
41
+ }
42
+
43
+ # Sets up the different example group modules for the different spec types
44
+ #
45
+ # @api private
46
+ def self.add_test_type_configurations(config)
47
+ config.include RSpec::Rails::ControllerExampleGroup, type: :controller
48
+ config.include RSpec::Rails::HelperExampleGroup, type: :helper
49
+ config.include RSpec::Rails::ModelExampleGroup, type: :model
50
+ config.include RSpec::Rails::RequestExampleGroup, type: :request
51
+ config.include RSpec::Rails::RoutingExampleGroup, type: :routing
52
+ config.include RSpec::Rails::ViewExampleGroup, type: :view
53
+ config.include RSpec::Rails::FeatureExampleGroup, type: :feature
54
+ config.include RSpec::Rails::Matchers
55
+ config.include RSpec::Rails::SystemExampleGroup, type: :system
56
+ end
57
+
58
+ # @private
59
+ def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity
60
+ config.backtrace_exclusion_patterns << /vendor\//
61
+ config.backtrace_exclusion_patterns << %r{lib/rspec/rails}
62
+
63
+ # controller settings
64
+ config.add_setting :infer_base_class_for_anonymous_controllers, default: true
65
+
66
+ # fixture support
67
+ config.add_setting :use_active_record, default: true
68
+ config.add_setting :use_transactional_fixtures, alias_with: :use_transactional_examples
69
+ config.add_setting :use_instantiated_fixtures
70
+ config.add_setting :global_fixtures
71
+ config.add_setting :fixture_path
72
+ config.include RSpec::Rails::FixtureSupport, :use_fixtures
73
+
74
+ # We'll need to create a deprecated module in order to properly report to
75
+ # gems / projects which are relying on this being loaded globally.
76
+ #
77
+ # See rspec/rspec-rails#1355 for history
78
+ #
79
+ # @deprecated Include `RSpec::Rails::RailsExampleGroup` or
80
+ # `RSpec::Rails::FixtureSupport` directly instead
81
+ config.include RSpec::Rails::FixtureSupport
82
+
83
+ if ::Rails::VERSION::STRING > '5'
84
+ config.add_setting :file_fixture_path, default: 'spec/fixtures/files'
85
+ config.include RSpec::Rails::FileFixtureSupport
86
+ end
87
+
88
+ # Add support for fixture_path on fixture_file_upload
89
+ config.include RSpec::Rails::FixtureFileUploadSupport
90
+
91
+ # This allows us to expose `render_views` as a config option even though it
92
+ # breaks the convention of other options by using `render_views` as a
93
+ # command (i.e. `render_views = true`), where it would normally be used
94
+ # as a getter. This makes it easier for rspec-rails users because we use
95
+ # `render_views` directly in example groups, so this aligns the two APIs,
96
+ # but requires this workaround:
97
+ config.add_setting :rendering_views, default: false
98
+
99
+ config.instance_exec do
100
+ def render_views=(val)
101
+ self.rendering_views = val
102
+ end
103
+
104
+ def render_views
105
+ self.rendering_views = true
106
+ end
107
+
108
+ def render_views?
109
+ rendering_views?
110
+ end
111
+
112
+ undef :rendering_views? if respond_to?(:rendering_views?)
113
+ def rendering_views?
114
+ !!rendering_views
115
+ end
116
+
117
+ # Define boolean predicates rather than relying on rspec-core due
118
+ # to the bug fix in rspec/rspec-core#2736, note some of these
119
+ # predicates are a bit nonsensical, but they exist for backwards
120
+ # compatibility, we can tidy these up in `rspec-rails` 5.
121
+ undef :fixture_path? if respond_to?(:fixture_path?)
122
+ def fixture_path?
123
+ !!fixture_path
124
+ end
125
+
126
+ undef :global_fixtures? if respond_to?(:global_fixtures?)
127
+ def global_fixtures?
128
+ !!global_fixtures
129
+ end
130
+
131
+ undef :infer_base_class_for_anonymous_controllers? if respond_to?(:infer_base_class_for_anonymous_controllers?)
132
+ def infer_base_class_for_anonymous_controllers?
133
+ !!infer_base_class_for_anonymous_controllers
134
+ end
135
+
136
+ undef :use_instantiated_fixtures? if respond_to?(:use_instantiated_fixtures?)
137
+ def use_instantiated_fixtures?
138
+ !!use_instantiated_fixtures
139
+ end
140
+
141
+ undef :use_transactional_fixtures? if respond_to?(:use_transactional_fixtures?)
142
+ def use_transactional_fixtures?
143
+ !!use_transactional_fixtures
144
+ end
145
+
146
+ def infer_spec_type_from_file_location!
147
+ DIRECTORY_MAPPINGS.each do |type, dir_parts|
148
+ escaped_path = Regexp.compile(dir_parts.join('[\\\/]') + '[\\\/]')
149
+ define_derived_metadata(file_path: escaped_path) do |metadata|
150
+ metadata[:type] ||= type
151
+ end
152
+ end
153
+ end
154
+
155
+ # Adds exclusion filters for gems included with Rails
156
+ def filter_rails_from_backtrace!
157
+ filter_gems_from_backtrace "actionmailer", "actionpack", "actionview"
158
+ filter_gems_from_backtrace "activemodel", "activerecord",
159
+ "activesupport", "activejob"
160
+ end
161
+ end
162
+
163
+ add_test_type_configurations(config)
164
+
165
+ if defined?(::Rails::Controller::Testing)
166
+ [:controller, :view, :request].each do |type|
167
+ config.include ::Rails::Controller::Testing::TestProcess, type: type
168
+ config.include ::Rails::Controller::Testing::TemplateAssertions, type: type
169
+ config.include ::Rails::Controller::Testing::Integration, type: type
170
+ end
171
+ end
172
+
173
+ if RSpec::Rails::FeatureCheck.has_action_mailer?
174
+ config.include RSpec::Rails::MailerExampleGroup, type: :mailer
175
+ config.after { ActionMailer::Base.deliveries.clear }
176
+ end
177
+
178
+ if RSpec::Rails::FeatureCheck.has_active_job?
179
+ config.include RSpec::Rails::JobExampleGroup, type: :job
180
+ end
181
+
182
+ if RSpec::Rails::FeatureCheck.has_action_cable_testing?
183
+ config.include RSpec::Rails::ChannelExampleGroup, type: :channel
184
+ end
185
+
186
+ if RSpec::Rails::FeatureCheck.has_action_mailbox?
187
+ config.include RSpec::Rails::MailboxExampleGroup, type: :mailbox
188
+ end
189
+ end
190
+
191
+ initialize_configuration RSpec.configuration
192
+ end
193
+ end
194
+ # 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