fix pagination not working in legacy modes with kubernetes apis enabled (#112478)
* dashboards: fix pagination not working in legacy modes with kubernetes apis enabled
This commit is contained in:
@@ -279,8 +279,12 @@ func (s *SearchHandler) DoSearch(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
if queryParams.Has("offset") {
|
if queryParams.Has("offset") {
|
||||||
offset, _ = strconv.Atoi(queryParams.Get("offset"))
|
offset, _ = strconv.Atoi(queryParams.Get("offset"))
|
||||||
|
if offset > 0 {
|
||||||
|
page = (offset / limit) + 1
|
||||||
|
}
|
||||||
} else if queryParams.Has("page") {
|
} else if queryParams.Has("page") {
|
||||||
page, _ = strconv.Atoi(queryParams.Get("page"))
|
page, _ = strconv.Atoi(queryParams.Get("page"))
|
||||||
|
offset = (page - 1) * limit
|
||||||
}
|
}
|
||||||
|
|
||||||
searchRequest := &resourcepb.ResourceSearchRequest{
|
searchRequest := &resourcepb.ResourceSearchRequest{
|
||||||
|
|||||||
@@ -189,6 +189,98 @@ func TestSearchFallback(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSearchHandlerPagination(t *testing.T) {
|
||||||
|
t.Run("should calculate offset and page parameters", func(t *testing.T) {
|
||||||
|
limit := 50
|
||||||
|
for i, tt := range []struct {
|
||||||
|
offset int
|
||||||
|
page int
|
||||||
|
expectedOffset int
|
||||||
|
expectedPage int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
page: 0,
|
||||||
|
expectedOffset: 0,
|
||||||
|
expectedPage: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
page: 1,
|
||||||
|
expectedOffset: 0,
|
||||||
|
expectedPage: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
page: 2,
|
||||||
|
expectedOffset: 50,
|
||||||
|
expectedPage: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
page: 3,
|
||||||
|
expectedOffset: 100,
|
||||||
|
expectedPage: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 50,
|
||||||
|
page: 0,
|
||||||
|
expectedOffset: 50,
|
||||||
|
expectedPage: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 100,
|
||||||
|
page: 0,
|
||||||
|
expectedOffset: 100,
|
||||||
|
expectedPage: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 149,
|
||||||
|
page: 0,
|
||||||
|
expectedOffset: 149,
|
||||||
|
expectedPage: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 150,
|
||||||
|
page: 0,
|
||||||
|
expectedOffset: 150,
|
||||||
|
expectedPage: 4,
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
mockClient := &MockClient{}
|
||||||
|
|
||||||
|
cfg := &setting.Cfg{
|
||||||
|
UnifiedStorage: map[string]setting.UnifiedStorageConfig{
|
||||||
|
"dashboards.dashboard.grafana.app": {DualWriterMode: rest.Mode0},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
dual := dualwrite.ProvideStaticServiceForTests(cfg)
|
||||||
|
searchHandler := NewSearchHandler(tracing.NewNoopTracerService(), dual, mockClient, mockClient, nil)
|
||||||
|
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
endpoint := fmt.Sprintf("/search?limit=%d", limit)
|
||||||
|
if tt.offset > 0 {
|
||||||
|
endpoint = fmt.Sprintf("%s&offset=%d", endpoint, tt.offset)
|
||||||
|
}
|
||||||
|
if tt.page > 0 {
|
||||||
|
endpoint = fmt.Sprintf("%s&page=%d", endpoint, tt.page)
|
||||||
|
}
|
||||||
|
req := httptest.NewRequest("GET", endpoint, nil)
|
||||||
|
req.Header.Add("content-type", "application/json")
|
||||||
|
req = req.WithContext(identity.WithRequester(req.Context(), &user.SignedInUser{Namespace: "test"}))
|
||||||
|
|
||||||
|
searchHandler.DoSearch(rr, req)
|
||||||
|
|
||||||
|
if mockClient.LastSearchRequest == nil {
|
||||||
|
t.Fatalf("expected Search to be called, but it was not")
|
||||||
|
}
|
||||||
|
|
||||||
|
require.Equal(t, int(mockClient.LastSearchRequest.Offset), tt.expectedOffset, fmt.Sprintf("mismatch offset in test %d", i))
|
||||||
|
require.Equal(t, int(mockClient.LastSearchRequest.Page), tt.expectedPage, fmt.Sprintf("mismatch page in test %d", i))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSearchHandler(t *testing.T) {
|
func TestSearchHandler(t *testing.T) {
|
||||||
t.Run("Multiple comma separated fields will be appended to default dashboard search fields", func(t *testing.T) {
|
t.Run("Multiple comma separated fields will be appended to default dashboard search fields", func(t *testing.T) {
|
||||||
// Create a mock client
|
// Create a mock client
|
||||||
|
|||||||
Reference in New Issue
Block a user