4
4
require "rspec/mocks/argument_matchers"
5
5
require "rspec/rails/matchers/active_job"
6
6
7
+ # rubocop: disable Metrics/ClassLength
7
8
module RSpec
8
9
module Rails
9
10
module Matchers
@@ -76,7 +77,7 @@ def job_match?(job)
76
77
def arguments_match? ( job )
77
78
@args =
78
79
if @mail_args . any?
79
- base_mailer_args + process_arguments ( job , @mail_args )
80
+ base_mailer_args + @mail_args
80
81
elsif @mailer_class && @method_name
81
82
base_mailer_args + [ any_args ]
82
83
elsif @mailer_class
@@ -88,38 +89,12 @@ def arguments_match?(job)
88
89
super ( job )
89
90
end
90
91
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
-
110
92
def base_mailer_args
111
93
[ mailer_class_name , @method_name . to_s , MAILER_JOB_METHOD ]
112
94
end
113
95
114
96
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 ) ) }
123
98
end
124
99
125
100
def check_active_job_adapter
@@ -145,22 +120,41 @@ def unmatching_mail_jobs_message
145
120
end
146
121
147
122
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
+
151
128
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?
154
130
msg_parts << "on queue #{ job [ :queue ] } " if job [ :queue ] && job [ :queue ] != 'mailers'
155
131
msg_parts << "at #{ Time . at ( job [ :at ] ) } " if job [ :at ]
156
132
157
133
"#{ mailer_method } #{ msg_parts . join ( ', ' ) } " . strip
158
134
end
159
135
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
162
144
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
164
158
end
165
159
166
160
def legacy_mail? ( job )
@@ -230,3 +224,4 @@ def have_enqueued_mail(mailer_class = nil, mail_method_name = nil)
230
224
end
231
225
end
232
226
end
227
+ # rubocop: enable Metrics/ClassLength
0 commit comments