Skip to content

Commit

Permalink
update test
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanking13 committed Sep 19, 2024
1 parent 553388c commit cd1ae53
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 9 deletions.
2 changes: 1 addition & 1 deletion micropip/wheelinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def from_package_index(
version: Version,
sha256: str | None,
size: int | None,
data_dist_info_metadata: DistributionMetadata,
data_dist_info_metadata: DistributionMetadata = None,
) -> "WheelInfo":
"""Extract available metadata from response received from package index"""
parsed_url = urlparse(url)
Expand Down
21 changes: 14 additions & 7 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ class Wheel:
_path: Path

name: str
version: str
filename: str
top_level: str
url: str
Expand All @@ -118,24 +119,30 @@ def __enter__(self):
def __exit__(self, *args: Any):
self._httpserver.__exit__(*args)

def _register_handler(self, path: Path) -> str:
self._httpserver.expect_request(f"/{path.name}").respond_with_data(
path.read_bytes(),
def _register_handler(self, endpoint: str, data: bytes) -> str:
self._httpserver.expect_request(f"/{endpoint}").respond_with_data(
data,
content_type="application/zip",
headers={"Access-Control-Allow-Origin": "*"},
)

return self._httpserver.url_for(f"/{path.name}")
return self._httpserver.url_for(f"/{endpoint}")

def add_wheel(self, path: Path, replace: bool = True):
name = parse_wheel_filename(path.name)[0]
url = self._register_handler(path)
name, version = parse_wheel_filename(path.name)[:2]
url = self._register_handler(path.name, path.read_bytes())

metadata_file_endpoint = path.with_suffix(".whl.metadata")
metadata_file_gzipped = path.with_suffix(".whl.metadata.gz")
if metadata_file_gzipped.exists():
data = _read_gzipped_testfile(metadata_file_gzipped)
self._register_handler(metadata_file_endpoint.name, data)

if name in self._wheels and not replace:
return

self._wheels[name] = self.Wheel(
path, name, path.name, name.replace("-", "_"), url
path, name, version, path.name, name.replace("-", "_"), url
)

def get(self, name: str) -> Wheel:
Expand Down
Binary file not shown.
100 changes: 99 additions & 1 deletion tests/test_wheelinfo.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
from packaging.utils import parse_wheel_filename

from micropip.wheelinfo import WheelInfo

Expand All @@ -22,15 +23,17 @@ def test_from_package_index():
version = "0.0.1"
sha256 = "dummy-sha256"
size = 1234
data_dist_info_metadata = True

wheel = WheelInfo.from_package_index(name, filename, url, version, sha256, size)
wheel = WheelInfo.from_package_index(name, filename, url, version, sha256, size, data_dist_info_metadata)

assert wheel.name == name
assert str(wheel.version) == version
assert wheel.url == url
assert wheel.filename == filename
assert wheel.size == size
assert wheel.sha256 == sha256
assert wheel.data_dist_info_metadata == data_dist_info_metadata


def test_extract(wheel_catalog, tmp_path):
Expand Down Expand Up @@ -89,3 +92,98 @@ async def test_requires(wheel_catalog, tmp_path):
requirements_extra_testing = [str(r.name) for r in wheel.requires({"testing"})]
assert "pluggy" in requirements_extra_testing
assert "hypothesis" in requirements_extra_testing


@pytest.mark.asyncio
async def test_download_pep658_metadata(wheel_catalog):
pytest_wheel = wheel_catalog.get("pytest")
sha256 = "dummy-sha256"
size = 1234

# 1) metadata available
wheel_with_metadata = WheelInfo.from_package_index(
pytest_wheel.name,
pytest_wheel.filename,
pytest_wheel.url,
pytest_wheel.version,
sha256,
size,
data_dist_info_metadata=True,
)

assert wheel_with_metadata._metadata is None
await wheel_with_metadata.download_pep658_metadata({})
assert wheel_with_metadata._metadata is not None

# metadata should be calculated from the metadata file
deps = wheel_with_metadata._metadata.deps
assert None in deps
assert "testing" in deps

# 2) metadata not available
wheel_without_metadata = WheelInfo.from_package_index(
pytest_wheel.name,
pytest_wheel.filename,
pytest_wheel.url,
pytest_wheel.version,
sha256,
size,
data_dist_info_metadata=None,
)

assert wheel_without_metadata._metadata is None
await wheel_without_metadata.download_pep658_metadata({})
assert wheel_without_metadata._metadata is None

# 3) the metadata extracted from the wheel should be the same
wheel = WheelInfo.from_package_index(
pytest_wheel.name,
pytest_wheel.filename,
pytest_wheel.url,
pytest_wheel.version,
sha256,
size,
data_dist_info_metadata=None,
)

assert wheel._metadata is None
await wheel.download({})
assert wheel._metadata is not None

assert wheel._metadata.deps == wheel_with_metadata._metadata.deps


@pytest.mark.asyncio
async def test_download_pep658_metadata_checksum(wheel_catalog):
pytest_wheel = wheel_catalog.get("pytest")
sha256 = "dummy-sha256"
size = 1234

wheel = WheelInfo.from_package_index(
pytest_wheel.name,
pytest_wheel.filename,
pytest_wheel.url,
pytest_wheel.version,
sha256,
size,
data_dist_info_metadata={"sha256": "dummy-sha256"},
)

assert wheel._metadata is None
with pytest.raises(RuntimeError, match="Invalid checksum: expected dummy-sha256"):
await wheel.download_pep658_metadata({})

checksum = "62eb95408ccec185e7a3b8f354a1df1721cd8f463922f5a900c7bf4b69c5a4e8" # TODO: calculate this from the file
wheel = WheelInfo.from_package_index(
pytest_wheel.name,
pytest_wheel.filename,
pytest_wheel.url,
pytest_wheel.version,
sha256,
size,
data_dist_info_metadata={"sha256": checksum},
)

assert wheel._metadata is None
await wheel.download_pep658_metadata({})
assert wheel._metadata is not None

0 comments on commit cd1ae53

Please sign in to comment.