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 }