go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/tree_status/rpc/paginator/paginator_test.go (about) 1 // Copyright 2024 The LUCI Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package paginator 16 17 import ( 18 "testing" 19 20 pb "go.chromium.org/luci/tree_status/proto/v1" 21 22 . "github.com/smartystreets/goconvey/convey" 23 . "go.chromium.org/luci/common/testing/assertions" 24 ) 25 26 func TestPaginator(t *testing.T) { 27 Convey("Paginator", t, func() { 28 p := &Paginator{ 29 DefaultPageSize: 50, 30 MaxPageSize: 1000, 31 } 32 Convey("Limit", func() { 33 Convey("Valid value", func() { 34 actual := p.Limit(40) 35 36 So(actual, ShouldEqual, 40) 37 }) 38 Convey("Zero value", func() { 39 actual := p.Limit(0) 40 41 So(actual, ShouldEqual, 50) 42 }) 43 Convey("Negative value", func() { 44 actual := p.Limit(-10) 45 46 So(actual, ShouldEqual, 50) 47 }) 48 Convey("Too large value", func() { 49 actual := p.Limit(4000) 50 51 So(actual, ShouldEqual, 1000) 52 }) 53 }) 54 Convey("Token", func() { 55 Convey("Is deterministic", func() { 56 token1, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent"}, 10) 57 So(err, ShouldBeNil) 58 token2, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent"}, 10) 59 So(err, ShouldBeNil) 60 So(token1, ShouldEqual, token2) 61 }) 62 63 Convey("Ignores page_size and page_token", func() { 64 token1, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}, 10) 65 So(err, ShouldBeNil) 66 token2, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 20, PageToken: "def"}, 10) 67 So(err, ShouldBeNil) 68 So(token1, ShouldEqual, token2) 69 }) 70 71 Convey("Encodes correct offset", func() { 72 token, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}, 42) 73 So(err, ShouldBeNil) 74 75 offset, err := p.Offset(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: token}) 76 So(err, ShouldBeNil) 77 So(offset, ShouldEqual, 42) 78 }) 79 }) 80 Convey("Offset", func() { 81 Convey("Rejects bad token", func() { 82 _, err := p.Offset(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}) 83 So(err, ShouldErrLike, "illegal base64 data") 84 }) 85 86 Convey("Decodes correct offset", func() { 87 token, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}, 42) 88 So(err, ShouldBeNil) 89 90 offset, err := p.Offset(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: token}) 91 So(err, ShouldBeNil) 92 93 So(offset, ShouldEqual, 42) 94 }) 95 96 Convey("Ignores changed page_size", func() { 97 token, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}, 42) 98 So(err, ShouldBeNil) 99 100 offset, err := p.Offset(&pb.ListStatusRequest{Parent: "parent", PageSize: 100, PageToken: token}) 101 So(err, ShouldBeNil) 102 103 So(offset, ShouldEqual, 42) 104 }) 105 106 Convey("Rejects changes in request", func() { 107 token, err := p.NextPageToken(&pb.ListStatusRequest{Parent: "parent", PageSize: 10, PageToken: "abc"}, 42) 108 So(err, ShouldBeNil) 109 110 _, err = p.Offset(&pb.ListStatusRequest{Parent: "changed_value", PageSize: 10, PageToken: token}) 111 So(err, ShouldErrLike, "request message fields do not match page token") 112 }) 113 }) 114 }) 115 }