@@ -19,17 +19,19 @@ func Test_optionalPaginationParams(t *testing.T) {
1919 name : "valid pagination parameters" ,
2020 args : map [string ]any {
2121 "page" : float64 (1 ),
22- "perPage" : float64 (31 ),
22+ "perPage" : float64 (25 ),
2323 },
2424 expected : buildkite.ListOptions {
2525 Page : 1 ,
26- PerPage : 31 ,
26+ PerPage : 25 ,
2727 },
2828 expectErr : false ,
2929 },
3030 {
3131 name : "missing pagination parameters should use new defaults (1 per page)" ,
32- args : map [string ]any {},
32+ args : map [string ]any {
33+ "name" : "test-name" ,
34+ },
3335 expected : buildkite.ListOptions {
3436 Page : 1 ,
3537 PerPage : 1 ,
@@ -54,6 +56,186 @@ func Test_optionalPaginationParams(t *testing.T) {
5456 }
5557}
5658
59+ func Test_getClientSidePaginationParams (t * testing.T ) {
60+ tests := []struct {
61+ name string
62+ args map [string ]any
63+ expectedParams ClientSidePaginationParams
64+ }{
65+ {
66+ name : "valid pagination parameters" ,
67+ args : map [string ]any {
68+ "page" : float64 (2 ),
69+ "perPage" : float64 (10 ),
70+ },
71+ expectedParams : ClientSidePaginationParams {
72+ Page : 2 ,
73+ PerPage : 10 ,
74+ },
75+ },
76+ {
77+ name : "only page parameter" ,
78+ args : map [string ]any {
79+ "page" : float64 (3 ),
80+ },
81+ expectedParams : ClientSidePaginationParams {
82+ Page : 3 ,
83+ PerPage : 25 , // default
84+ },
85+ },
86+ {
87+ name : "only perPage parameter" ,
88+ args : map [string ]any {
89+ "perPage" : float64 (50 ),
90+ },
91+ expectedParams : ClientSidePaginationParams {
92+ Page : 1 , // default
93+ PerPage : 50 ,
94+ },
95+ },
96+ {
97+ name : "no pagination parameters" ,
98+ args : map [string ]any {
99+ "name" : "test-name" ,
100+ },
101+ expectedParams : ClientSidePaginationParams {
102+ Page : 1 , // default
103+ PerPage : 25 , // default
104+ },
105+ },
106+ }
107+
108+ for _ , tt := range tests {
109+ t .Run (tt .name , func (t * testing.T ) {
110+ assert := require .New (t )
111+ req := createMCPRequest (t , tt .args )
112+
113+ params := getClientSidePaginationParams (req )
114+ assert .Equal (tt .expectedParams , params )
115+ })
116+ }
117+ }
118+
119+ func Test_applyClientSidePagination (t * testing.T ) {
120+ tests := []struct {
121+ name string
122+ items []string
123+ params ClientSidePaginationParams
124+ expectedResult ClientSidePaginatedResult [string ]
125+ }{
126+ {
127+ name : "first page with items" ,
128+ items : []string {"item1" , "item2" , "item3" , "item4" , "item5" },
129+ params : ClientSidePaginationParams {
130+ Page : 1 ,
131+ PerPage : 2 ,
132+ },
133+ expectedResult : ClientSidePaginatedResult [string ]{
134+ Items : []string {"item1" , "item2" },
135+ Page : 1 ,
136+ PerPage : 2 ,
137+ Total : 5 ,
138+ TotalPages : 3 ,
139+ HasNext : true ,
140+ HasPrev : false ,
141+ },
142+ },
143+ {
144+ name : "middle page" ,
145+ items : []string {"item1" , "item2" , "item3" , "item4" , "item5" },
146+ params : ClientSidePaginationParams {
147+ Page : 2 ,
148+ PerPage : 2 ,
149+ },
150+ expectedResult : ClientSidePaginatedResult [string ]{
151+ Items : []string {"item3" , "item4" },
152+ Page : 2 ,
153+ PerPage : 2 ,
154+ Total : 5 ,
155+ TotalPages : 3 ,
156+ HasNext : true ,
157+ HasPrev : true ,
158+ },
159+ },
160+ {
161+ name : "last page" ,
162+ items : []string {"item1" , "item2" , "item3" , "item4" , "item5" },
163+ params : ClientSidePaginationParams {
164+ Page : 3 ,
165+ PerPage : 2 ,
166+ },
167+ expectedResult : ClientSidePaginatedResult [string ]{
168+ Items : []string {"item5" },
169+ Page : 3 ,
170+ PerPage : 2 ,
171+ Total : 5 ,
172+ TotalPages : 3 ,
173+ HasNext : false ,
174+ HasPrev : true ,
175+ },
176+ },
177+ {
178+ name : "page beyond available data" ,
179+ items : []string {"item1" , "item2" },
180+ params : ClientSidePaginationParams {
181+ Page : 5 ,
182+ PerPage : 2 ,
183+ },
184+ expectedResult : ClientSidePaginatedResult [string ]{
185+ Items : []string {},
186+ Page : 5 ,
187+ PerPage : 2 ,
188+ Total : 2 ,
189+ TotalPages : 1 ,
190+ HasNext : false ,
191+ HasPrev : true ,
192+ },
193+ },
194+ {
195+ name : "empty items" ,
196+ items : []string {},
197+ params : ClientSidePaginationParams {
198+ Page : 1 ,
199+ PerPage : 10 ,
200+ },
201+ expectedResult : ClientSidePaginatedResult [string ]{
202+ Items : []string {},
203+ Page : 1 ,
204+ PerPage : 10 ,
205+ Total : 0 ,
206+ TotalPages : 1 ,
207+ HasNext : false ,
208+ HasPrev : false ,
209+ },
210+ },
211+ {
212+ name : "page size larger than total items" ,
213+ items : []string {"item1" , "item2" },
214+ params : ClientSidePaginationParams {
215+ Page : 1 ,
216+ PerPage : 10 ,
217+ },
218+ expectedResult : ClientSidePaginatedResult [string ]{
219+ Items : []string {"item1" , "item2" },
220+ Page : 1 ,
221+ PerPage : 10 ,
222+ Total : 2 ,
223+ TotalPages : 1 ,
224+ HasNext : false ,
225+ HasPrev : false ,
226+ },
227+ },
228+ }
229+
230+ for _ , tt := range tests {
231+ t .Run (tt .name , func (t * testing.T ) {
232+ assert := require .New (t )
233+ result := applyClientSidePagination (tt .items , tt .params )
234+ assert .Equal (tt .expectedResult , result )
235+ })
236+ }
237+ }
238+
57239func createMCPRequest (t * testing.T , args map [string ]any ) mcp.CallToolRequest {
58240 t .Helper ()
59241 return mcp.CallToolRequest {
0 commit comments