Skip to content

Commit dafe23a

Browse files
test: added unit tests for pagination
1 parent cd47cc3 commit dafe23a

File tree

2 files changed

+203
-0
lines changed

2 files changed

+203
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package pagination
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
getter "github.com/krateoplatformops/rest-dynamic-controller/internal/tools/definitiongetter"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestContinuationTokenPaginator(t *testing.T) {
13+
t.Run("Init", func(t *testing.T) {
14+
// Pre-set values to check they get reset
15+
p := &continuationTokenPaginator{
16+
nextToken: "some-token",
17+
isFirstCall: false,
18+
}
19+
p.Init()
20+
assert.Equal(t, "", p.nextToken)
21+
assert.True(t, p.isFirstCall)
22+
})
23+
24+
t.Run("UpdateRequestQueryFirstCall", func(t *testing.T) {
25+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
26+
Request: getter.ContinuationTokenRequest{
27+
TokenIn: "query",
28+
TokenPath: "continue",
29+
},
30+
})
31+
p.Init()
32+
req := httptest.NewRequest("GET", "http://example.com", nil)
33+
err := p.UpdateRequest(req)
34+
assert.NoError(t, err)
35+
assert.Equal(t, "", req.URL.Query().Get("continue"))
36+
})
37+
38+
t.Run("UpdateRequestQuerySecondCall", func(t *testing.T) {
39+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
40+
Request: getter.ContinuationTokenRequest{
41+
TokenIn: "query",
42+
TokenPath: "continue",
43+
},
44+
})
45+
p.Init()
46+
// First call
47+
req := httptest.NewRequest("GET", "http://example.com", nil)
48+
err := p.UpdateRequest(req)
49+
assert.NoError(t, err)
50+
assert.Equal(t, "", req.URL.Query().Get("continue"))
51+
52+
// Second call
53+
cp := p.(*continuationTokenPaginator)
54+
cp.nextToken = "next-page-token"
55+
req = httptest.NewRequest("GET", "http://example.com", nil)
56+
err = p.UpdateRequest(req)
57+
assert.NoError(t, err)
58+
assert.Equal(t, "next-page-token", req.URL.Query().Get("continue"))
59+
})
60+
61+
t.Run("UpdateRequestHeaderFirstCall", func(t *testing.T) {
62+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
63+
Request: getter.ContinuationTokenRequest{
64+
TokenIn: "header",
65+
TokenPath: "X-Continue",
66+
},
67+
})
68+
p.Init()
69+
req := httptest.NewRequest("GET", "http://example.com", nil)
70+
err := p.UpdateRequest(req)
71+
assert.NoError(t, err)
72+
assert.Equal(t, "", req.Header.Get("X-Continue"))
73+
})
74+
75+
t.Run("UpdateRequestHeaderSecondCall", func(t *testing.T) {
76+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
77+
Request: getter.ContinuationTokenRequest{
78+
TokenIn: "header",
79+
TokenPath: "X-Continue",
80+
},
81+
})
82+
p.Init()
83+
// First call
84+
req := httptest.NewRequest("GET", "http://example.com", nil)
85+
err := p.UpdateRequest(req)
86+
assert.NoError(t, err)
87+
88+
// Second call
89+
cp := p.(*continuationTokenPaginator)
90+
cp.nextToken = "next-page-token"
91+
req = httptest.NewRequest("GET", "http://example.com", nil)
92+
err = p.UpdateRequest(req)
93+
assert.NoError(t, err)
94+
assert.Equal(t, "next-page-token", req.Header.Get("X-Continue"))
95+
})
96+
97+
t.Run("ShouldContinueHeader", func(t *testing.T) {
98+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
99+
Response: getter.ContinuationTokenResponse{
100+
TokenIn: "header",
101+
TokenPath: "X-Next-Token",
102+
},
103+
})
104+
p.Init()
105+
resp := &http.Response{
106+
Header: http.Header{},
107+
}
108+
resp.Header.Set("X-Next-Token", "new-token")
109+
shouldContinue, err := p.ShouldContinue(resp, nil)
110+
assert.NoError(t, err)
111+
assert.True(t, shouldContinue)
112+
cp := p.(*continuationTokenPaginator)
113+
assert.Equal(t, "new-token", cp.nextToken)
114+
})
115+
116+
t.Run("ShouldContinueHeaderNoToken", func(t *testing.T) {
117+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
118+
Response: getter.ContinuationTokenResponse{
119+
TokenIn: "header",
120+
TokenPath: "X-Next-Token",
121+
},
122+
})
123+
p.Init()
124+
resp := &http.Response{
125+
Header: http.Header{},
126+
}
127+
shouldContinue, err := p.ShouldContinue(resp, nil)
128+
assert.NoError(t, err)
129+
assert.False(t, shouldContinue)
130+
cp := p.(*continuationTokenPaginator)
131+
assert.Equal(t, "", cp.nextToken)
132+
})
133+
134+
t.Run("ShouldContinueUnsupported", func(t *testing.T) {
135+
p := NewContinuationTokenPaginator(&getter.ContinuationTokenConfig{
136+
Response: getter.ContinuationTokenResponse{
137+
TokenIn: "unsupported",
138+
},
139+
})
140+
p.Init()
141+
resp := &http.Response{}
142+
shouldContinue, err := p.ShouldContinue(resp, nil)
143+
assert.Error(t, err)
144+
assert.False(t, shouldContinue)
145+
})
146+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package pagination
2+
3+
import (
4+
"testing"
5+
6+
getter "github.com/krateoplatformops/rest-dynamic-controller/internal/tools/definitiongetter"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestNewPaginator(t *testing.T) {
11+
t.Run("NoPagination", func(t *testing.T) {
12+
paginator, err := NewPaginator(nil)
13+
assert.NoError(t, err)
14+
assert.Nil(t, paginator)
15+
})
16+
17+
t.Run("UnsupportedPaginationType", func(t *testing.T) {
18+
config := &getter.Pagination{
19+
Type: "unsupported",
20+
}
21+
paginator, err := NewPaginator(config)
22+
assert.Error(t, err)
23+
assert.Nil(t, paginator)
24+
assert.Equal(t, "unsupported pagination type: unsupported", err.Error())
25+
})
26+
27+
t.Run("ContinuationTokenSuccess", func(t *testing.T) {
28+
config := &getter.Pagination{
29+
Type: "continuationToken",
30+
ContinuationToken: &getter.ContinuationTokenConfig{
31+
Request: getter.ContinuationTokenRequest{
32+
TokenIn: "query",
33+
TokenPath: "continue",
34+
},
35+
Response: getter.ContinuationTokenResponse{
36+
TokenIn: "body",
37+
TokenPath: "metadata.continue",
38+
},
39+
},
40+
}
41+
paginator, err := NewPaginator(config)
42+
assert.NoError(t, err)
43+
assert.NotNil(t, paginator)
44+
_, ok := paginator.(*continuationTokenPaginator)
45+
assert.True(t, ok)
46+
})
47+
48+
t.Run("ContinuationTokenMissingConfig", func(t *testing.T) {
49+
config := &getter.Pagination{
50+
Type: "continuationToken",
51+
}
52+
paginator, err := NewPaginator(config)
53+
assert.Error(t, err)
54+
assert.Nil(t, paginator)
55+
assert.Equal(t, "pagination type is 'continuationToken' but the continuationToken config block is missing", err.Error())
56+
})
57+
}

0 commit comments

Comments
 (0)