@@ -147,6 +147,85 @@ module('Mirage | GET /api/v1/crates/:name/versions', function (hooks) {
147147 }
148148 } ) ;
149149
150+ test ( 'supports seek pagination' , async function ( assert ) {
151+ let user = this . server . create ( 'user' ) ;
152+ let crate = this . server . create ( 'crate' , { name : 'rand' } ) ;
153+ this . server . create ( 'version' , { crate, num : '1.0.0' , created_at : '2010-06-16T21:30:45Z' } ) ;
154+ this . server . create ( 'version' , { crate, num : '1.2.0' , rust_version : '1.69' , created_at : '2010-06-16T21:30:46Z' } ) ;
155+ this . server . create ( 'version' , { crate, num : '1.1.0' , publishedBy : user , created_at : '2010-06-16T21:30:47Z' } ) ;
156+
157+ async function seek_forwards ( queryParams ) {
158+ let calls = 0 ;
159+ let next_page ;
160+ let responses = [ ] ;
161+ let base_url = '/api/v1/crates/rand/versions' ;
162+ let params = new URLSearchParams ( queryParams ) ;
163+ let url = `${ base_url } ?${ params } ` ;
164+ while ( ( calls == 0 || next_page ) && calls < 10 ) {
165+ if ( next_page ) {
166+ url = `${ base_url } ${ next_page } ` ;
167+ }
168+ let response = await fetch ( url ) ;
169+ calls += 1 ;
170+ assert . strictEqual ( response . status , 200 ) ;
171+ let json = await response . json ( ) ;
172+ responses . push ( json ) ;
173+ next_page = json . meta . next_page ;
174+ if ( next_page == null ) {
175+ break ;
176+ }
177+ }
178+ return responses ;
179+ }
180+
181+ // sort by `semver` by default
182+ {
183+ let responses = await seek_forwards ( { per_page : 1 } ) ;
184+ assert . deepEqual (
185+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
186+ [ [ '1.2.0' ] , [ '1.1.0' ] , [ '1.0.0' ] , [ ] ] ,
187+ ) ;
188+ assert . deepEqual (
189+ responses . map ( it => it . meta . next_page ) ,
190+ [ '?per_page=1&seek=1.2.0' , '?per_page=1&seek=1.1.0' , '?per_page=1&seek=1.0.0' , null ] ,
191+ ) ;
192+ }
193+
194+ {
195+ let responses = await seek_forwards ( { per_page : 1 , sort : 'semver' } ) ;
196+ assert . deepEqual (
197+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
198+ [ [ '1.2.0' ] , [ '1.1.0' ] , [ '1.0.0' ] , [ ] ] ,
199+ ) ;
200+ assert . deepEqual (
201+ responses . map ( it => it . meta . next_page ) ,
202+ [
203+ '?per_page=1&sort=semver&seek=1.2.0' ,
204+ '?per_page=1&sort=semver&seek=1.1.0' ,
205+ '?per_page=1&sort=semver&seek=1.0.0' ,
206+ null ,
207+ ] ,
208+ ) ;
209+ }
210+
211+ {
212+ let responses = await seek_forwards ( { per_page : 1 , sort : 'date' } ) ;
213+ assert . deepEqual (
214+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
215+ [ [ '1.1.0' ] , [ '1.2.0' ] , [ '1.0.0' ] , [ ] ] ,
216+ ) ;
217+ assert . deepEqual (
218+ responses . map ( it => it . meta . next_page ) ,
219+ [
220+ '?per_page=1&sort=date&seek=1.1.0' ,
221+ '?per_page=1&sort=date&seek=1.2.0' ,
222+ '?per_page=1&sort=date&seek=1.0.0' ,
223+ null ,
224+ ] ,
225+ ) ;
226+ }
227+ } ) ;
228+
150229 test ( 'supports multiple `ids[]` parameters' , async function ( assert ) {
151230 let user = this . server . create ( 'user' ) ;
152231 let crate = this . server . create ( 'crate' , { name : 'rand' } ) ;
0 commit comments