|
22 | 22 | from warehouse.packaging.utils import API_VERSION, _valid_simple_detail_context
|
23 | 23 |
|
24 | 24 | from ...common.db.accounts import UserFactory
|
| 25 | +from ...common.db.organizations import ( |
| 26 | + NamespaceFactory, |
| 27 | + OrganizationFactory, |
| 28 | + OrganizationProjectFactory, |
| 29 | +) |
25 | 30 | from ...common.db.packaging import (
|
26 | 31 | AlternateRepositoryFactory,
|
27 | 32 | FileFactory,
|
@@ -221,6 +226,7 @@ def test_no_files_no_serial(self, db_request, content_type, renderer_override):
|
221 | 226 | "files": [],
|
222 | 227 | "versions": [],
|
223 | 228 | "alternate-locations": [],
|
| 229 | + "namespace": None, |
224 | 230 | }
|
225 | 231 | context = _update_context(context, content_type, renderer_override)
|
226 | 232 | assert simple.simple_detail(project, db_request) == context
|
@@ -253,6 +259,92 @@ def test_no_files_with_serial(self, db_request, content_type, renderer_override)
|
253 | 259 | "files": [],
|
254 | 260 | "versions": [],
|
255 | 261 | "alternate-locations": sorted(al.url for al in als),
|
| 262 | + "namespace": None, |
| 263 | + } |
| 264 | + context = _update_context(context, content_type, renderer_override) |
| 265 | + assert simple.simple_detail(project, db_request) == context |
| 266 | + |
| 267 | + assert db_request.response.headers["X-PyPI-Last-Serial"] == str(je.id) |
| 268 | + assert db_request.response.content_type == content_type |
| 269 | + _assert_has_cors_headers(db_request.response.headers) |
| 270 | + |
| 271 | + if renderer_override is not None: |
| 272 | + assert db_request.override_renderer == renderer_override |
| 273 | + |
| 274 | + @pytest.mark.parametrize( |
| 275 | + ("content_type", "renderer_override"), |
| 276 | + CONTENT_TYPE_PARAMS, |
| 277 | + ) |
| 278 | + def test_with_namespaces_authorized( |
| 279 | + self, db_request, content_type, renderer_override |
| 280 | + ): |
| 281 | + db_request.accept = content_type |
| 282 | + org = OrganizationFactory.create() |
| 283 | + namespace = NamespaceFactory.create(owner=org) |
| 284 | + project = ProjectFactory.create(name=f"{namespace.name}-foo") |
| 285 | + OrganizationProjectFactory.create(organization=org, project=project) |
| 286 | + db_request.matchdict["name"] = project.normalized_name |
| 287 | + user = UserFactory.create() |
| 288 | + je = JournalEntryFactory.create(name=project.name, submitted_by=user) |
| 289 | + als = [ |
| 290 | + AlternateRepositoryFactory.create(project=project), |
| 291 | + AlternateRepositoryFactory.create(project=project), |
| 292 | + ] |
| 293 | + |
| 294 | + context = { |
| 295 | + "meta": {"_last-serial": je.id, "api-version": API_VERSION}, |
| 296 | + "name": project.normalized_name, |
| 297 | + "files": [], |
| 298 | + "versions": [], |
| 299 | + "alternate-locations": sorted(al.url for al in als), |
| 300 | + "namespace": { |
| 301 | + "prefix": namespace.normalized_name, |
| 302 | + "open": namespace.is_open, |
| 303 | + "authorized": True, |
| 304 | + }, |
| 305 | + } |
| 306 | + context = _update_context(context, content_type, renderer_override) |
| 307 | + assert simple.simple_detail(project, db_request) == context |
| 308 | + |
| 309 | + assert db_request.response.headers["X-PyPI-Last-Serial"] == str(je.id) |
| 310 | + assert db_request.response.content_type == content_type |
| 311 | + _assert_has_cors_headers(db_request.response.headers) |
| 312 | + |
| 313 | + if renderer_override is not None: |
| 314 | + assert db_request.override_renderer == renderer_override |
| 315 | + |
| 316 | + @pytest.mark.parametrize( |
| 317 | + ("content_type", "renderer_override"), |
| 318 | + CONTENT_TYPE_PARAMS, |
| 319 | + ) |
| 320 | + def test_with_namespaces_not_authorized( |
| 321 | + self, db_request, content_type, renderer_override |
| 322 | + ): |
| 323 | + db_request.accept = content_type |
| 324 | + org = OrganizationFactory.create() |
| 325 | + namespace = NamespaceFactory.create(owner=org) |
| 326 | + project = ProjectFactory.create(name=f"{namespace.name}-foo") |
| 327 | + project2 = ProjectFactory.create(name=f"{namespace.name}-foo2") |
| 328 | + OrganizationProjectFactory.create(organization=org, project=project2) |
| 329 | + db_request.matchdict["name"] = project.normalized_name |
| 330 | + user = UserFactory.create() |
| 331 | + je = JournalEntryFactory.create(name=project.name, submitted_by=user) |
| 332 | + als = [ |
| 333 | + AlternateRepositoryFactory.create(project=project), |
| 334 | + AlternateRepositoryFactory.create(project=project), |
| 335 | + ] |
| 336 | + |
| 337 | + context = { |
| 338 | + "meta": {"_last-serial": je.id, "api-version": API_VERSION}, |
| 339 | + "name": project.normalized_name, |
| 340 | + "files": [], |
| 341 | + "versions": [], |
| 342 | + "alternate-locations": sorted(al.url for al in als), |
| 343 | + "namespace": { |
| 344 | + "prefix": namespace.normalized_name, |
| 345 | + "open": namespace.is_open, |
| 346 | + "authorized": False, |
| 347 | + }, |
256 | 348 | }
|
257 | 349 | context = _update_context(context, content_type, renderer_override)
|
258 | 350 | assert simple.simple_detail(project, db_request) == context
|
@@ -305,6 +397,7 @@ def test_with_files_no_serial(self, db_request, content_type, renderer_override)
|
305 | 397 | for f in files
|
306 | 398 | ],
|
307 | 399 | "alternate-locations": [],
|
| 400 | + "namespace": None, |
308 | 401 | }
|
309 | 402 | context = _update_context(context, content_type, renderer_override)
|
310 | 403 | assert simple.simple_detail(project, db_request) == context
|
@@ -357,6 +450,7 @@ def test_with_files_with_serial(self, db_request, content_type, renderer_overrid
|
357 | 450 | for f in files
|
358 | 451 | ],
|
359 | 452 | "alternate-locations": [],
|
| 453 | + "namespace": None, |
360 | 454 | }
|
361 | 455 | context = _update_context(context, content_type, renderer_override)
|
362 | 456 | assert simple.simple_detail(project, db_request) == context
|
@@ -454,6 +548,7 @@ def test_with_files_with_version_multi_digit(
|
454 | 548 | for f in files
|
455 | 549 | ],
|
456 | 550 | "alternate-locations": [],
|
| 551 | + "namespace": None, |
457 | 552 | }
|
458 | 553 | context = _update_context(context, content_type, renderer_override)
|
459 | 554 | assert simple.simple_detail(project, db_request) == context
|
@@ -486,6 +581,7 @@ def test_with_files_quarantined_omitted_from_index(
|
486 | 581 | "files": [],
|
487 | 582 | "versions": [],
|
488 | 583 | "alternate-locations": [],
|
| 584 | + "namespace": None, |
489 | 585 | }
|
490 | 586 | context = _update_context(context, content_type, renderer_override)
|
491 | 587 |
|
@@ -606,6 +702,7 @@ def route_url(route, **kw):
|
606 | 702 | for f in files
|
607 | 703 | ],
|
608 | 704 | "alternate-locations": [],
|
| 705 | + "namespace": None, |
609 | 706 | }
|
610 | 707 | context = _update_context(context, content_type, renderer_override)
|
611 | 708 |
|
|
0 commit comments