github.com/Finschia/finschia-sdk@v0.49.1/client/utils_test.go (about) 1 package client_test 2 3 import ( 4 "strconv" 5 "testing" 6 7 "github.com/spf13/pflag" 8 "github.com/stretchr/testify/require" 9 10 "github.com/Finschia/finschia-sdk/client" 11 "github.com/Finschia/finschia-sdk/client/flags" 12 ) 13 14 func TestPaginate(t *testing.T) { 15 testCases := []struct { 16 name string 17 numObjs, page, limit, defLimit int 18 expectedStart, expectedEnd int 19 }{ 20 { 21 "all objects in a single page", 22 100, 1, 100, 100, 23 0, 100, 24 }, 25 { 26 "page one of three", 27 75, 1, 25, 100, 28 0, 25, 29 }, 30 { 31 "page two of three", 32 75, 2, 25, 100, 33 25, 50, 34 }, 35 { 36 "page three of three", 37 75, 3, 25, 100, 38 50, 75, 39 }, 40 { 41 "end is greater than total number of objects", 42 75, 2, 50, 100, 43 50, 75, 44 }, 45 { 46 "fallback to default limit", 47 75, 5, 0, 10, 48 40, 50, 49 }, 50 { 51 "invalid start page", 52 75, 4, 25, 100, 53 -1, -1, 54 }, 55 { 56 "invalid zero start page", 57 75, 0, 25, 100, 58 -1, -1, 59 }, 60 { 61 "invalid negative start page", 62 75, -1, 25, 100, 63 -1, -1, 64 }, 65 { 66 "invalid default limit", 67 75, 2, 0, -10, 68 -1, -1, 69 }, 70 } 71 72 for i, tc := range testCases { 73 t.Run(tc.name, func(t *testing.T) { 74 start, end := client.Paginate(tc.numObjs, tc.page, tc.limit, tc.defLimit) 75 require.Equal(t, tc.expectedStart, start, "invalid result; test case #%d", i) 76 require.Equal(t, tc.expectedEnd, end, "invalid result; test case #%d", i) 77 }) 78 } 79 } 80 81 func TestReadPageRequest(t *testing.T) { 82 testCases := []struct { 83 name string 84 pageKey string 85 offset, limit, page int 86 countTotal bool 87 ok bool 88 }{ 89 { 90 "use page ok", 91 "page key", 92 0, 100, 10, 93 true, 94 true, 95 }, 96 { 97 "use offset ok", 98 "page key", 99 10, 100, 0, 100 true, 101 true, 102 }, 103 { 104 "page and offset cannot be used together", 105 "page key", 106 100, 100, 10, 107 true, 108 false, 109 }, 110 } 111 112 for _, tc := range testCases { 113 t.Run(tc.name, func(t *testing.T) { 114 flagSet := pflag.NewFlagSet("test flag set", pflag.ContinueOnError) 115 flagSet.String(flags.FlagPageKey, "default page key", "page key") 116 flagSet.Uint64(flags.FlagOffset, 0, "offset") 117 flagSet.Uint64(flags.FlagLimit, 0, "limit") 118 flagSet.Uint64(flags.FlagPage, 0, "page") 119 flagSet.Bool(flags.FlagCountTotal, false, "count total") 120 121 err := flagSet.Set(flags.FlagPageKey, tc.pageKey) 122 require.NoError(t, err) 123 err = flagSet.Set(flags.FlagOffset, strconv.Itoa(tc.offset)) 124 require.NoError(t, err) 125 err = flagSet.Set(flags.FlagLimit, strconv.Itoa(tc.limit)) 126 require.NoError(t, err) 127 err = flagSet.Set(flags.FlagPage, strconv.Itoa(tc.page)) 128 require.NoError(t, err) 129 err = flagSet.Set(flags.FlagCountTotal, strconv.FormatBool(tc.countTotal)) 130 require.NoError(t, err) 131 132 pr, err := client.ReadPageRequest(flagSet) 133 if tc.ok { 134 require.NoError(t, err) 135 require.NotNil(t, pr) 136 } else { 137 require.Error(t, err) 138 } 139 }) 140 } 141 }