1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
import pretend
import pytest
from twine import cli
from twine import exceptions
from twine.commands import register
from . import helpers
@pytest.fixture()
def register_settings(make_settings):
"""Return a factory function for settings.Settings for register."""
return make_settings(
"""
[pypi]
repository: https://test.pypi.org/legacy/
username:foo
password:bar
"""
)
def test_successful_register(register_settings):
"""Return a successful result for a valid repository url and package."""
stub_response = pretend.stub(
is_redirect=False,
status_code=200,
headers={"location": "https://test.pypi.org/legacy/"},
raise_for_status=lambda: None,
)
stub_repository = pretend.stub(
register=lambda package: stub_response, close=lambda: None
)
register_settings.create_repository = lambda: stub_repository
result = register.register(register_settings, helpers.WHEEL_FIXTURE)
assert result is None
def test_exception_for_redirect(register_settings):
"""Raise an exception when repository URL results in a redirect."""
repository_url = register_settings.repository_config["repository"]
redirect_url = "https://malicious.website.org/danger/"
stub_response = pretend.stub(
is_redirect=True,
status_code=301,
headers={"location": redirect_url},
)
stub_repository = pretend.stub(
register=lambda package: stub_response, close=lambda: None
)
register_settings.create_repository = lambda: stub_repository
with pytest.raises(
exceptions.RedirectDetected,
match=rf"{repository_url}.+{redirect_url}.+\nIf you trust these URLs",
):
register.register(register_settings, helpers.WHEEL_FIXTURE)
def test_non_existent_package(register_settings):
"""Raise an exception when package file doesn't exist."""
stub_repository = pretend.stub()
register_settings.create_repository = lambda: stub_repository
package = "/foo/bar/baz.whl"
with pytest.raises(
exceptions.PackageNotFound,
match=f'"{package}" does not exist on the file system.',
):
register.register(register_settings, package)
@pytest.mark.parametrize("repo", ["pypi", "testpypi"])
def test_values_from_env_pypi(monkeypatch, repo):
"""Use env vars for settings when run from command line."""
def none_register(*args, **settings_kwargs):
pass
replaced_register = pretend.call_recorder(none_register)
monkeypatch.setattr(register, "register", replaced_register)
testenv = {
"TWINE_REPOSITORY": repo,
"TWINE_USERNAME": "pypiuser",
"TWINE_PASSWORD": "pypipassword",
"TWINE_CERT": "/foo/bar.crt",
}
for key, value in testenv.items():
monkeypatch.setenv(key, value)
cli.dispatch(["register", helpers.WHEEL_FIXTURE])
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):
"""Use env vars for settings when run from command line."""
write_config_file(
"""
[distutils]
index-servers =
notpypi
[notpypi]
repository: https://upload.example.org/legacy/
username:someusername
password:password
"""
)
def none_register(*args, **settings_kwargs):
pass
replaced_register = pretend.call_recorder(none_register)
monkeypatch.setattr(register, "register", replaced_register)
testenv = {
"TWINE_REPOSITORY": "notpypi",
"TWINE_USERNAME": "someusername",
"TWINE_PASSWORD": "pypipassword",
"TWINE_CERT": "/foo/bar.crt",
}
for key, value in testenv.items():
monkeypatch.setenv(key, value)
cli.dispatch(["register", helpers.WHEEL_FIXTURE])
register_settings = replaced_register.calls[0].args[0]
assert "pypipassword" == register_settings.password
assert "someusername" == register_settings.username
assert "/foo/bar.crt" == register_settings.cacert
|