github.com/Finschia/finschia-sdk@v0.48.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  		i, tc := i, tc
    74  		t.Run(tc.name, func(t *testing.T) {
    75  			start, end := client.Paginate(tc.numObjs, tc.page, tc.limit, tc.defLimit)
    76  			require.Equal(t, tc.expectedStart, start, "invalid result; test case #%d", i)
    77  			require.Equal(t, tc.expectedEnd, end, "invalid result; test case #%d", i)
    78  		})
    79  	}
    80  }
    81  
    82  func TestReadPageRequest(t *testing.T) {
    83  
    84  	testCases := []struct {
    85  		name                string
    86  		pageKey             string
    87  		offset, limit, page int
    88  		countTotal          bool
    89  		ok                  bool
    90  	}{
    91  		{
    92  			"use page ok",
    93  			"page key",
    94  			0, 100, 10,
    95  			true,
    96  			true,
    97  		},
    98  		{
    99  			"use offset ok",
   100  			"page key",
   101  			10, 100, 0,
   102  			true,
   103  			true,
   104  		},
   105  		{
   106  			"page and offset cannot be used together",
   107  			"page key",
   108  			100, 100, 10,
   109  			true,
   110  			false,
   111  		},
   112  	}
   113  
   114  	for _, tc := range testCases {
   115  		t.Run(tc.name, func(t *testing.T) {
   116  			flagSet := pflag.NewFlagSet("test flag set", pflag.ContinueOnError)
   117  			flagSet.String(flags.FlagPageKey, "default page key", "page key")
   118  			flagSet.Uint64(flags.FlagOffset, 0, "offset")
   119  			flagSet.Uint64(flags.FlagLimit, 0, "limit")
   120  			flagSet.Uint64(flags.FlagPage, 0, "page")
   121  			flagSet.Bool(flags.FlagCountTotal, false, "count total")
   122  
   123  			err := flagSet.Set(flags.FlagPageKey, tc.pageKey)
   124  			err = flagSet.Set(flags.FlagOffset, strconv.Itoa(tc.offset))
   125  			err = flagSet.Set(flags.FlagLimit, strconv.Itoa(tc.limit))
   126  			err = flagSet.Set(flags.FlagPage, strconv.Itoa(tc.page))
   127  			err = flagSet.Set(flags.FlagCountTotal, strconv.FormatBool(tc.countTotal))
   128  
   129  			pr, err := client.ReadPageRequest(flagSet)
   130  			if tc.ok {
   131  				require.NoError(t, err)
   132  				require.NotNil(t, pr)
   133  			} else {
   134  				require.Error(t, err)
   135  			}
   136  		})
   137  	}
   138  }