@@ -104,6 +104,45 @@ test('returns all versions belonging to the specified crate', async function ()
104
104
} ) ;
105
105
} ) ;
106
106
107
+ test ( 'supports `sort` parameters' , async function ( ) {
108
+ let user = db . user . create ( ) ;
109
+ let crate = db . crate . create ( { name : 'rand' } ) ;
110
+ db . version . create ( { crate, num : '1.0.0' } ) ;
111
+ db . version . create ( { crate, num : '2.0.0-alpha' , publishedBy : user } ) ;
112
+ db . version . create ( { crate, num : '1.1.0' , rust_version : '1.69' } ) ;
113
+
114
+ // sort by `semver` by default
115
+ {
116
+ let response = await fetch ( '/api/v1/crates/rand/versions' ) ;
117
+ assert . strictEqual ( response . status , 200 ) ;
118
+ let json = await response . json ( ) ;
119
+ assert . deepEqual (
120
+ json . versions . map ( it => it . num ) ,
121
+ [ '2.0.0-alpha' , '1.1.0' , '1.0.0' ] ,
122
+ ) ;
123
+ }
124
+
125
+ {
126
+ let response = await fetch ( '/api/v1/crates/rand/versions?sort=semver' ) ;
127
+ assert . strictEqual ( response . status , 200 ) ;
128
+ let json = await response . json ( ) ;
129
+ assert . deepEqual (
130
+ json . versions . map ( it => it . num ) ,
131
+ [ '2.0.0-alpha' , '1.1.0' , '1.0.0' ] ,
132
+ ) ;
133
+ }
134
+
135
+ {
136
+ let response = await fetch ( '/api/v1/crates/rand/versions?sort=date' ) ;
137
+ assert . strictEqual ( response . status , 200 ) ;
138
+ let json = await response . json ( ) ;
139
+ assert . deepEqual (
140
+ json . versions . map ( it => it . num ) ,
141
+ [ '1.1.0' , '2.0.0-alpha' , '1.0.0' ] ,
142
+ ) ;
143
+ }
144
+ } ) ;
145
+
107
146
test ( 'supports multiple `ids[]` parameters' , async function ( ) {
108
147
let user = db . user . create ( ) ;
109
148
let crate = db . crate . create ( { name : 'rand' } ) ;
@@ -119,6 +158,85 @@ test('supports multiple `ids[]` parameters', async function () {
119
158
) ;
120
159
} ) ;
121
160
161
+ test ( 'supports seek pagination' , async function ( ) {
162
+ let user = db . user . create ( ) ;
163
+ let crate = db . crate . create ( { name : 'rand' } ) ;
164
+ db . version . create ( { crate, num : '1.0.0' } ) ;
165
+ db . version . create ( { crate, num : '2.0.0-alpha' , publishedBy : user } ) ;
166
+ db . version . create ( { crate, num : '1.1.0' , rust_version : '1.69' } ) ;
167
+
168
+ async function seek_forwards ( queryParams ) {
169
+ let calls = 0 ;
170
+ let next_page ;
171
+ let responses = [ ] ;
172
+ let base_url = '/api/v1/crates/rand/versions' ;
173
+ let params = new URLSearchParams ( queryParams ) ;
174
+ let url = `${ base_url } ?${ params } ` ;
175
+ while ( ( calls == 0 || next_page ) && calls < 50 ) {
176
+ if ( next_page ) {
177
+ url = `${ base_url } ${ next_page } ` ;
178
+ }
179
+ let response = await fetch ( url ) ;
180
+ calls += 1 ;
181
+ assert . strictEqual ( response . status , 200 ) ;
182
+ let json = await response . json ( ) ;
183
+ responses . push ( json ) ;
184
+ next_page = json . meta . next_page ;
185
+ if ( next_page == null ) {
186
+ break ;
187
+ }
188
+ }
189
+ return responses ;
190
+ }
191
+
192
+ // sort by `semver` by default
193
+ {
194
+ let responses = await seek_forwards ( { per_page : 1 } ) ;
195
+ assert . deepEqual (
196
+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
197
+ [ [ '2.0.0-alpha' ] , [ '1.1.0' ] , [ '1.0.0' ] , [ ] ] ,
198
+ ) ;
199
+ assert . deepEqual (
200
+ responses . map ( it => it . meta . next_page ) ,
201
+ [ '?per_page=1&seek=2.0.0-alpha' , '?per_page=1&seek=1.1.0' , '?per_page=1&seek=1.0.0' , null ] ,
202
+ ) ;
203
+ }
204
+
205
+ {
206
+ let responses = await seek_forwards ( { per_page : 1 , sort : 'semver' } ) ;
207
+ assert . deepEqual (
208
+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
209
+ [ [ '2.0.0-alpha' ] , [ '1.1.0' ] , [ '1.0.0' ] , [ ] ] ,
210
+ ) ;
211
+ assert . deepEqual (
212
+ responses . map ( it => it . meta . next_page ) ,
213
+ [
214
+ '?per_page=1&sort=semver&seek=2.0.0-alpha' ,
215
+ '?per_page=1&sort=semver&seek=1.1.0' ,
216
+ '?per_page=1&sort=semver&seek=1.0.0' ,
217
+ null ,
218
+ ] ,
219
+ ) ;
220
+ }
221
+
222
+ {
223
+ let responses = await seek_forwards ( { per_page : 1 , sort : 'date' } ) ;
224
+ assert . deepEqual (
225
+ responses . map ( it => it . versions . map ( v => v . num ) ) ,
226
+ [ [ '1.1.0' ] , [ '2.0.0-alpha' ] , [ '1.0.0' ] , [ ] ] ,
227
+ ) ;
228
+ assert . deepEqual (
229
+ responses . map ( it => it . meta . next_page ) ,
230
+ [
231
+ '?per_page=1&sort=date&seek=1.1.0' ,
232
+ '?per_page=1&sort=date&seek=2.0.0-alpha' ,
233
+ '?per_page=1&sort=date&seek=1.0.0' ,
234
+ null ,
235
+ ] ,
236
+ ) ;
237
+ }
238
+ } ) ;
239
+
122
240
test ( 'include `release_tracks` meta' , async function ( ) {
123
241
let user = db . user . create ( ) ;
124
242
let crate = db . crate . create ( { name : 'rand' } ) ;
0 commit comments