github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/paging/page_iterator_test.go (about)

     1  package paging
     2  
     3  import (
     4  	"fmt"
     5  	url_pkg "net/url"
     6  	"strconv"
     7  	"testing"
     8  
     9  	"github.com/pkg/errors"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  const (
    15  	testBaseURL       = "https://test.com"
    16  	testSkipParam     = "$skip"
    17  	testPageSizeParam = "$page"
    18  )
    19  
    20  func TestPageIterator(t *testing.T) {
    21  	var (
    22  		pageSize   = 3
    23  		err        error
    24  		i          = 0
    25  		numPages   = 5
    26  		additional = map[string]string{
    27  			"$foo": "bar",
    28  		}
    29  		testErr = errors.New("test error")
    30  	)
    31  	tests := []struct {
    32  		name          string
    33  		pagingFunc    func(u string) (uint64, error)
    34  		expectedError error
    35  	}{
    36  		{
    37  			name: fmt.Sprintf("Successfully fetches all pages for %d pages", pageSize),
    38  			pagingFunc: func(u string) (uint64, error) {
    39  				defer func() { i++ }()
    40  
    41  				url, err := url_pkg.ParseRequestURI(u)
    42  				require.NoError(t, err)
    43  
    44  				q := url.Query()
    45  				skipValue, err := strconv.Atoi(q.Get("$skip"))
    46  				require.NoError(t, err)
    47  				require.Equal(t, i*pageSize, skipValue)
    48  
    49  				pageSizeValue, err := strconv.Atoi(q.Get("$page"))
    50  				require.NoError(t, err)
    51  				require.Equal(t, pageSize, pageSizeValue)
    52  
    53  				additionalValue := q.Get("$foo")
    54  				require.Equal(t, "bar", additionalValue)
    55  
    56  				if i < numPages {
    57  					return uint64(pageSize), nil
    58  				}
    59  				return uint64(pageSize - 1), nil
    60  			},
    61  			expectedError: nil,
    62  		},
    63  		{
    64  			name: "Returns an error when an error occurs during first paging func execution",
    65  			pagingFunc: func(u string) (uint64, error) {
    66  				return 0, testErr
    67  			},
    68  			expectedError: testErr,
    69  		},
    70  		{
    71  			name: "Returns an error when an error occurs during other but the first paging func execution",
    72  			pagingFunc: func(u string) (uint64, error) {
    73  				url, err := url_pkg.ParseRequestURI(u)
    74  				require.NoError(t, err)
    75  
    76  				q := url.Query()
    77  				skipValue, err := strconv.Atoi(q.Get("$skip"))
    78  				require.NoError(t, err)
    79  				if skipValue == 0 {
    80  					return uint64(pageSize), nil
    81  				}
    82  				return 0, testErr
    83  			},
    84  			expectedError: testErr,
    85  		},
    86  	}
    87  
    88  	for _, test := range tests {
    89  		t.Run(test.name, func(t *testing.T) {
    90  			iterator := NewPageIterator(testBaseURL, testSkipParam, testPageSizeParam, additional, uint64(pageSize), test.pagingFunc)
    91  
    92  			err = iterator.FetchAll()
    93  			if test.expectedError == nil {
    94  				require.NoError(t, err)
    95  			} else {
    96  				require.Error(t, err)
    97  				require.Contains(t, err.Error(), test.expectedError.Error())
    98  			}
    99  		})
   100  	}
   101  }