1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00
pip/tests/lib/test_wheel.py
Chris Hunt 6d8a58f7e1 Add wheel builder test helper
As we introduce stricter metadata parsing, we will need to ensure that
the wheel files used in our tests are compliant (except in the specific
way that we're testing against).

Currently we have a large number of test cases relying on undocumented or
under-documented wheel files that have various inconsistencies
(incorrect name, missing fields) that are unrelated to the features
actually under test.

With a new wheel builder helper function, we will be able to replace all
of our instances of pre-built wheel test fixtures with dynamically-generated
files in code that are correct by default.
2020-01-31 19:30:19 -05:00

199 lines
5.6 KiB
Python

"""Tests for wheel helper.
"""
from email import message_from_string
from functools import partial
from zipfile import ZipFile
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from tests.lib.wheel import (
_default,
make_metadata_file,
make_wheel,
make_wheel_metadata_file,
message_from_dict,
)
if MYPY_CHECK_RUNNING:
from email import Message
def test_message_from_dict_one_value():
message = message_from_dict({"a": "1"})
assert set(message.get_all("a")) == {"1"}
def test_message_from_dict_multiple_values():
message = message_from_dict({"a": ["1", "2"]})
assert set(message.get_all("a")) == {"1", "2"}
def message_from_bytes(contents):
# type: (bytes) -> Message
return message_from_string(contents.decode("utf-8"))
default_make_metadata = partial(
make_metadata_file,
name="simple",
value=_default,
version="0.1.0",
updates=_default,
body=_default,
)
def default_metadata_checks(f):
assert f.name == "simple-0.1.0.dist-info/METADATA"
message = message_from_bytes(f.contents)
assert message.get_all("Metadata-Version") == ["2.1"]
assert message.get_all("Name") == ["simple"]
assert message.get_all("Version") == ["0.1.0"]
return message
def test_make_metadata_file_defaults():
f = default_make_metadata()
default_metadata_checks(f)
def test_make_metadata_file_custom_value():
f = default_make_metadata(updates={"a": "1"})
message = default_metadata_checks(f)
assert message.get_all("a") == ["1"]
def test_make_metadata_file_custom_value_list():
f = default_make_metadata(updates={"a": ["1", "2"]})
message = default_metadata_checks(f)
assert set(message.get_all("a")) == {"1", "2"}
def test_make_metadata_file_custom_value_overrides():
f = default_make_metadata(updates={"Metadata-Version": "2.2"})
message = message_from_bytes(f.contents)
assert message.get_all("Metadata-Version") == ["2.2"]
def test_make_metadata_file_custom_contents():
value = b"hello"
f = default_make_metadata(value=value)
assert f.contents == value
tags = [("py2", "none", "any"), ("py3", "none", "any")]
default_make_wheel_metadata = partial(
make_wheel_metadata_file,
name="simple",
version="0.1.0",
value=_default,
tags=tags,
updates=_default,
)
def default_wheel_metadata_checks(f):
assert f.name == "simple-0.1.0.dist-info/WHEEL"
message = message_from_bytes(f.contents)
assert message.get_all("Wheel-Version") == ["1.0"]
assert message.get_all("Generator") == ["pip-test-suite"]
assert message.get_all("Root-Is-Purelib") == ["true"]
assert set(message.get_all("Tag")) == {"py2-none-any", "py3-none-any"}
return message
def test_make_wheel_metadata_file_defaults():
f = default_make_wheel_metadata()
default_wheel_metadata_checks(f)
def test_make_wheel_metadata_file_custom_value():
f = default_make_wheel_metadata(updates={"a": "1"})
message = default_wheel_metadata_checks(f)
assert message.get_all("a") == ["1"]
def test_make_wheel_metadata_file_custom_value_list():
f = default_make_wheel_metadata(updates={"a": ["1", "2"]})
message = default_wheel_metadata_checks(f)
assert set(message.get_all("a")) == {"1", "2"}
def test_make_wheel_metadata_file_custom_value_override():
f = default_make_wheel_metadata(updates={"Wheel-Version": "1.1"})
message = message_from_bytes(f.contents)
assert message.get_all("Wheel-Version") == ["1.1"]
def test_make_wheel_metadata_file_custom_contents():
value = b"hello"
f = default_make_wheel_metadata(value=value)
assert f.name == "simple-0.1.0.dist-info/WHEEL"
assert f.contents == value
def test_make_wheel_metadata_file_no_contents():
f = default_make_wheel_metadata(value=None)
assert f is None
def test_make_wheel_basics(tmpdir):
make_wheel(name="simple", version="0.1.0").save_to_dir(tmpdir)
expected_wheel_path = tmpdir / "simple-0.1.0-py2.py3-none-any.whl"
assert expected_wheel_path.exists()
with ZipFile(expected_wheel_path) as z:
names = z.namelist()
assert set(names) == {
"simple-0.1.0.dist-info/METADATA",
"simple-0.1.0.dist-info/RECORD",
"simple-0.1.0.dist-info/WHEEL",
}
def test_make_wheel_extra_files():
with make_wheel(
name="simple",
version="0.1.0",
extra_files={"simple/__init__.py": "a"},
extra_metadata_files={"LICENSE": "b"},
extra_data_files={"info.txt": "c"},
).as_zipfile() as z:
names = z.namelist()
assert set(names) == {
"simple/__init__.py",
"simple-0.1.0.data/info.txt",
"simple-0.1.0.dist-info/LICENSE",
"simple-0.1.0.dist-info/METADATA",
"simple-0.1.0.dist-info/RECORD",
"simple-0.1.0.dist-info/WHEEL",
}
assert z.read("simple/__init__.py") == b"a"
assert z.read("simple-0.1.0.dist-info/LICENSE") == b"b"
assert z.read("simple-0.1.0.data/info.txt") == b"c"
def test_make_wheel_no_files():
with make_wheel(
name="simple",
version="0.1.0",
wheel_metadata=None,
metadata=None,
record=None,
).as_zipfile() as z:
assert not z.namelist()
def test_make_wheel_custom_files():
with make_wheel(
name="simple",
version="0.1.0",
wheel_metadata=b"a",
metadata=b"b",
record=b"c",
).as_zipfile() as z:
assert z.read("simple-0.1.0.dist-info/WHEEL") == b"a"
assert z.read("simple-0.1.0.dist-info/METADATA") == b"b"
assert z.read("simple-0.1.0.dist-info/RECORD") == b"c"