Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new make_wheel test helper #7651

Merged
merged 3 commits into from
Feb 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions tests/data/packages/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@ FSPkg
-----
for installing from the file system

futurewheel
-----------
Wheels of a Wheel-Version that is newer in minor and major series.
Their version coincides with the apparent Wheel-Version they indicate.

gmpy-1.15.tar.gz
----------------
hash testing (although this pkg isn't needed explicitly)
Expand Down
Binary file not shown.
Binary file not shown.
26 changes: 22 additions & 4 deletions tests/functional/test_install_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,39 @@

from tests.lib import create_basic_wheel_for_package, skip_if_python2
from tests.lib.path import Path
from tests.lib.wheel import make_wheel


def test_install_from_future_wheel_version(script, data):
# assert_installed expects a package subdirectory, so give it to them
def make_wheel_with_file(name, version, **kwargs):
extra_files = kwargs.setdefault("extra_files", {})
extra_files["{}/__init__.py".format(name)] = "# example"
return make_wheel(name=name, version=version, **kwargs)


def test_install_from_future_wheel_version(script, tmpdir):
"""
Test installing a future wheel
Test installing a wheel with a WHEEL metadata version that is:
- a major version ahead of what we expect (not ok), and
- a minor version ahead of what we expect (ok)
"""
from tests.lib import TestFailure
package = make_wheel_with_file(
name="futurewheel",
version="3.0",
wheel_metadata_updates={"Wheel-Version": "3.0"},
).save_to_dir(tmpdir)

package = data.packages.joinpath("futurewheel-3.0-py2.py3-none-any.whl")
result = script.pip('install', package, '--no-index', expect_error=True)
with pytest.raises(TestFailure):
result.assert_installed('futurewheel', without_egg_link=True,
editable=False)

package = data.packages.joinpath("futurewheel-1.9-py2.py3-none-any.whl")
package = make_wheel_with_file(
name="futurewheel",
version="1.9",
wheel_metadata_updates={"Wheel-Version": "1.9"},
).save_to_dir(tmpdir)
result = script.pip(
'install', package, '--no-index', expect_stderr=True
)
Expand Down
199 changes: 199 additions & 0 deletions tests/lib/test_wheel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
"""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"
Loading