@@ -218,3 +218,50 @@ def test_pull_through_metadata(python_remote_factory, python_distribution_factor
218218 r = requests .get (url2 )
219219 assert r .status_code == 200
220220 assert sha256 (r .content ).hexdigest () == package2 .metadata_digests ["sha256" ]
221+
222+
223+ @pytest .mark .parallel
224+ def test_pull_through_metadata_with_repo (
225+ python_repo_factory ,
226+ python_remote_factory ,
227+ python_distribution_factory ,
228+ pulpcore_bindings ,
229+ ):
230+ """Tests that metadata is correctly saved when using pull-through with a repository."""
231+ remote = python_remote_factory (url = PYPI_URL , includes = ["pip" ])
232+ repo = python_repo_factory ()
233+ distro = python_distribution_factory (repository = repo .pulp_href , remote = remote .pulp_href )
234+
235+ pip_url = f"{ distro .base_url } simple/pip/"
236+ project_page = ProjectPage .from_response (requests .get (pip_url ), "pip" )
237+ filename = "pip-26.0.1-py3-none-any.whl"
238+ package = next (p for p in project_page .packages if p .filename == filename )
239+ assert package .has_metadata
240+ assert "?redirect=" in package .url
241+
242+ # Retrieve the metadata and assert the content was not saved to the repository
243+ parts = urlsplit (package .url )
244+ url = urlunsplit ((parts [0 ], parts [1 ], parts [2 ] + ".metadata" , parts [3 ], parts [4 ]))
245+ r = requests .get (url )
246+ assert r .status_code == 200
247+ assert sha256 (r .content ).hexdigest () == package .metadata_digests ["sha256" ]
248+ project_page = ProjectPage .from_response (requests .get (pip_url ), "pip" )
249+ package = next (p for p in project_page .packages if p .filename == filename )
250+ assert package .has_metadata
251+ assert "?redirect=" in package .url
252+
253+ # Now retrieve the package and assert the content was saved with metadata
254+ r = requests .get (package .url )
255+ assert r .status_code == 200
256+ pa = pulpcore_bindings .ArtifactsApi .list (sha256 = package .digests ["sha256" ])
257+ assert pa .count == 1
258+ ma = pulpcore_bindings .ArtifactsApi .list (sha256 = package .metadata_digests ["sha256" ])
259+ assert ma .count == 1
260+
261+ # Check the simple page is updated to point to the local repository
262+ project_page = ProjectPage .from_response (requests .get (pip_url ), "pip" )
263+ package = next (p for p in project_page .packages if p .filename == filename )
264+ assert "?redirect=" not in package .url
265+ r = requests .get (package .metadata_url )
266+ assert r .status_code == 200
267+ assert sha256 (r .content ).hexdigest () == package .metadata_digests ["sha256" ]
0 commit comments