@@ -10,6 +10,13 @@ class RunnerClientTest < ActiveSupport::TestCase
1010 setup do
1111 @outgoing_queue = Thread ::Queue . new
1212 @global_state = GlobalState . new
13+ @global_state . apply_options ( {
14+ capabilities : {
15+ window : {
16+ workDoneProgress : true ,
17+ } ,
18+ } ,
19+ } )
1320 @client = T . let ( RunnerClient . new ( @outgoing_queue , @global_state ) , RunnerClient )
1421 end
1522
@@ -155,6 +162,84 @@ def execute(request, params)
155162 ensure
156163 FileUtils . rm ( "server_addon.rb" )
157164 end
165+
166+ test "server add-ons can report progress" do
167+ File . write ( "server_addon.rb" , <<~RUBY )
168+ class TapiocaServerAddon < RubyLsp::Rails::ServerAddon
169+ def name
170+ "Tapioca"
171+ end
172+
173+ def execute(request, params)
174+ begin_progress("my-progress-id", "Doing something expensive")
175+ report_progress("my-progress-id", message: "Made some progress!")
176+ end_progress("my-progress-id")
177+ end
178+ end
179+ RUBY
180+
181+ @client . register_server_addon ( File . expand_path ( "server_addon.rb" ) )
182+ @client . delegate_notification ( server_addon_name : "Tapioca" , request_name : "dsl" )
183+
184+ # Started booting server
185+ pop_log_notification ( @outgoing_queue , RubyLsp ::Constant ::MessageType ::LOG )
186+ # Finished booting server
187+ pop_log_notification ( @outgoing_queue , RubyLsp ::Constant ::MessageType ::LOG )
188+
189+ messages = [ ]
190+
191+ # Sometimes we get warnings concerning deprecations and they mess up this expectation
192+ until messages . length == 4
193+ message = @outgoing_queue . pop
194+ messages << message if message . dig ( :params , :token ) == "my-progress-id"
195+ end
196+
197+ assert_equal ( "window/workDoneProgress/create" , messages . dig ( 0 , :method ) )
198+ assert_equal ( "begin" , messages . dig ( 1 , :params , :value , :kind ) )
199+ assert_equal ( "report" , messages . dig ( 2 , :params , :value , :kind ) )
200+ assert_equal ( "end" , messages . dig ( 3 , :params , :value , :kind ) )
201+ ensure
202+ FileUtils . rm ( "server_addon.rb" )
203+ end
204+
205+ test "server add-ons can report progress through block API" do
206+ File . write ( "server_addon.rb" , <<~RUBY )
207+ class TapiocaServerAddon < RubyLsp::Rails::ServerAddon
208+ def name
209+ "Tapioca"
210+ end
211+
212+ def execute(request, params)
213+ with_progress("my-progress-id", "Doing something expensive") do |progress|
214+ progress.report(message: "Made some progress!")
215+ end
216+ end
217+ end
218+ RUBY
219+
220+ @client . register_server_addon ( File . expand_path ( "server_addon.rb" ) )
221+ @client . delegate_notification ( server_addon_name : "Tapioca" , request_name : "dsl" )
222+
223+ # Started booting server
224+ pop_log_notification ( @outgoing_queue , RubyLsp ::Constant ::MessageType ::LOG )
225+ # Finished booting server
226+ pop_log_notification ( @outgoing_queue , RubyLsp ::Constant ::MessageType ::LOG )
227+
228+ messages = [ ]
229+
230+ # Sometimes we get warnings concerning deprecations and they mess up this expectation
231+ until messages . length == 4
232+ message = @outgoing_queue . pop
233+ messages << message if message . dig ( :params , :token ) == "my-progress-id"
234+ end
235+
236+ assert_equal ( "window/workDoneProgress/create" , messages . dig ( 0 , :method ) )
237+ assert_equal ( "begin" , messages . dig ( 1 , :params , :value , :kind ) )
238+ assert_equal ( "report" , messages . dig ( 2 , :params , :value , :kind ) )
239+ assert_equal ( "end" , messages . dig ( 3 , :params , :value , :kind ) )
240+ ensure
241+ FileUtils . rm ( "server_addon.rb" )
242+ end
158243 end
159244
160245 class NullClientTest < ActiveSupport ::TestCase
0 commit comments