rspec-rails 3.9.0 → 4.0.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Capybara.md +5 -54
- data/Changelog.md +156 -78
- data/README.md +8 -7
- data/lib/generators/rspec/channel/channel_generator.rb +12 -0
- data/lib/generators/rspec/{observer/templates/observer_spec.rb → channel/templates/channel_spec.rb.erb} +1 -1
- data/lib/generators/rspec/controller/controller_generator.rb +21 -4
- data/lib/generators/rspec/controller/templates/request_spec.rb +14 -0
- data/lib/generators/rspec/controller/templates/routing_spec.rb +13 -0
- data/lib/generators/rspec/feature/feature_generator.rb +2 -2
- data/lib/generators/rspec/{generators → generator}/generator_generator.rb +2 -2
- data/lib/generators/rspec/{generators → generator}/templates/generator_spec.rb +0 -0
- data/lib/generators/rspec/helper/helper_generator.rb +1 -1
- data/lib/generators/rspec/install/install_generator.rb +4 -4
- data/lib/generators/rspec/install/templates/spec/rails_helper.rb +17 -16
- data/lib/generators/rspec/integration/integration_generator.rb +3 -3
- data/lib/generators/rspec/mailbox/mailbox_generator.rb +14 -0
- data/lib/generators/rspec/mailbox/templates/mailbox_spec.rb.erb +7 -0
- data/lib/generators/rspec/mailer/mailer_generator.rb +2 -1
- data/lib/generators/rspec/model/model_generator.rb +5 -4
- data/lib/generators/rspec/model/templates/fixtures.yml +1 -1
- data/lib/generators/rspec/request/request_generator.rb +1 -1
- data/lib/generators/rspec/scaffold/scaffold_generator.rb +29 -19
- data/lib/generators/rspec/scaffold/templates/api_controller_spec.rb +0 -36
- data/lib/generators/rspec/scaffold/templates/api_request_spec.rb +131 -0
- data/lib/generators/rspec/scaffold/templates/controller_spec.rb +10 -10
- data/lib/generators/rspec/scaffold/templates/edit_spec.rb +1 -1
- data/lib/generators/rspec/scaffold/templates/index_spec.rb +2 -2
- data/lib/generators/rspec/scaffold/templates/new_spec.rb +1 -1
- data/lib/generators/rspec/scaffold/templates/request_spec.rb +133 -0
- data/lib/generators/rspec/scaffold/templates/routing_spec.rb +8 -10
- data/lib/generators/rspec/scaffold/templates/show_spec.rb +1 -1
- data/lib/generators/rspec/system/system_generator.rb +1 -1
- data/lib/generators/rspec/view/view_generator.rb +2 -2
- data/lib/generators/rspec.rb +0 -6
- data/lib/rspec/rails/adapters.rb +11 -76
- data/lib/rspec/rails/configuration.rb +43 -33
- data/lib/rspec/rails/example/channel_example_group.rb +93 -0
- data/lib/rspec/rails/example/controller_example_group.rb +4 -4
- data/lib/rspec/rails/example/feature_example_group.rb +6 -26
- data/lib/rspec/rails/example/helper_example_group.rb +2 -9
- data/lib/rspec/rails/example/mailbox_example_group.rb +80 -0
- data/lib/rspec/rails/example/mailer_example_group.rb +2 -2
- data/lib/rspec/rails/example/rails_example_group.rb +1 -1
- data/lib/rspec/rails/example/system_example_group.rb +26 -10
- data/lib/rspec/rails/example/view_example_group.rb +38 -27
- data/lib/rspec/rails/example.rb +2 -0
- data/lib/rspec/rails/extensions/active_record/proxy.rb +1 -9
- data/lib/rspec/rails/feature_check.rb +12 -29
- data/lib/rspec/rails/fixture_file_upload_support.rb +1 -1
- data/lib/rspec/rails/fixture_support.rb +37 -31
- data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +170 -0
- data/lib/rspec/rails/matchers/action_cable/have_streams.rb +58 -0
- data/lib/rspec/rails/matchers/action_cable.rb +65 -0
- data/lib/rspec/rails/matchers/action_mailbox.rb +64 -0
- data/lib/rspec/rails/matchers/active_job.rb +148 -22
- data/lib/rspec/rails/matchers/base_matcher.rb +5 -10
- data/lib/rspec/rails/matchers/have_enqueued_mail.rb +52 -28
- data/lib/rspec/rails/matchers/have_http_status.rb +11 -7
- data/lib/rspec/rails/matchers/have_rendered.rb +1 -0
- data/lib/rspec/rails/matchers/routing_matchers.rb +12 -12
- data/lib/rspec/rails/matchers.rb +10 -0
- data/lib/rspec/rails/tasks/rspec.rake +7 -17
- data/lib/rspec/rails/vendor/capybara.rb +10 -15
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec/rails/view_path_builder.rb +1 -1
- data/lib/rspec/rails/view_rendering.rb +15 -4
- data/lib/rspec-rails.rb +8 -9
- data.tar.gz.sig +0 -0
- metadata +46 -34
- metadata.gz.sig +0 -0
- data/lib/generators/rspec/observer/observer_generator.rb +0 -13
@@ -1,23 +1,8 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Rails
|
3
3
|
# @private
|
4
|
-
# Disable some cops until https://github.com/bbatsov/rubocop/issues/1310
|
5
|
-
# rubocop:disable Style/IndentationConsistency
|
6
4
|
module FeatureCheck
|
7
|
-
|
8
|
-
module_function
|
9
|
-
# rubocop:enable Style/IndentationWidth
|
10
|
-
|
11
|
-
def can_check_pending_migrations?
|
12
|
-
has_active_record_migration? &&
|
13
|
-
::ActiveRecord::Migration.respond_to?(:check_pending!)
|
14
|
-
end
|
15
|
-
|
16
|
-
def can_maintain_test_schema?
|
17
|
-
has_active_record_migration? &&
|
18
|
-
::ActiveRecord::Migration.respond_to?(:maintain_test_schema!)
|
19
|
-
end
|
20
|
-
|
5
|
+
module_function
|
21
6
|
def has_active_job?
|
22
7
|
defined?(::ActiveJob)
|
23
8
|
end
|
@@ -38,27 +23,25 @@ module RSpec
|
|
38
23
|
has_action_mailer? && defined?(::ActionMailer::Preview)
|
39
24
|
end
|
40
25
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
26
|
+
def has_action_cable_testing?
|
27
|
+
defined?(::ActionCable) && ActionCable::VERSION::MAJOR >= 6
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_action_mailer_parameterized?
|
31
|
+
has_action_mailer? && defined?(::ActionMailer::Parameterized)
|
44
32
|
end
|
45
33
|
|
46
|
-
def
|
47
|
-
::
|
34
|
+
def has_action_mailer_unified_delivery?
|
35
|
+
has_action_mailer? && defined?(::ActionMailer::MailDeliveryJob)
|
48
36
|
end
|
49
37
|
|
50
|
-
def
|
51
|
-
::
|
38
|
+
def has_action_mailbox?
|
39
|
+
defined?(::ActionMailbox)
|
52
40
|
end
|
53
41
|
|
54
42
|
def type_metatag(type)
|
55
|
-
|
56
|
-
"type: :#{type}"
|
57
|
-
else
|
58
|
-
":type => :#{type}"
|
59
|
-
end
|
43
|
+
"type: :#{type}"
|
60
44
|
end
|
61
45
|
end
|
62
|
-
# rubocop:enable Style/IndentationConsistency
|
63
46
|
end
|
64
47
|
end
|
@@ -5,52 +5,58 @@ module RSpec
|
|
5
5
|
if defined?(ActiveRecord::TestFixtures)
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
include RSpec::Rails::SetupAndTeardownAdapter
|
8
|
-
include RSpec::Rails::MinitestLifecycleAdapter
|
8
|
+
include RSpec::Rails::MinitestLifecycleAdapter
|
9
9
|
include RSpec::Rails::MinitestAssertionAdapter
|
10
10
|
include ActiveRecord::TestFixtures
|
11
11
|
|
12
12
|
included do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# should be part of the 3.1 release, at which point we can include
|
17
|
-
# these lines for rails < 3.1.
|
18
|
-
ActiveSupport::TestCase.class_exec do
|
19
|
-
include ActiveRecord::TestFixtures
|
13
|
+
if RSpec.configuration.use_active_record?
|
14
|
+
include Fixtures
|
15
|
+
|
20
16
|
self.fixture_path = RSpec.configuration.fixture_path
|
21
|
-
|
22
|
-
|
17
|
+
if ::Rails::VERSION::STRING > '5'
|
18
|
+
self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures
|
19
|
+
else
|
20
|
+
self.use_transactional_fixtures = RSpec.configuration.use_transactional_fixtures
|
21
|
+
end
|
22
|
+
self.use_instantiated_fixtures = RSpec.configuration.use_instantiated_fixtures
|
23
23
|
|
24
|
-
|
25
|
-
if ::Rails::VERSION::STRING > '5'
|
26
|
-
self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures
|
27
|
-
else
|
28
|
-
self.use_transactional_fixtures = RSpec.configuration.use_transactional_fixtures
|
24
|
+
fixtures RSpec.configuration.global_fixtures if RSpec.configuration.global_fixtures
|
29
25
|
end
|
30
|
-
|
26
|
+
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
module Fixtures
|
29
|
+
extend ActiveSupport::Concern
|
30
|
+
|
31
|
+
class_methods do
|
32
|
+
def fixtures(*args)
|
33
|
+
orig_methods = private_instance_methods
|
34
|
+
super.tap do
|
35
|
+
new_methods = private_instance_methods - orig_methods
|
36
|
+
new_methods.each do |method_name|
|
37
|
+
proxy_method_warning_if_called_in_before_context_scope(method_name)
|
38
|
+
end
|
38
39
|
end
|
39
40
|
end
|
40
|
-
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
def proxy_method_warning_if_called_in_before_context_scope(method_name)
|
43
|
+
orig_implementation = instance_method(method_name)
|
44
|
+
define_method(method_name) do |*args, &blk|
|
45
|
+
if inspect.include?("before(:context)")
|
46
|
+
RSpec.warn_with("Calling fixture method in before :context ")
|
47
|
+
else
|
48
|
+
orig_implementation.bind(self).call(*args, &blk)
|
49
|
+
end
|
49
50
|
end
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
|
54
|
+
if ::Rails.version.to_f >= 6.1
|
55
|
+
# @private return the example name for TestFixtures
|
56
|
+
def name
|
57
|
+
@example
|
58
|
+
end
|
59
|
+
end
|
54
60
|
end
|
55
61
|
end
|
56
62
|
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
module ActionCable
|
5
|
+
# rubocop: disable Metrics/ClassLength
|
6
|
+
# @private
|
7
|
+
class HaveBroadcastedTo < RSpec::Matchers::BuiltIn::BaseMatcher
|
8
|
+
def initialize(target, channel:)
|
9
|
+
@target = target
|
10
|
+
@channel = channel
|
11
|
+
@block = proc { }
|
12
|
+
@data = nil
|
13
|
+
set_expected_number(:exactly, 1)
|
14
|
+
end
|
15
|
+
|
16
|
+
def with(data = nil, &block)
|
17
|
+
@data = data
|
18
|
+
@data = @data.with_indifferent_access if @data.is_a?(Hash)
|
19
|
+
@block = block if block
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def exactly(count)
|
24
|
+
set_expected_number(:exactly, count)
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def at_least(count)
|
29
|
+
set_expected_number(:at_least, count)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def at_most(count)
|
34
|
+
set_expected_number(:at_most, count)
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def times
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def once
|
43
|
+
exactly(:once)
|
44
|
+
end
|
45
|
+
|
46
|
+
def twice
|
47
|
+
exactly(:twice)
|
48
|
+
end
|
49
|
+
|
50
|
+
def thrice
|
51
|
+
exactly(:thrice)
|
52
|
+
end
|
53
|
+
|
54
|
+
def failure_message
|
55
|
+
"expected to broadcast #{base_message}".tap do |msg|
|
56
|
+
if @unmatching_msgs.any?
|
57
|
+
msg << "\nBroadcasted messages to #{stream}:"
|
58
|
+
@unmatching_msgs.each do |data|
|
59
|
+
msg << "\n #{data}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def failure_message_when_negated
|
66
|
+
"expected not to broadcast #{base_message}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def message_expectation_modifier
|
70
|
+
case @expectation_type
|
71
|
+
when :exactly then "exactly"
|
72
|
+
when :at_most then "at most"
|
73
|
+
when :at_least then "at least"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def supports_block_expectations?
|
78
|
+
true
|
79
|
+
end
|
80
|
+
|
81
|
+
def matches?(proc)
|
82
|
+
raise ArgumentError, "have_broadcasted_to and broadcast_to only support block expectations" unless Proc === proc
|
83
|
+
|
84
|
+
original_sent_messages_count = pubsub_adapter.broadcasts(stream).size
|
85
|
+
proc.call
|
86
|
+
in_block_messages = pubsub_adapter.broadcasts(stream).drop(original_sent_messages_count)
|
87
|
+
|
88
|
+
check(in_block_messages)
|
89
|
+
end
|
90
|
+
|
91
|
+
def from_channel(channel)
|
92
|
+
@channel = channel
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def stream
|
99
|
+
@stream ||= if @target.is_a?(String)
|
100
|
+
@target
|
101
|
+
else
|
102
|
+
check_channel_presence
|
103
|
+
@channel.broadcasting_for(@target)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def check(messages)
|
108
|
+
@matching_msgs, @unmatching_msgs = messages.partition do |msg|
|
109
|
+
decoded = ActiveSupport::JSON.decode(msg)
|
110
|
+
decoded = decoded.with_indifferent_access if decoded.is_a?(Hash)
|
111
|
+
|
112
|
+
if @data.nil? || @data === decoded
|
113
|
+
@block.call(decoded)
|
114
|
+
true
|
115
|
+
else
|
116
|
+
false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
@matching_msgs_count = @matching_msgs.size
|
121
|
+
|
122
|
+
case @expectation_type
|
123
|
+
when :exactly then @expected_number == @matching_msgs_count
|
124
|
+
when :at_most then @expected_number >= @matching_msgs_count
|
125
|
+
when :at_least then @expected_number <= @matching_msgs_count
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def set_expected_number(relativity, count)
|
130
|
+
@expectation_type = relativity
|
131
|
+
@expected_number =
|
132
|
+
case count
|
133
|
+
when :once then 1
|
134
|
+
when :twice then 2
|
135
|
+
when :thrice then 3
|
136
|
+
else Integer(count)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def base_message
|
141
|
+
"#{message_expectation_modifier} #{@expected_number} messages to #{stream}".tap do |msg|
|
142
|
+
msg << " with #{data_description(@data)}" unless @data.nil?
|
143
|
+
msg << ", but broadcast #{@matching_msgs_count}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def data_description(data)
|
148
|
+
if data.is_a?(RSpec::Matchers::Composable)
|
149
|
+
data.description
|
150
|
+
else
|
151
|
+
data
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def pubsub_adapter
|
156
|
+
::ActionCable.server.pubsub
|
157
|
+
end
|
158
|
+
|
159
|
+
def check_channel_presence
|
160
|
+
return if @channel.present? && @channel.respond_to?(:channel_name)
|
161
|
+
|
162
|
+
error_msg = "Broadcasting channel can't be infered. Please, specify it with `from_channel`"
|
163
|
+
raise ArgumentError, error_msg
|
164
|
+
end
|
165
|
+
end
|
166
|
+
# rubocop: enable Metrics/ClassLength
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
module ActionCable
|
5
|
+
# @api private
|
6
|
+
# Provides the implementation for `have_stream`, `have_stream_for`, and `have_stream_from`.
|
7
|
+
# Not intended to be instantiated directly.
|
8
|
+
class HaveStream < RSpec::Matchers::BuiltIn::BaseMatcher
|
9
|
+
# @api private
|
10
|
+
# @return [String]
|
11
|
+
def failure_message
|
12
|
+
"expected to have #{base_message}"
|
13
|
+
end
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
# @return [String]
|
17
|
+
def failure_message_when_negated
|
18
|
+
"expected not to have #{base_message}"
|
19
|
+
end
|
20
|
+
|
21
|
+
# @api private
|
22
|
+
# @return [Boolean]
|
23
|
+
def matches?(subscription)
|
24
|
+
raise(ArgumentError, "have_streams is used for negated expectations only") if no_expected?
|
25
|
+
|
26
|
+
match(subscription)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
# @return [Boolean]
|
31
|
+
def does_not_match?(subscription)
|
32
|
+
!match(subscription)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def match(subscription)
|
38
|
+
case subscription
|
39
|
+
when ::ActionCable::Channel::Base
|
40
|
+
@actual = subscription.streams
|
41
|
+
no_expected? ? actual.any? : actual.any? { |i| expected === i }
|
42
|
+
else
|
43
|
+
raise ArgumentError, "have_stream, have_stream_from and have_stream_from support expectations on subscription only"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def base_message
|
48
|
+
no_expected? ? "any stream started" : "stream #{expected_formatted} started, but have #{actual_formatted}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def no_expected?
|
52
|
+
!defined?(@expected)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "rspec/rails/matchers/action_cable/have_broadcasted_to"
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Rails
|
5
|
+
module Matchers
|
6
|
+
# Namespace for various implementations of ActionCable features
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
module ActionCable
|
10
|
+
end
|
11
|
+
|
12
|
+
# @api public
|
13
|
+
# Passes if a message has been sent to a stream/object inside a block.
|
14
|
+
# May chain `at_least`, `at_most` or `exactly` to specify a number of times.
|
15
|
+
# To specify channel from which message has been broadcasted to object use `from_channel`.
|
16
|
+
#
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
# expect {
|
20
|
+
# ActionCable.server.broadcast "messages", text: 'Hi!'
|
21
|
+
# }.to have_broadcasted_to("messages")
|
22
|
+
#
|
23
|
+
# expect {
|
24
|
+
# SomeChannel.broadcast_to(user)
|
25
|
+
# }.to have_broadcasted_to(user).from_channel(SomeChannel)
|
26
|
+
#
|
27
|
+
# # Using alias
|
28
|
+
# expect {
|
29
|
+
# ActionCable.server.broadcast "messages", text: 'Hi!'
|
30
|
+
# }.to broadcast_to("messages")
|
31
|
+
#
|
32
|
+
# expect {
|
33
|
+
# ActionCable.server.broadcast "messages", text: 'Hi!'
|
34
|
+
# ActionCable.server.broadcast "all", text: 'Hi!'
|
35
|
+
# }.to have_broadcasted_to("messages").exactly(:once)
|
36
|
+
#
|
37
|
+
# expect {
|
38
|
+
# 3.times { ActionCable.server.broadcast "messages", text: 'Hi!' }
|
39
|
+
# }.to have_broadcasted_to("messages").at_least(2).times
|
40
|
+
#
|
41
|
+
# expect {
|
42
|
+
# ActionCable.server.broadcast "messages", text: 'Hi!'
|
43
|
+
# }.to have_broadcasted_to("messages").at_most(:twice)
|
44
|
+
#
|
45
|
+
# expect {
|
46
|
+
# ActionCable.server.broadcast "messages", text: 'Hi!'
|
47
|
+
# }.to have_broadcasted_to("messages").with(text: 'Hi!')
|
48
|
+
def have_broadcasted_to(target = nil)
|
49
|
+
check_action_cable_adapter
|
50
|
+
|
51
|
+
ActionCable::HaveBroadcastedTo.new(target, channel: described_class)
|
52
|
+
end
|
53
|
+
alias_method :broadcast_to, :have_broadcasted_to
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# @private
|
58
|
+
def check_action_cable_adapter
|
59
|
+
return if ::ActionCable::SubscriptionAdapter::Test === ::ActionCable.server.pubsub
|
60
|
+
|
61
|
+
raise StandardError, "To use ActionCable matchers set `adapter: test` in your cable.yml"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
# Namespace for various implementations of ActionMailbox features
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
module ActionMailbox
|
8
|
+
# @private
|
9
|
+
class Base < RSpec::Rails::Matchers::BaseMatcher
|
10
|
+
private
|
11
|
+
|
12
|
+
def create_inbound_email(message)
|
13
|
+
RSpec::Rails::MailboxExampleGroup.create_inbound_email(message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @private
|
18
|
+
class ReceiveInboundEmail < Base
|
19
|
+
def initialize(message)
|
20
|
+
super()
|
21
|
+
|
22
|
+
@inbound_email = create_inbound_email(message)
|
23
|
+
end
|
24
|
+
|
25
|
+
def matches?(mailbox)
|
26
|
+
@mailbox = mailbox
|
27
|
+
@receiver = ApplicationMailbox.router.send(:match_to_mailbox, inbound_email)
|
28
|
+
|
29
|
+
@receiver == @mailbox
|
30
|
+
end
|
31
|
+
|
32
|
+
def failure_message
|
33
|
+
"expected #{describe_inbound_email} to route to #{mailbox}".tap do |msg|
|
34
|
+
if receiver
|
35
|
+
msg << ", but routed to #{receiver} instead"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def failure_message_when_negated
|
41
|
+
"expected #{describe_inbound_email} not to route to #{mailbox}"
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
attr_reader :inbound_email, :mailbox, :receiver
|
47
|
+
|
48
|
+
def describe_inbound_email
|
49
|
+
"mail to #{inbound_email.mail.to.to_sentence}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @api public
|
55
|
+
# Passes if the given inbound email would be routed to the subject inbox.
|
56
|
+
#
|
57
|
+
# @param message [Hash, Mail::Message] a mail message or hash of
|
58
|
+
# attributes used to build one
|
59
|
+
def receive_inbound_email(message)
|
60
|
+
ActionMailbox::ReceiveInboundEmail.new(message)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|