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

Move tests away from on-disc test fixtures #1213

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
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
33 changes: 33 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import getpass
import logging.config
import pathlib
import tempfile
import textwrap

import pytest
Expand All @@ -8,6 +10,9 @@
from twine import settings
from twine import utils

from .helpers import build_sdist
from .helpers import build_wheel


@pytest.fixture(autouse=True)
def configure_output():
Expand Down Expand Up @@ -83,3 +88,31 @@ def _settings(config=default_config, **settings_kwargs):
@pytest.fixture
def entered_password(monkeypatch):
monkeypatch.setattr(getpass, "getpass", lambda prompt: "entered pw")


@pytest.fixture(scope="session")
def tmp_path_session(tmp_path_factory):
return pathlib.Path(
tempfile.mkdtemp(
prefix="twine-test-",
dir=tmp_path_factory.mktemp("test"),
)
)


@pytest.fixture
def test_wheel(tmp_path_session):
return build_wheel(tmp_path_session, "test", "1.2.3", {})


@pytest.fixture
def test_wheel_signature(test_wheel):
signature = test_wheel.with_suffix(".whl.asc")
signature.write_text("-----BEGIN PGP SIGNATURE-----")
yield signature
signature.unlink()


@pytest.fixture
def test_sdist(tmp_path_session):
return build_sdist(tmp_path_session, "test", "1.2.3", {})
46 changes: 45 additions & 1 deletion tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,54 @@ def build_archive(path, name, archive_format, files):
archive.addfile(member, io.BytesIO(data))
return filepath

if archive_format == "zip":
if archive_format == "zip" or archive_format == "whl":
with zipfile.ZipFile(filepath, mode="w") as archive:
for mname, content in files.items():
archive.writestr(mname, textwrap.dedent(content))
return filepath

raise ValueError(format)


def build_sdist(path, name, version, files):
content = {
f"{name}-{version}/README": "README",
f"{name}-{version}/PKG-INFO": f"""\
Metadata-Version: 1.1
Name: {name}
Version: {version}
""",
}

# Remap file paths to be under archive root folder.
root = f"{name}-{version}"
for key, value in files.items():
content[f"{root}/{key}"] = value

return build_archive(path, f"{name}-{version}", "tar.gz", content)


def build_wheel(path, name, version, files):
# This does not generate valid a wheel file: the archive lacks the
# .dist-info/RECORD member with the content listing. However, the
# generated files pass validation done by twine and are sufficient
# for testing purposes.

content = {
f"{name}-{version}.dist-info/WHEEL": """\
Wheel-Version: 1.0
Generator: test
Root-Is-Purelib: true
Tag: py3-none-any
""",
f"{name}-{version}.dist-info/METADATA": f"""\
Metadata-Version: 1.1
Name: {name}
Version: {version}
""",
}

# Add wheel content.
content.update(files)

return build_archive(path, f"{name}-{version}-py3-none-any", "whl", content)
20 changes: 9 additions & 11 deletions tests/test_register.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
from twine import exceptions
from twine.commands import register

from . import helpers


@pytest.fixture()
def register_settings(make_settings):
Expand All @@ -21,7 +19,7 @@ def register_settings(make_settings):
)


def test_successful_register(register_settings):
def test_successful_register(register_settings, test_wheel):
"""Return a successful result for a valid repository url and package."""
stub_response = pretend.stub(
is_redirect=False,
Expand All @@ -36,12 +34,12 @@ def test_successful_register(register_settings):

register_settings.create_repository = lambda: stub_repository

result = register.register(register_settings, helpers.WHEEL_FIXTURE)
result = register.register(register_settings, str(test_wheel))

assert result is None


def test_exception_for_redirect(register_settings):
def test_exception_for_redirect(register_settings, test_wheel):
"""Raise an exception when repository URL results in a redirect."""
repository_url = register_settings.repository_config["repository"]
redirect_url = "https://malicious.website.org/danger/"
Expand All @@ -62,10 +60,10 @@ def test_exception_for_redirect(register_settings):
exceptions.RedirectDetected,
match=rf"{repository_url}.+{redirect_url}.+\nIf you trust these URLs",
):
register.register(register_settings, helpers.WHEEL_FIXTURE)
register.register(register_settings, str(test_wheel))


def test_non_existent_package(register_settings):
def test_non_existent_package(register_settings, test_wheel):
"""Raise an exception when package file doesn't exist."""
stub_repository = pretend.stub()

Expand All @@ -80,7 +78,7 @@ def test_non_existent_package(register_settings):


@pytest.mark.parametrize("repo", ["pypi", "testpypi"])
def test_values_from_env_pypi(monkeypatch, repo):
def test_values_from_env_pypi(monkeypatch, repo, test_wheel):
"""Use env vars for settings when run from command line."""

def none_register(*args, **settings_kwargs):
Expand All @@ -96,14 +94,14 @@ def none_register(*args, **settings_kwargs):
}
for key, value in testenv.items():
monkeypatch.setenv(key, value)
cli.dispatch(["register", helpers.WHEEL_FIXTURE])
cli.dispatch(["register", str(test_wheel)])
register_settings = replaced_register.calls[0].args[0]
assert "pypipassword" == register_settings.password
assert "pypiuser" == register_settings.username
assert "/foo/bar.crt" == register_settings.cacert


def test_values_from_env_not_pypi(monkeypatch, write_config_file):
def test_values_from_env_not_pypi(monkeypatch, write_config_file, test_wheel):
"""Use env vars for settings when run from command line."""
write_config_file(
"""
Expand Down Expand Up @@ -131,7 +129,7 @@ def none_register(*args, **settings_kwargs):
}
for key, value in testenv.items():
monkeypatch.setenv(key, value)
cli.dispatch(["register", helpers.WHEEL_FIXTURE])
cli.dispatch(["register", str(test_wheel)])
register_settings = replaced_register.calls[0].args[0]
assert "pypipassword" == register_settings.password
assert "someusername" == register_settings.username
Expand Down
Loading
Loading