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 ) 
@@ -229,3 +223,4 @@ def have_enqueued_mail(mailer_class = nil, mail_method_name = nil)
229223    end 
230224  end 
231225end 
226+ # rubocop: enable Metrics/ClassLength 
0 commit comments