From 6f9867cba65f806eeb652606bd4010ed04e0e07c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sun, 20 May 2018 01:35:42 -0400 Subject: [PATCH] fix validate pagination params --- rpc/core/pipe.go | 8 ++++-- rpc/core/pipe_test.go | 67 +++++++++++++++++++++++++++++++++++++++++++ rpc/core/tx.go | 2 +- 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 rpc/core/pipe_test.go diff --git a/rpc/core/pipe.go b/rpc/core/pipe.go index f97d1817a..e4bb5a294 100644 --- a/rpc/core/pipe.go +++ b/rpc/core/pipe.go @@ -124,10 +124,14 @@ func SetEventBus(b *types.EventBus) { eventBus = b } -func validatePage(page int) int { +func validatePage(page, perPage, totalCount int) int { + pages := ((totalCount - 1) / perPage) + 1 if page < 1 { - return 1 + page = 1 + } else if page > pages { + page = pages } + return page } diff --git a/rpc/core/pipe_test.go b/rpc/core/pipe_test.go new file mode 100644 index 000000000..a33e17cf4 --- /dev/null +++ b/rpc/core/pipe_test.go @@ -0,0 +1,67 @@ +package core + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPaginationPage(t *testing.T) { + + cases := []struct { + totalCount int + perPage int + page int + newPage int + }{ + {0, 10, 0, 1}, + {0, 10, 1, 1}, + {0, 10, 2, 1}, + + {5, 10, -1, 1}, + {5, 10, 0, 1}, + {5, 10, 1, 1}, + {5, 10, 2, 1}, + {5, 10, 2, 1}, + + {5, 5, 1, 1}, + {5, 5, 2, 1}, + {5, 5, 3, 1}, + + {5, 3, 2, 2}, + {5, 3, 3, 2}, + + {5, 2, 2, 2}, + {5, 2, 3, 3}, + {5, 2, 4, 3}, + } + + for _, c := range cases { + p := validatePage(c.page, c.perPage, c.totalCount) + assert.Equal(t, c.newPage, p, fmt.Sprintf("%v", c)) + } + +} + +func TestPaginationPerPage(t *testing.T) { + + cases := []struct { + totalCount int + perPage int + newPerPage int + }{ + {5, 0, defaultPerPage}, + {5, 1, 1}, + {5, 2, 2}, + {5, defaultPerPage, defaultPerPage}, + {5, maxPerPage - 1, maxPerPage - 1}, + {5, maxPerPage, maxPerPage}, + {5, maxPerPage + 1, defaultPerPage}, + } + + for _, c := range cases { + p := validatePerPage(c.perPage) + assert.Equal(t, c.newPerPage, p, fmt.Sprintf("%v", c)) + } +} diff --git a/rpc/core/tx.go b/rpc/core/tx.go index ba68331e2..5fc01a86d 100644 --- a/rpc/core/tx.go +++ b/rpc/core/tx.go @@ -188,7 +188,7 @@ func TxSearch(query string, prove bool, page, perPage int) (*ctypes.ResultTxSear } totalCount := len(results) - page = validatePage(page) + page = validatePage(page, perPage, totalCount) perPage = validatePerPage(perPage) skipCount := (page - 1) * perPage