Skip to content

Commit f537db5

Browse files
authored
Merge pull request #7651 from chrahunt/refactor/wheel-builder-helper-2
Add new wheel builder test helper
2 parents 7534dcc + 667dc39 commit f537db5

File tree

7 files changed

+636
-9
lines changed

7 files changed

+636
-9
lines changed

tests/data/packages/README.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@ FSPkg
2929
-----
3030
for installing from the file system
3131

32-
futurewheel
33-
-----------
34-
Wheels of a Wheel-Version that is newer in minor and major series.
35-
Their version coincides with the apparent Wheel-Version they indicate.
36-
3732
gmpy-1.15.tar.gz
3833
----------------
3934
hash testing (although this pkg isn't needed explicitly)
Binary file not shown.
Binary file not shown.

tests/functional/test_install_wheel.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,39 @@
77

88
from tests.lib import create_basic_wheel_for_package, skip_if_python2
99
from tests.lib.path import Path
10+
from tests.lib.wheel import make_wheel
1011

1112

12-
def test_install_from_future_wheel_version(script, data):
13+
# assert_installed expects a package subdirectory, so give it to them
14+
def make_wheel_with_file(name, version, **kwargs):
15+
extra_files = kwargs.setdefault("extra_files", {})
16+
extra_files["{}/__init__.py".format(name)] = "# example"
17+
return make_wheel(name=name, version=version, **kwargs)
18+
19+
20+
def test_install_from_future_wheel_version(script, tmpdir):
1321
"""
14-
Test installing a future wheel
22+
Test installing a wheel with a WHEEL metadata version that is:
23+
- a major version ahead of what we expect (not ok), and
24+
- a minor version ahead of what we expect (ok)
1525
"""
1626
from tests.lib import TestFailure
27+
package = make_wheel_with_file(
28+
name="futurewheel",
29+
version="3.0",
30+
wheel_metadata_updates={"Wheel-Version": "3.0"},
31+
).save_to_dir(tmpdir)
1732

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

24-
package = data.packages.joinpath("futurewheel-1.9-py2.py3-none-any.whl")
38+
package = make_wheel_with_file(
39+
name="futurewheel",
40+
version="1.9",
41+
wheel_metadata_updates={"Wheel-Version": "1.9"},
42+
).save_to_dir(tmpdir)
2543
result = script.pip(
2644
'install', package, '--no-index', expect_stderr=True
2745
)

tests/lib/test_wheel.py

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
"""Tests for wheel helper.
2+
"""
3+
from email import message_from_string
4+
from functools import partial
5+
from zipfile import ZipFile
6+
7+
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
8+
from tests.lib.wheel import (
9+
_default,
10+
make_metadata_file,
11+
make_wheel,
12+
make_wheel_metadata_file,
13+
message_from_dict,
14+
)
15+
16+
if MYPY_CHECK_RUNNING:
17+
from email import Message
18+
19+
20+
def test_message_from_dict_one_value():
21+
message = message_from_dict({"a": "1"})
22+
assert set(message.get_all("a")) == {"1"}
23+
24+
25+
def test_message_from_dict_multiple_values():
26+
message = message_from_dict({"a": ["1", "2"]})
27+
assert set(message.get_all("a")) == {"1", "2"}
28+
29+
30+
def message_from_bytes(contents):
31+
# type: (bytes) -> Message
32+
return message_from_string(contents.decode("utf-8"))
33+
34+
35+
default_make_metadata = partial(
36+
make_metadata_file,
37+
name="simple",
38+
value=_default,
39+
version="0.1.0",
40+
updates=_default,
41+
body=_default,
42+
)
43+
44+
45+
def default_metadata_checks(f):
46+
assert f.name == "simple-0.1.0.dist-info/METADATA"
47+
message = message_from_bytes(f.contents)
48+
assert message.get_all("Metadata-Version") == ["2.1"]
49+
assert message.get_all("Name") == ["simple"]
50+
assert message.get_all("Version") == ["0.1.0"]
51+
return message
52+
53+
54+
def test_make_metadata_file_defaults():
55+
f = default_make_metadata()
56+
default_metadata_checks(f)
57+
58+
59+
def test_make_metadata_file_custom_value():
60+
f = default_make_metadata(updates={"a": "1"})
61+
message = default_metadata_checks(f)
62+
assert message.get_all("a") == ["1"]
63+
64+
65+
def test_make_metadata_file_custom_value_list():
66+
f = default_make_metadata(updates={"a": ["1", "2"]})
67+
message = default_metadata_checks(f)
68+
assert set(message.get_all("a")) == {"1", "2"}
69+
70+
71+
def test_make_metadata_file_custom_value_overrides():
72+
f = default_make_metadata(updates={"Metadata-Version": "2.2"})
73+
message = message_from_bytes(f.contents)
74+
assert message.get_all("Metadata-Version") == ["2.2"]
75+
76+
77+
def test_make_metadata_file_custom_contents():
78+
value = b"hello"
79+
f = default_make_metadata(value=value)
80+
assert f.contents == value
81+
82+
83+
tags = [("py2", "none", "any"), ("py3", "none", "any")]
84+
default_make_wheel_metadata = partial(
85+
make_wheel_metadata_file,
86+
name="simple",
87+
version="0.1.0",
88+
value=_default,
89+
tags=tags,
90+
updates=_default,
91+
)
92+
93+
94+
def default_wheel_metadata_checks(f):
95+
assert f.name == "simple-0.1.0.dist-info/WHEEL"
96+
message = message_from_bytes(f.contents)
97+
assert message.get_all("Wheel-Version") == ["1.0"]
98+
assert message.get_all("Generator") == ["pip-test-suite"]
99+
assert message.get_all("Root-Is-Purelib") == ["true"]
100+
assert set(message.get_all("Tag")) == {"py2-none-any", "py3-none-any"}
101+
return message
102+
103+
104+
def test_make_wheel_metadata_file_defaults():
105+
f = default_make_wheel_metadata()
106+
default_wheel_metadata_checks(f)
107+
108+
109+
def test_make_wheel_metadata_file_custom_value():
110+
f = default_make_wheel_metadata(updates={"a": "1"})
111+
message = default_wheel_metadata_checks(f)
112+
assert message.get_all("a") == ["1"]
113+
114+
115+
def test_make_wheel_metadata_file_custom_value_list():
116+
f = default_make_wheel_metadata(updates={"a": ["1", "2"]})
117+
message = default_wheel_metadata_checks(f)
118+
assert set(message.get_all("a")) == {"1", "2"}
119+
120+
121+
def test_make_wheel_metadata_file_custom_value_override():
122+
f = default_make_wheel_metadata(updates={"Wheel-Version": "1.1"})
123+
message = message_from_bytes(f.contents)
124+
assert message.get_all("Wheel-Version") == ["1.1"]
125+
126+
127+
def test_make_wheel_metadata_file_custom_contents():
128+
value = b"hello"
129+
f = default_make_wheel_metadata(value=value)
130+
131+
assert f.name == "simple-0.1.0.dist-info/WHEEL"
132+
assert f.contents == value
133+
134+
135+
def test_make_wheel_metadata_file_no_contents():
136+
f = default_make_wheel_metadata(value=None)
137+
assert f is None
138+
139+
140+
def test_make_wheel_basics(tmpdir):
141+
make_wheel(name="simple", version="0.1.0").save_to_dir(tmpdir)
142+
143+
expected_wheel_path = tmpdir / "simple-0.1.0-py2.py3-none-any.whl"
144+
assert expected_wheel_path.exists()
145+
146+
with ZipFile(expected_wheel_path) as z:
147+
names = z.namelist()
148+
assert set(names) == {
149+
"simple-0.1.0.dist-info/METADATA",
150+
"simple-0.1.0.dist-info/RECORD",
151+
"simple-0.1.0.dist-info/WHEEL",
152+
}
153+
154+
155+
def test_make_wheel_extra_files():
156+
with make_wheel(
157+
name="simple",
158+
version="0.1.0",
159+
extra_files={"simple/__init__.py": "a"},
160+
extra_metadata_files={"LICENSE": "b"},
161+
extra_data_files={"info.txt": "c"},
162+
).as_zipfile() as z:
163+
names = z.namelist()
164+
assert set(names) == {
165+
"simple/__init__.py",
166+
"simple-0.1.0.data/info.txt",
167+
"simple-0.1.0.dist-info/LICENSE",
168+
"simple-0.1.0.dist-info/METADATA",
169+
"simple-0.1.0.dist-info/RECORD",
170+
"simple-0.1.0.dist-info/WHEEL",
171+
}
172+
173+
assert z.read("simple/__init__.py") == b"a"
174+
assert z.read("simple-0.1.0.dist-info/LICENSE") == b"b"
175+
assert z.read("simple-0.1.0.data/info.txt") == b"c"
176+
177+
178+
def test_make_wheel_no_files():
179+
with make_wheel(
180+
name="simple",
181+
version="0.1.0",
182+
wheel_metadata=None,
183+
metadata=None,
184+
record=None,
185+
).as_zipfile() as z:
186+
assert not z.namelist()
187+
188+
189+
def test_make_wheel_custom_files():
190+
with make_wheel(
191+
name="simple",
192+
version="0.1.0",
193+
wheel_metadata=b"a",
194+
metadata=b"b",
195+
record=b"c",
196+
).as_zipfile() as z:
197+
assert z.read("simple-0.1.0.dist-info/WHEEL") == b"a"
198+
assert z.read("simple-0.1.0.dist-info/METADATA") == b"b"
199+
assert z.read("simple-0.1.0.dist-info/RECORD") == b"c"

0 commit comments

Comments
 (0)