From 3fd8ad8476077b69c44172159852162fdf4dc605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Fri, 13 Jun 2025 09:55:30 +0200 Subject: [PATCH] fix(folders): only return continue token if more results (#106667) --- pkg/registry/apis/folders/legacy_storage.go | 2 +- .../apis/folders/legacy_storage_test.go | 40 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/pkg/registry/apis/folders/legacy_storage.go b/pkg/registry/apis/folders/legacy_storage.go index f71993bfea2..e100a513301 100644 --- a/pkg/registry/apis/folders/legacy_storage.go +++ b/pkg/registry/apis/folders/legacy_storage.go @@ -124,7 +124,7 @@ func (s *legacyStorage) List(ctx context.Context, options *internalversion.ListO } list.Items = append(list.Items, *r) } - if int64(len(list.Items)) >= paging.limit { + if int64(len(list.Items)) > paging.limit { list.Continue = paging.GetNextPageToken() } return list, nil diff --git a/pkg/registry/apis/folders/legacy_storage_test.go b/pkg/registry/apis/folders/legacy_storage_test.go index 4871c511a20..a073e12f3c9 100644 --- a/pkg/registry/apis/folders/legacy_storage_test.go +++ b/pkg/registry/apis/folders/legacy_storage_test.go @@ -2,6 +2,7 @@ package folders import ( "context" + "encoding/base64" "fmt" "testing" @@ -10,8 +11,6 @@ import ( metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" "k8s.io/apimachinery/pkg/labels" - "encoding/base64" - folderv1 "github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" @@ -73,7 +72,32 @@ func TestLegacyStorage_List_Pagination(t *testing.T) { namespacer: func(_ int64) string { return "1" }, } - t.Run("should set correct continue token", func(t *testing.T) { + t.Run("should set continue token if folders do not fit with-in limit", func(t *testing.T) { + options := &metainternalversion.ListOptions{ + Limit: 1, + } + folders := make([]*folder.Folder, 2) + for i := range folders { + folders[i] = &folder.Folder{ + UID: fmt.Sprintf("folder-%d", i), + Title: fmt.Sprintf("Folder %d", i), + } + } + folderService.ExpectedFolders = folders + + result, err := storage.List(ctx, options) + require.NoError(t, err) + + list, ok := result.(*folderv1.FolderList) + require.True(t, ok) + token, err := base64.StdEncoding.DecodeString(list.Continue) + require.NoError(t, err) + require.Equal(t, "1|2", string(token)) + require.Equal(t, folderService.LastQuery.Limit, int64(1)) + require.Equal(t, folderService.LastQuery.Page, int64(1)) + }) + + t.Run("should set no continue token if folders fit with-in limit", func(t *testing.T) { options := &metainternalversion.ListOptions{ Limit: 2, } @@ -93,16 +117,16 @@ func TestLegacyStorage_List_Pagination(t *testing.T) { require.True(t, ok) token, err := base64.StdEncoding.DecodeString(list.Continue) require.NoError(t, err) - require.Equal(t, "2|2", string(token)) + require.Equal(t, "", string(token)) require.Equal(t, folderService.LastQuery.Limit, int64(2)) require.Equal(t, folderService.LastQuery.Page, int64(1)) }) t.Run("should set page to 1 when limit is set without continue token", func(t *testing.T) { options := &metainternalversion.ListOptions{ - Limit: 2, + Limit: 3, } - folders := make([]*folder.Folder, 2) + folders := make([]*folder.Folder, 5) for i := range folders { folders[i] = &folder.Folder{ UID: fmt.Sprintf("folder-%d", i), @@ -117,8 +141,8 @@ func TestLegacyStorage_List_Pagination(t *testing.T) { require.True(t, ok) token, err := base64.StdEncoding.DecodeString(list.Continue) require.NoError(t, err) - require.Equal(t, "2|2", string(token)) - require.Equal(t, int64(2), folderService.LastQuery.Limit) + require.Equal(t, "3|2", string(token)) + require.Equal(t, int64(3), folderService.LastQuery.Limit) require.Equal(t, int64(1), folderService.LastQuery.Page) }) }