@@ -250,6 +250,7 @@ describe('opencode.ui.session_picker', function()
250250
251251 local open_stub = stub (session_runtime , ' open_session_in_tab' ).returns (Promise .new ():resolve (selected_session ))
252252 local closed = false
253+ assert .is_true (captured_action .multi_selection )
253254 captured_action
254255 .fn (selected_session , {
255256 close = function ()
@@ -265,6 +266,61 @@ describe('opencode.ui.session_picker', function()
265266 base_picker .pick = original_pick
266267 end )
267268
269+ it (' opens multiple selected sessions in panel tabs' , function ()
270+ local base_picker = require (' opencode.ui.base_picker' )
271+ local original_pick = base_picker .pick
272+ local sessions = {
273+ { id = ' session-1' , title = ' First session' },
274+ { id = ' session-2' , title = ' Second session' },
275+ }
276+ local captured_action
277+
278+ base_picker .pick = function (opts )
279+ captured_action = opts .actions .open_in_tab
280+ return true
281+ end
282+
283+ session_picker .pick (sessions , function () end )
284+
285+ local opened = {}
286+ local open_stub = stub (session_runtime , ' open_session_in_tab' ).invokes (function (session )
287+ opened [# opened + 1 ] = session
288+ return Promise .new ():resolve (session )
289+ end )
290+ local closed = false
291+ local original_delay = Promise .delay
292+ local close_delay = Promise .new ()
293+ local between_opens_delay = Promise .new ()
294+ local delays = { close_delay , between_opens_delay , Promise .new ():resolve (true ) }
295+ Promise .delay = function ()
296+ return table.remove (delays , 1 )
297+ end
298+
299+ local action_promise = captured_action .fn (sessions , {
300+ close = function ()
301+ closed = true
302+ end ,
303+ })
304+ assert .is_true (closed )
305+ assert .same ({}, opened )
306+
307+ close_delay :resolve (true )
308+ vim .wait (50 , function ()
309+ return # opened == 1
310+ end )
311+ assert .same ({ sessions [1 ] }, opened )
312+
313+ between_opens_delay :resolve (true )
314+ action_promise :wait ()
315+ Promise .delay = original_delay
316+
317+ assert .same (sessions , opened )
318+ assert .stub (open_stub ).was_called (2 )
319+
320+ open_stub :revert ()
321+ base_picker .pick = original_pick
322+ end )
323+
268324 -- -----------------------------------------------------------------------
269325 -- Integration tests: delete action triggers switch when parent/grandparent
270326 -- of the active session is deleted
0 commit comments