@@ -111,6 +111,69 @@ def perform_now(user_id); end
111111 assert_equal ( expected , rbi_for ( :NotifyJob ) )
112112 end
113113
114+ it "generates correct RBI file for a generic job" do
115+ add_ruby_file ( "job.rb" , <<~RUBY )
116+ class GenericJob < ActiveJob::Base
117+ extend T::Sig
118+ extend T::Generic
119+
120+ Elem = type_member
121+
122+ sig { params(value: Elem).returns(Elem) }
123+ def perform(value)
124+ value
125+ end
126+ end
127+ RUBY
128+
129+ expected = template ( <<~RBI )
130+ # typed: strong
131+
132+ class GenericJob
133+ class << self
134+ sig { params(value: Elem, block: T.nilable(T.proc.params(job: GenericJob[T.untyped]).void)).returns(T.any(GenericJob[T.untyped], FalseClass)) }
135+ def perform_later(value, &block); end
136+
137+ sig { params(value: Elem).returns(Elem) }
138+ def perform_now(value); end
139+ end
140+ end
141+ RBI
142+ assert_equal ( expected , rbi_for ( :GenericJob ) )
143+ end
144+
145+ it "generates correct RBI file for a job with multiple type members" do
146+ add_ruby_file ( "job.rb" , <<~RUBY )
147+ class GenericJob < ActiveJob::Base
148+ extend T::Sig
149+ extend T::Generic
150+
151+ Input = type_member
152+ Output = type_member
153+
154+ sig { params(value: Input).returns(Output) }
155+ def perform(value)
156+ raise NotImplementedError
157+ end
158+ end
159+ RUBY
160+
161+ expected = template ( <<~RBI )
162+ # typed: strong
163+
164+ class GenericJob
165+ class << self
166+ sig { params(value: Input, block: T.nilable(T.proc.params(job: GenericJob[T.untyped, T.untyped]).void)).returns(T.any(GenericJob[T.untyped, T.untyped], FalseClass)) }
167+ def perform_later(value, &block); end
168+
169+ sig { params(value: Input).returns(Output) }
170+ def perform_now(value); end
171+ end
172+ end
173+ RBI
174+ assert_equal ( expected , rbi_for ( :GenericJob ) )
175+ end
176+
114177 it "generates correct RBI file for subclass with block argument" do
115178 add_ruby_file ( "job.rb" , <<~RUBY )
116179 class NotifyJob < ActiveJob::Base
0 commit comments