13
13
import pretend
14
14
import pytest
15
15
16
+ from packaging .version import parse
16
17
from pyramid .httpexceptions import HTTPMovedPermanently
17
18
from pyramid .testing import DummyRequest
18
19
19
20
from warehouse .api import simple
21
+ from warehouse .packaging .utils import API_VERSION
20
22
21
23
from ...common .db .accounts import UserFactory
22
24
from ...common .db .packaging import (
@@ -81,7 +83,7 @@ class TestSimpleIndex:
81
83
def test_no_results_no_serial (self , db_request , content_type , renderer_override ):
82
84
db_request .accept = content_type
83
85
assert simple .simple_index (db_request ) == {
84
- "meta" : {"_last-serial" : 0 , "api-version" : "1.0" },
86
+ "meta" : {"_last-serial" : 0 , "api-version" : API_VERSION },
85
87
"projects" : [],
86
88
}
87
89
assert db_request .response .headers ["X-PyPI-Last-Serial" ] == "0"
@@ -99,7 +101,7 @@ def test_no_results_with_serial(self, db_request, content_type, renderer_overrid
99
101
user = UserFactory .create ()
100
102
je = JournalEntryFactory .create (submitted_by = user )
101
103
assert simple .simple_index (db_request ) == {
102
- "meta" : {"_last-serial" : je .id , "api-version" : "1.0" },
104
+ "meta" : {"_last-serial" : je .id , "api-version" : API_VERSION },
103
105
"projects" : [],
104
106
}
105
107
assert db_request .response .headers ["X-PyPI-Last-Serial" ] == str (je .id )
@@ -119,7 +121,7 @@ def test_with_results_no_serial(self, db_request, content_type, renderer_overrid
119
121
for x in [ProjectFactory .create () for _ in range (3 )]
120
122
]
121
123
assert simple .simple_index (db_request ) == {
122
- "meta" : {"_last-serial" : 0 , "api-version" : "1.0" },
124
+ "meta" : {"_last-serial" : 0 , "api-version" : API_VERSION },
123
125
"projects" : [
124
126
{"name" : x [0 ], "_last-serial" : 0 }
125
127
for x in sorted (projects , key = lambda x : x [1 ])
@@ -147,7 +149,7 @@ def test_with_results_with_serial(
147
149
je = JournalEntryFactory .create (submitted_by = user )
148
150
149
151
assert simple .simple_index (db_request ) == {
150
- "meta" : {"_last-serial" : je .id , "api-version" : "1.0" },
152
+ "meta" : {"_last-serial" : je .id , "api-version" : API_VERSION },
151
153
"projects" : [
152
154
{"name" : x [0 ], "_last-serial" : 0 }
153
155
for x in sorted (projects , key = lambda x : x [1 ])
@@ -187,9 +189,10 @@ def test_no_files_no_serial(self, db_request, content_type, renderer_override):
187
189
JournalEntryFactory .create (submitted_by = user )
188
190
189
191
assert simple .simple_detail (project , db_request ) == {
190
- "meta" : {"_last-serial" : 0 , "api-version" : "1.0" },
192
+ "meta" : {"_last-serial" : 0 , "api-version" : API_VERSION },
191
193
"name" : project .normalized_name ,
192
194
"files" : [],
195
+ "versions" : [],
193
196
}
194
197
195
198
assert db_request .response .headers ["X-PyPI-Last-Serial" ] == "0"
@@ -210,9 +213,10 @@ def test_no_files_with_serial(self, db_request, content_type, renderer_override)
210
213
je = JournalEntryFactory .create (name = project .name , submitted_by = user )
211
214
212
215
assert simple .simple_detail (project , db_request ) == {
213
- "meta" : {"_last-serial" : je .id , "api-version" : "1.0" },
216
+ "meta" : {"_last-serial" : je .id , "api-version" : API_VERSION },
214
217
"name" : project .normalized_name ,
215
218
"files" : [],
219
+ "versions" : [],
216
220
}
217
221
218
222
assert db_request .response .headers ["X-PyPI-Last-Serial" ] == str (je .id )
@@ -229,6 +233,7 @@ def test_with_files_no_serial(self, db_request, content_type, renderer_override)
229
233
db_request .accept = content_type
230
234
project = ProjectFactory .create ()
231
235
releases = [ReleaseFactory .create (project = project ) for _ in range (3 )]
236
+ release_versions = sorted ([r .version for r in releases ], key = parse )
232
237
files = [
233
238
FileFactory .create (release = r , filename = f"{ project .name } -{ r .version } .tar.gz" )
234
239
for r in releases
@@ -242,15 +247,18 @@ def test_with_files_no_serial(self, db_request, content_type, renderer_override)
242
247
JournalEntryFactory .create (submitted_by = user )
243
248
244
249
assert simple .simple_detail (project , db_request ) == {
245
- "meta" : {"_last-serial" : 0 , "api-version" : "1.0" },
250
+ "meta" : {"_last-serial" : 0 , "api-version" : API_VERSION },
246
251
"name" : project .normalized_name ,
252
+ "versions" : release_versions ,
247
253
"files" : [
248
254
{
249
255
"filename" : f .filename ,
250
256
"url" : f"/file/{ f .filename } " ,
251
257
"hashes" : {"sha256" : f .sha256_digest },
252
258
"requires-python" : f .requires_python ,
253
259
"yanked" : False ,
260
+ "size" : f .size ,
261
+ "upload-time" : f .upload_time .isoformat () + "Z" ,
254
262
}
255
263
for f in files
256
264
],
@@ -270,28 +278,32 @@ def test_with_files_with_serial(self, db_request, content_type, renderer_overrid
270
278
db_request .accept = content_type
271
279
project = ProjectFactory .create ()
272
280
releases = [ReleaseFactory .create (project = project ) for _ in range (3 )]
281
+ release_versions = sorted ([r .version for r in releases ], key = parse )
273
282
files = [
274
283
FileFactory .create (release = r , filename = f"{ project .name } -{ r .version } .tar.gz" )
275
284
for r in releases
276
285
]
277
- # let's assert the result is ordered by string comparison of filename
278
- files = sorted (files , key = lambda key : key . filename )
286
+ # let's assert the result is ordered by version and filename
287
+ files = sorted (files , key = lambda f : ( parse ( f . release . version ), f . filename ) )
279
288
urls_iter = (f"/file/{ f .filename } " for f in files )
280
289
db_request .matchdict ["name" ] = project .normalized_name
281
290
db_request .route_url = lambda * a , ** kw : next (urls_iter )
282
291
user = UserFactory .create ()
283
292
je = JournalEntryFactory .create (name = project .name , submitted_by = user )
284
293
285
294
assert simple .simple_detail (project , db_request ) == {
286
- "meta" : {"_last-serial" : je .id , "api-version" : "1.0" },
295
+ "meta" : {"_last-serial" : je .id , "api-version" : API_VERSION },
287
296
"name" : project .normalized_name ,
297
+ "versions" : release_versions ,
288
298
"files" : [
289
299
{
290
300
"filename" : f .filename ,
291
301
"url" : f"/file/{ f .filename } " ,
292
302
"hashes" : {"sha256" : f .sha256_digest },
293
303
"requires-python" : f .requires_python ,
294
304
"yanked" : False ,
305
+ "size" : f .size ,
306
+ "upload-time" : f .upload_time .isoformat () + "Z" ,
295
307
}
296
308
for f in files
297
309
],
@@ -361,15 +373,18 @@ def test_with_files_with_version_multi_digit(
361
373
je = JournalEntryFactory .create (name = project .name , submitted_by = user )
362
374
363
375
assert simple .simple_detail (project , db_request ) == {
364
- "meta" : {"_last-serial" : je .id , "api-version" : "1.0" },
376
+ "meta" : {"_last-serial" : je .id , "api-version" : API_VERSION },
365
377
"name" : project .normalized_name ,
378
+ "versions" : release_versions ,
366
379
"files" : [
367
380
{
368
381
"filename" : f .filename ,
369
382
"url" : f"/file/{ f .filename } " ,
370
383
"hashes" : {"sha256" : f .sha256_digest },
371
384
"requires-python" : f .requires_python ,
372
385
"yanked" : False ,
386
+ "size" : f .size ,
387
+ "upload-time" : f .upload_time .isoformat () + "Z" ,
373
388
}
374
389
for f in files
375
390
],
0 commit comments