44require "rspec/mocks/argument_matchers"
55require "rspec/rails/matchers/active_job"
66
7+ # rubocop: disable Metrics/ClassLength
78module RSpec
89 module Rails
910 module Matchers
@@ -76,7 +77,7 @@ def job_match?(job)
7677 def arguments_match? ( job )
7778 @args =
7879 if @mail_args . any?
79- base_mailer_args + process_arguments ( job , @mail_args )
80+ base_mailer_args + @mail_args
8081 elsif @mailer_class && @method_name
8182 base_mailer_args + [ any_args ]
8283 elsif @mailer_class
@@ -88,38 +89,12 @@ def arguments_match?(job)
8889 super ( job )
8990 end
9091
91- def process_arguments ( job , given_mail_args )
92- # Old matcher behavior working with all builtin classes but ActionMailer::MailDeliveryJob
93- return given_mail_args if use_given_mail_args? ( job )
94-
95- # If matching args starts with a hash and job instance has params match with them
96- if given_mail_args . first . is_a? ( Hash ) && job [ :args ] [ 3 ] [ 'params' ] . present?
97- [ hash_including ( params : given_mail_args [ 0 ] , args : given_mail_args . drop ( 1 ) ) ]
98- else
99- [ hash_including ( args : given_mail_args ) ]
100- end
101- end
102-
103- def use_given_mail_args? ( job )
104- return true if FeatureCheck . has_action_mailer_parameterized? && job [ :job ] <= ActionMailer ::Parameterized ::DeliveryJob
105- return false if FeatureCheck . ruby_3_1?
106-
107- !( FeatureCheck . has_action_mailer_unified_delivery? && job [ :job ] <= ActionMailer ::MailDeliveryJob )
108- end
109-
11092 def base_mailer_args
11193 [ mailer_class_name , @method_name . to_s , MAILER_JOB_METHOD ]
11294 end
11395
11496 def yield_mail_args ( block )
115- proc do |*job_args |
116- mailer_args = job_args - base_mailer_args
117- if mailer_args . first . is_a? ( Hash )
118- block . call ( *mailer_args . first [ :args ] )
119- else
120- block . call ( *mailer_args )
121- end
122- end
97+ proc { |*job_args | block . call ( *( job_args - base_mailer_args ) ) }
12398 end
12499
125100 def check_active_job_adapter
@@ -145,22 +120,41 @@ def unmatching_mail_jobs_message
145120 end
146121
147122 def mail_job_message ( job )
148- mailer_method = job [ :args ] [ 0 ..1 ] . join ( '.' )
149- mailer_args = deserialize_arguments ( job ) [ 3 ..-1 ]
150- mailer_args = mailer_args . first [ :args ] if unified_mail? ( job )
123+ job_args = deserialize_arguments ( job )
124+
125+ mailer_method = job_args [ 0 ..1 ] . join ( '.' )
126+ mailer_args = job_args [ 3 ..-1 ]
127+
151128 msg_parts = [ ]
152- display_args = display_mailer_args ( mailer_args )
153- msg_parts << "with #{ display_args } " if display_args . any?
129+ msg_parts << "with #{ mailer_args } " if mailer_args . any?
154130 msg_parts << "on queue #{ job [ :queue ] } " if job [ :queue ] && job [ :queue ] != 'mailers'
155131 msg_parts << "at #{ Time . at ( job [ :at ] ) } " if job [ :at ]
156132
157133 "#{ mailer_method } #{ msg_parts . join ( ', ' ) } " . strip
158134 end
159135
160- def display_mailer_args ( mailer_args )
161- return mailer_args unless mailer_args . first . is_a? ( Hash ) && mailer_args . first . key? ( :args )
136+ # Ruby 3.1 changed how params were serialized on Rails 6.1
137+ # so we override the active job implementation and customise it here.
138+ def deserialize_arguments ( job )
139+ args = super
140+
141+ return args unless Hash === args . last
142+
143+ hash = args . pop
162144
163- mailer_args . first [ :args ]
145+ if hash . key? ( "_aj_ruby2_keywords" )
146+ keywords = hash [ "_aj_ruby2_keywords" ]
147+
148+ original_hash = keywords . each_with_object ( { } ) { |new_hash , keyword | new_hash [ keyword . to_sym ] = hash [ keyword ] }
149+
150+ args + [ original_hash ]
151+ elsif hash . key? ( :args ) && hash . key? ( :params )
152+ args + [ hash ]
153+ elsif hash . key? ( :args )
154+ args + hash [ :args ]
155+ else
156+ args + [ hash ]
157+ end
164158 end
165159
166160 def legacy_mail? ( job )
@@ -230,3 +224,4 @@ def have_enqueued_mail(mailer_class = nil, mail_method_name = nil)
230224 end
231225 end
232226end
227+ # rubocop: enable Metrics/ClassLength
0 commit comments