@@ -242,6 +242,9 @@ func TestSandboxListPaginationRunning(t *testing.T) {
242242 sbx2 := utils .SetupSandboxWithCleanup (t , c , utils .WithMetadata (api.SandboxMetadata {metadataKey : metadataValue }))
243243 sandbox2ID := sbx2 .SandboxID
244244
245+ sbx3 := utils .SetupSandboxWithCleanup (t , c , utils .WithMetadata (api.SandboxMetadata {metadataKey : metadataValue }))
246+ sandbox3ID := sbx3 .SandboxID
247+
245248 // Test pagination with limit
246249 var limit int32 = 1
247250
@@ -254,12 +257,12 @@ func TestSandboxListPaginationRunning(t *testing.T) {
254257 require .NoError (t , err )
255258 require .Equal (t , http .StatusOK , listResponse .StatusCode ())
256259 require .Len (t , * listResponse .JSON200 , 1 )
257- assert .Equal (t , sandbox2ID , (* listResponse .JSON200 )[0 ].SandboxID )
260+ assert .Equal (t , sandbox3ID , (* listResponse .JSON200 )[0 ].SandboxID )
258261
259262 totalHeader := listResponse .HTTPResponse .Header .Get ("X-Total-Running" )
260263 total , err := strconv .Atoi (totalHeader )
261264 require .NoError (t , err )
262- assert .Equal (t , 2 , total )
265+ assert .Equal (t , 3 , total )
263266
264267 // Get second page using the next token from first response
265268 nextToken := listResponse .HTTPResponse .Header .Get ("X-Next-Token" )
@@ -274,13 +277,93 @@ func TestSandboxListPaginationRunning(t *testing.T) {
274277 require .NoError (t , err )
275278 require .Equal (t , http .StatusOK , secondPageResponse .StatusCode ())
276279 require .Len (t , * secondPageResponse .JSON200 , 1 )
277- assert .Equal (t , sandbox1ID , (* secondPageResponse .JSON200 )[0 ].SandboxID )
280+ assert .Equal (t , sandbox2ID , (* secondPageResponse .JSON200 )[0 ].SandboxID )
278281
279- // No more pages
282+ // Get third page using the next token from second response
280283 nextToken = secondPageResponse .HTTPResponse .Header .Get ("X-Next-Token" )
284+ assert .NotEmpty (t , nextToken )
285+
286+ thirdPageResponse , err := c .GetV2SandboxesWithResponse (t .Context (), & api.GetV2SandboxesParams {
287+ Limit : & limit ,
288+ NextToken : & nextToken ,
289+ State : & []api.SandboxState {api .Running },
290+ Metadata : & metadataString ,
291+ }, setup .WithAPIKey ())
292+ require .NoError (t , err )
293+ require .Equal (t , http .StatusOK , thirdPageResponse .StatusCode ())
294+ require .Len (t , * thirdPageResponse .JSON200 , 1 )
295+ assert .Equal (t , sandbox1ID , (* thirdPageResponse .JSON200 )[0 ].SandboxID )
296+
297+ // No more pages
298+ nextToken = thirdPageResponse .HTTPResponse .Header .Get ("X-Next-Token" )
281299 assert .Empty (t , nextToken )
282300}
283301
302+ func TestSandboxListPaginationRunningLargerLimit (t * testing.T ) {
303+ c := setup .GetAPIClient ()
304+
305+ metadataKey := "uniqueIdentifier"
306+ metadataValue := id .Generate ()
307+ metadataString := fmt .Sprintf ("%s=%s" , metadataKey , metadataValue )
308+
309+ sbxsCount := 12
310+ sandboxes := make ([]string , sbxsCount )
311+ for i := range sbxsCount {
312+ sbx := utils .SetupSandboxWithCleanup (t , c , utils .WithMetadata (api.SandboxMetadata {metadataKey : metadataValue }))
313+ sandboxes [sbxsCount - i - 1 ] = sbx .SandboxID
314+
315+ t .Logf ("Created sandbox %d/%d: %s" , i + 1 , sbxsCount , sbx .SandboxID )
316+ }
317+
318+ t .Run ("check all sandboxes list" , func (t * testing.T ) {
319+ listResponse , err := c .GetV2SandboxesWithResponse (t .Context (), & api.GetV2SandboxesParams {
320+ Limit : sharedUtils .ToPtr (int32 (sbxsCount )),
321+ State : & []api.SandboxState {api .Running },
322+ Metadata : & metadataString ,
323+ }, setup .WithAPIKey ())
324+ require .NoError (t , err )
325+ require .Equal (t , http .StatusOK , listResponse .StatusCode ())
326+ require .Len (t , * listResponse .JSON200 , sbxsCount )
327+ for i := range sbxsCount {
328+ assert .Equal (t , sandboxes [i ], (* listResponse .JSON200 )[i ].SandboxID )
329+ }
330+ })
331+
332+ t .Run ("check paginated list" , func (t * testing.T ) {
333+ // Test pagination with limit
334+ limit := 2
335+
336+ var nextToken * string
337+ for i := 0 ; i < sbxsCount ; i += limit {
338+ sbxID := sandboxes [i ]
339+
340+ listResponse , err := c .GetV2SandboxesWithResponse (t .Context (), & api.GetV2SandboxesParams {
341+ Limit : sharedUtils .ToPtr (int32 (limit )),
342+ NextToken : nextToken ,
343+ State : & []api.SandboxState {api .Running },
344+ Metadata : & metadataString ,
345+ }, setup .WithAPIKey ())
346+ require .NoError (t , err )
347+ require .Equal (t , http .StatusOK , listResponse .StatusCode ())
348+ require .Len (t , * listResponse .JSON200 , int (limit ))
349+ assert .Equal (t , sbxID , (* listResponse .JSON200 )[0 ].SandboxID , "page starting at %d should start with sandbox %s, token %s" , i , sbxID , sharedUtils .Sprintp (nextToken ))
350+
351+ totalHeader := listResponse .HTTPResponse .Header .Get ("X-Total-Running" )
352+ total , err := strconv .Atoi (totalHeader )
353+ require .NoError (t , err )
354+ assert .Equal (t , sbxsCount , total )
355+
356+ nextToken = sharedUtils .ToPtr (listResponse .HTTPResponse .Header .Get ("X-Next-Token" ))
357+
358+ if i + limit == sbxsCount {
359+ assert .Empty (t , * nextToken )
360+ } else {
361+ assert .NotEmpty (t , * nextToken )
362+ }
363+ }
364+ })
365+ }
366+
284367func TestSandboxListPaginationPaused (t * testing.T ) {
285368 c := setup .GetAPIClient ()
286369
0 commit comments