From 7edce73432363808834c001bbda05944eff5caa0 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Sun, 8 Jul 2018 19:48:32 -0500 Subject: Tests for deprecation warnings --- setuptools/tests/test_upload.py | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 setuptools/tests/test_upload.py (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py new file mode 100644 index 00000000..95a8d16b --- /dev/null +++ b/setuptools/tests/test_upload.py @@ -0,0 +1,43 @@ +import mock +from distutils import log + +import pytest + +from setuptools.command.upload import upload +from setuptools.dist import Distribution + + +class TestUploadTest: + def test_warns_deprecation(self): + dist = Distribution() + dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] + + cmd = upload(dist) + cmd.upload_file = mock.Mock() + cmd.announce = mock.Mock() + + cmd.run() + + cmd.announce.assert_called_once_with( + "WARNING: Uploading via this command is deprecated, use twine to " + "upload instead (https://pypi.org/p/twine/)", + log.WARN + ) + + def test_warns_deprecation_when_raising(self): + dist = Distribution() + dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] + + cmd = upload(dist) + cmd.upload_file = mock.Mock() + cmd.upload_file.side_effect = Exception + cmd.announce = mock.Mock() + + with pytest.raises(Exception): + cmd.run() + + cmd.announce.assert_called_once_with( + "WARNING: Uploading via this command is deprecated, use twine to " + "upload instead (https://pypi.org/p/twine/)", + log.WARN + ) -- cgit v1.2.1 From b7a6d8ad1b20e94de0b0bdebd1a6e9c8fd51695a Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Sun, 28 Oct 2018 14:19:04 -0400 Subject: Add failing test for issue #1381 --- setuptools/tests/test_upload.py | 59 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 95a8d16b..5b8e267c 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -1,13 +1,72 @@ import mock +import os +import re + from distutils import log +from distutils.version import StrictVersion import pytest +import six from setuptools.command.upload import upload from setuptools.dist import Distribution +def _parse_upload_body(body): + boundary = u'\r\n----------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + entries = [] + name_re = re.compile(u'^Content-Disposition: form-data; name="([^\"]+)"') + + for entry in body.split(boundary): + pair = entry.split(u'\r\n\r\n') + if not len(pair) == 2: + continue + + key, value = map(six.text_type.strip, pair) + m = name_re.match(key) + if m is not None: + key = m.group(1) + + entries.append((key, value)) + + return entries + + class TestUploadTest: + @pytest.mark.xfail(reason='Issue #1381') + @mock.patch('setuptools.command.upload.urlopen') + def test_upload_metadata(self, patch, tmpdir): + dist = Distribution() + dist.metadata.metadata_version = StrictVersion('2.1') + + content = os.path.join(str(tmpdir), "test_upload_metadata_content") + + with open(content, 'w') as f: + f.write("Some content") + + dist.dist_files = [('xxx', '3.7', content)] + + patch.return_value = mock.Mock() + patch.return_value.getcode.return_value = 200 + + cmd = upload(dist) + cmd.announce = mock.Mock() + cmd.username = 'user' + cmd.password = 'hunter2' + cmd.ensure_finalized() + cmd.run() + + # Make sure we did the upload + patch.assert_called_once() + + # Make sure the metadata version is correct in the headers + request = patch.call_args_list[0][0][0] + body = request.data.decode('utf-8') + + entries = dict(_parse_upload_body(body)) + assert entries['metadata_version'] == '2.1' + + def test_warns_deprecation(self): dist = Distribution() dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] -- cgit v1.2.1 From 33185837dbc1f75f7894b9cbc3e56c1c6a868c4c Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Mon, 5 Nov 2018 10:26:50 -0500 Subject: Use get_metadata_version in upload_file Previously this value was hard-coded to '1.0', which was inaccurate for many packages. Fixes #1381 --- setuptools/tests/test_upload.py | 1 - 1 file changed, 1 deletion(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 5b8e267c..b18f83c8 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -33,7 +33,6 @@ def _parse_upload_body(body): class TestUploadTest: - @pytest.mark.xfail(reason='Issue #1381') @mock.patch('setuptools.command.upload.urlopen') def test_upload_metadata(self, patch, tmpdir): dist = Distribution() -- cgit v1.2.1 From dfe1b3afb433c7e1d0679c005407ac12104e6141 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 17:15:22 -0500 Subject: Add upload fixture This is a fixture to create an upload command with a patched version of urlopen so that no HTTP queries are sent. --- setuptools/tests/test_upload.py | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index b18f83c8..1b70301b 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -32,6 +32,51 @@ def _parse_upload_body(body): return entries +@pytest.fixture +def patched_upload(tmpdir): + class Fix: + def __init__(self, cmd, urlopen): + self.cmd = cmd + self.urlopen = urlopen + + def __iter__(self): + return iter((self.cmd, self.urlopen)) + + def get_uploaded_metadata(self): + request = self.urlopen.call_args_list[0][0][0] + body = request.data.decode('utf-8') + entries = dict(_parse_upload_body(body)) + + return entries + + class ResponseMock(mock.Mock): + def getheader(self, name, default=None): + """Mocked getheader method for response object""" + return { + 'content-type': 'text/plain; charset=utf-8', + }.get(name.lower(), default) + + with mock.patch('setuptools.command.upload.urlopen') as urlopen: + urlopen.return_value = ResponseMock() + urlopen.return_value.getcode.return_value = 200 + urlopen.return_value.read.return_value = b'' + + content = os.path.join(str(tmpdir), "content_data") + + with open(content, 'w') as f: + f.write("Some content") + + dist = Distribution() + dist.dist_files = [('sdist', '3.7.0', content)] + + cmd = upload(dist) + cmd.announce = mock.Mock() + cmd.username = 'user' + cmd.password = 'hunter2' + + yield Fix(cmd, urlopen) + + class TestUploadTest: @mock.patch('setuptools.command.upload.urlopen') def test_upload_metadata(self, patch, tmpdir): -- cgit v1.2.1 From f4458afd8c83a233ae637af1d77e77404d2da1e5 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 17:21:05 -0500 Subject: Use the patched_upload fixture in upload_metadata `test_upload_metadata` was written before the fixture, so this updates the test to use the fixture. --- setuptools/tests/test_upload.py | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 1b70301b..caabb886 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -78,25 +78,13 @@ def patched_upload(tmpdir): class TestUploadTest: - @mock.patch('setuptools.command.upload.urlopen') - def test_upload_metadata(self, patch, tmpdir): - dist = Distribution() - dist.metadata.metadata_version = StrictVersion('2.1') - - content = os.path.join(str(tmpdir), "test_upload_metadata_content") - - with open(content, 'w') as f: - f.write("Some content") - - dist.dist_files = [('xxx', '3.7', content)] + def test_upload_metadata(self, patched_upload): + cmd, patch = patched_upload - patch.return_value = mock.Mock() - patch.return_value.getcode.return_value = 200 + # Set the metadata version to 2.1 + cmd.distribution.metadata.metadata_version = '2.1' - cmd = upload(dist) - cmd.announce = mock.Mock() - cmd.username = 'user' - cmd.password = 'hunter2' + # Run the command cmd.ensure_finalized() cmd.run() @@ -104,10 +92,7 @@ class TestUploadTest: patch.assert_called_once() # Make sure the metadata version is correct in the headers - request = patch.call_args_list[0][0][0] - body = request.data.decode('utf-8') - - entries = dict(_parse_upload_body(body)) + entries = patched_upload.get_uploaded_metadata() assert entries['metadata_version'] == '2.1' -- cgit v1.2.1 From 7417740076af72f49705088009d0b21afea7dd98 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 11:43:21 -0500 Subject: Add test for invalid URLs in upload_file --- setuptools/tests/test_upload.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index caabb886..6f497f08 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -95,7 +95,6 @@ class TestUploadTest: entries = patched_upload.get_uploaded_metadata() assert entries['metadata_version'] == '2.1' - def test_warns_deprecation(self): dist = Distribution() dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] @@ -129,3 +128,21 @@ class TestUploadTest: "upload instead (https://pypi.org/p/twine/)", log.WARN ) + + @pytest.mark.parametrize('url', [ + 'https://example.com/a;parameter', # Has parameters + 'https://example.com/a?query', # Has query + 'https://example.com/a#fragment', # Has fragment + 'ftp://example.com', # Invalid scheme + + ]) + def test_upload_file_invalid_url(self, url, patched_upload): + patched_upload.urlopen.side_effect = Exception("Should not be reached") + + cmd = patched_upload.cmd + cmd.repository = url + + cmd.ensure_finalized() + with pytest.raises(AssertionError): + cmd.run() + -- cgit v1.2.1 From 77b661a9599225721ac416cc342d56d1afb105a1 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 15:43:08 -0500 Subject: Add test for HTTPError in upload_file --- setuptools/tests/test_upload.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 6f497f08..129159a7 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -3,6 +3,7 @@ import os import re from distutils import log +from distutils.errors import DistutilsError from distutils.version import StrictVersion import pytest @@ -146,3 +147,22 @@ class TestUploadTest: with pytest.raises(AssertionError): cmd.run() + def test_upload_file_http_error(self, patched_upload): + patched_upload.urlopen.side_effect = six.moves.urllib.error.HTTPError( + 'https://example.com', + 404, + 'File not found', + None, + None + ) + + cmd = patched_upload.cmd + cmd.ensure_finalized() + + with pytest.raises(DistutilsError): + cmd.run() + + cmd.announce.assert_any_call( + 'Upload failed (404): File not found', + log.ERROR) + -- cgit v1.2.1 From 1bca7ffdea25ee7ae7d335d676b0804a2f467d52 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 16:22:41 -0500 Subject: Add test for OSError in upload_file --- setuptools/tests/test_upload.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 129159a7..6aaac075 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -166,3 +166,13 @@ class TestUploadTest: 'Upload failed (404): File not found', log.ERROR) + def test_upload_file_os_error(self, patched_upload): + patched_upload.urlopen.side_effect = OSError("Invalid") + + cmd = patched_upload.cmd + cmd.ensure_finalized() + + with pytest.raises(OSError): + cmd.run() + + cmd.announce.assert_any_call('Invalid', log.ERROR) -- cgit v1.2.1 From b5c9c5f42db36a07dc27d39c1be2a311cc567d99 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 16:23:13 -0500 Subject: Fix gpg signature code in upload_file This fixes an issue where `distutils.spawn.spawn` was not available in the ported upload_file, which is only used when signing the data. This also adds a test that the gpg signature command is invoked and included in the uploaded data. --- setuptools/tests/test_upload.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 6aaac075..3a1bbba9 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -176,3 +176,29 @@ class TestUploadTest: cmd.run() cmd.announce.assert_any_call('Invalid', log.ERROR) + + @mock.patch('setuptools.command.upload.spawn') + def test_upload_file_gpg(self, spawn, patched_upload): + cmd, urlopen = patched_upload + + cmd.sign = True + cmd.identity = "Alice" + cmd.dry_run = True + content_fname = cmd.distribution.dist_files[0][2] + signed_file = content_fname + '.asc' + + with open(signed_file, 'wb') as f: + f.write("signed-data".encode('utf-8')) + + cmd.ensure_finalized() + cmd.run() + + # Make sure that GPG was called + spawn.assert_called_once_with([ + "gpg", "--detach-sign", "--local-user", "Alice", "-a", + content_fname + ], dry_run=True) + + # Read the 'signed' data that was transmitted + entries = patched_upload.get_uploaded_metadata() + assert entries['gpg_signature'] == 'signed-data' -- cgit v1.2.1 From 727dd60f6a11f38d165250c543ba135687fa2e61 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 16:41:19 -0500 Subject: Fix bdist_rpm and bdist_dumb in upload_file This fixes uploads when bdist_rpm or bdist_dumb are the command, both of which insert a comment about what platform they are built for. --- setuptools/tests/test_upload.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 3a1bbba9..7bf8e312 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -202,3 +202,24 @@ class TestUploadTest: # Read the 'signed' data that was transmitted entries = patched_upload.get_uploaded_metadata() assert entries['gpg_signature'] == 'signed-data' + + @pytest.mark.parametrize('bdist', ['bdist_rpm', 'bdist_dumb']) + @mock.patch('setuptools.command.upload.platform') + def test_bdist_rpm_upload(self, platform, bdist, patched_upload): + # Set the upload command to include bdist_rpm + cmd = patched_upload.cmd + dist_files = cmd.distribution.dist_files + dist_files = [(bdist,) + dist_files[0][1:]] + cmd.distribution.dist_files = dist_files + + # Mock out the platform commands to make this platform-independent + platform.dist.return_value = ('redhat', '', '') + + cmd.ensure_finalized() + cmd.run() + + entries = patched_upload.get_uploaded_metadata() + + assert entries['comment'].startswith(u'built for') + assert len(entries['comment']) > len(u'built for') + -- cgit v1.2.1 From fe2c9e4292699635c91174bc049aefe81bf6116c Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 7 Nov 2018 17:07:58 -0500 Subject: Fix show_response behavior on Python 2 The `upload.show_response` feature was not added until Python 3. Rather than backport it, it is now enabled only if supported. This also adds a "smoke test" for the feature. --- setuptools/tests/test_upload.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 7bf8e312..319ed7a2 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -223,3 +223,12 @@ class TestUploadTest: assert entries['comment'].startswith(u'built for') assert len(entries['comment']) > len(u'built for') + def test_show_response_no_error(self, patched_upload): + # This test is just that show_response doesn't throw an error + # It is not really important what the printed response looks like + # in a deprecated command, but we don't want to introduce new + # errors when importing this function from distutils + + patched_upload.cmd.show_response = True + patched_upload.cmd.ensure_finalized() + patched_upload.cmd.run() -- cgit v1.2.1 From 2b5b91332a01c665cab77ad7962e87525850d7f5 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Mon, 12 Nov 2018 10:08:55 -0500 Subject: Remove bdist_rpm and bdist_dumb comment This comment is not used anywhere and `platform.dist()` is deprecated. See CPython PR #10414: https://github.com/python/cpython/pull/10414 and bpo-35186: https://bugs.python.org/issue35186 --- setuptools/tests/test_upload.py | 20 -------------------- 1 file changed, 20 deletions(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 319ed7a2..9229bba1 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -203,26 +203,6 @@ class TestUploadTest: entries = patched_upload.get_uploaded_metadata() assert entries['gpg_signature'] == 'signed-data' - @pytest.mark.parametrize('bdist', ['bdist_rpm', 'bdist_dumb']) - @mock.patch('setuptools.command.upload.platform') - def test_bdist_rpm_upload(self, platform, bdist, patched_upload): - # Set the upload command to include bdist_rpm - cmd = patched_upload.cmd - dist_files = cmd.distribution.dist_files - dist_files = [(bdist,) + dist_files[0][1:]] - cmd.distribution.dist_files = dist_files - - # Mock out the platform commands to make this platform-independent - platform.dist.return_value = ('redhat', '', '') - - cmd.ensure_finalized() - cmd.run() - - entries = patched_upload.get_uploaded_metadata() - - assert entries['comment'].startswith(u'built for') - assert len(entries['comment']) > len(u'built for') - def test_show_response_no_error(self, patched_upload): # This test is just that show_response doesn't throw an error # It is not really important what the printed response looks like -- cgit v1.2.1 From ba7698287094f7274ae7cbabaf6baedc175ac213 Mon Sep 17 00:00:00 2001 From: Oleg Sharov Date: Tue, 13 Nov 2018 12:52:43 +0400 Subject: import internal version of six --- setuptools/tests/test_upload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 9229bba1..cc0e8a0d 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -7,10 +7,10 @@ from distutils.errors import DistutilsError from distutils.version import StrictVersion import pytest -import six from setuptools.command.upload import upload from setuptools.dist import Distribution +from setuptools.extern import six def _parse_upload_body(body): -- cgit v1.2.1 From 9bf0fbe2af7c859aa4ac5bc0be4639c1621570d1 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 29 Dec 2018 13:42:19 -0500 Subject: Remove unused import --- setuptools/tests/test_upload.py | 1 - 1 file changed, 1 deletion(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index cc0e8a0d..320c6959 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -4,7 +4,6 @@ import re from distutils import log from distutils.errors import DistutilsError -from distutils.version import StrictVersion import pytest -- cgit v1.2.1 From f413f95e95b34b26d9ed9d9c43b3e4b3d30caecc Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Thu, 31 Oct 2019 11:25:57 -0400 Subject: Remove "upload" and "register" commands. The upload and register commands were deprecated over a year ago, in July 2018 (PR GH-1410, discussed in issue GH-1381). It is time to actively remove them in favor of twine. --- setuptools/tests/test_upload.py | 211 ++-------------------------------------- 1 file changed, 10 insertions(+), 201 deletions(-) (limited to 'setuptools/tests/test_upload.py') diff --git a/setuptools/tests/test_upload.py b/setuptools/tests/test_upload.py index 320c6959..7586cb26 100644 --- a/setuptools/tests/test_upload.py +++ b/setuptools/tests/test_upload.py @@ -1,213 +1,22 @@ -import mock -import os -import re - -from distutils import log -from distutils.errors import DistutilsError - -import pytest - from setuptools.command.upload import upload from setuptools.dist import Distribution -from setuptools.extern import six - - -def _parse_upload_body(body): - boundary = u'\r\n----------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - entries = [] - name_re = re.compile(u'^Content-Disposition: form-data; name="([^\"]+)"') - - for entry in body.split(boundary): - pair = entry.split(u'\r\n\r\n') - if not len(pair) == 2: - continue - - key, value = map(six.text_type.strip, pair) - m = name_re.match(key) - if m is not None: - key = m.group(1) - - entries.append((key, value)) - - return entries - - -@pytest.fixture -def patched_upload(tmpdir): - class Fix: - def __init__(self, cmd, urlopen): - self.cmd = cmd - self.urlopen = urlopen - - def __iter__(self): - return iter((self.cmd, self.urlopen)) - - def get_uploaded_metadata(self): - request = self.urlopen.call_args_list[0][0][0] - body = request.data.decode('utf-8') - entries = dict(_parse_upload_body(body)) - - return entries +from setuptools.errors import RemovedCommandError - class ResponseMock(mock.Mock): - def getheader(self, name, default=None): - """Mocked getheader method for response object""" - return { - 'content-type': 'text/plain; charset=utf-8', - }.get(name.lower(), default) +try: + from unittest import mock +except ImportError: + import mock - with mock.patch('setuptools.command.upload.urlopen') as urlopen: - urlopen.return_value = ResponseMock() - urlopen.return_value.getcode.return_value = 200 - urlopen.return_value.read.return_value = b'' - - content = os.path.join(str(tmpdir), "content_data") - - with open(content, 'w') as f: - f.write("Some content") - - dist = Distribution() - dist.dist_files = [('sdist', '3.7.0', content)] - - cmd = upload(dist) - cmd.announce = mock.Mock() - cmd.username = 'user' - cmd.password = 'hunter2' - - yield Fix(cmd, urlopen) - - -class TestUploadTest: - def test_upload_metadata(self, patched_upload): - cmd, patch = patched_upload - - # Set the metadata version to 2.1 - cmd.distribution.metadata.metadata_version = '2.1' - - # Run the command - cmd.ensure_finalized() - cmd.run() - - # Make sure we did the upload - patch.assert_called_once() - - # Make sure the metadata version is correct in the headers - entries = patched_upload.get_uploaded_metadata() - assert entries['metadata_version'] == '2.1' - - def test_warns_deprecation(self): - dist = Distribution() - dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] - - cmd = upload(dist) - cmd.upload_file = mock.Mock() - cmd.announce = mock.Mock() - - cmd.run() +import pytest - cmd.announce.assert_called_once_with( - "WARNING: Uploading via this command is deprecated, use twine to " - "upload instead (https://pypi.org/p/twine/)", - log.WARN - ) - def test_warns_deprecation_when_raising(self): +class TestUpload: + def test_upload_exception(self): + """Ensure that the register command has been properly removed.""" dist = Distribution() dist.dist_files = [(mock.Mock(), mock.Mock(), mock.Mock())] cmd = upload(dist) - cmd.upload_file = mock.Mock() - cmd.upload_file.side_effect = Exception - cmd.announce = mock.Mock() - - with pytest.raises(Exception): - cmd.run() - - cmd.announce.assert_called_once_with( - "WARNING: Uploading via this command is deprecated, use twine to " - "upload instead (https://pypi.org/p/twine/)", - log.WARN - ) - - @pytest.mark.parametrize('url', [ - 'https://example.com/a;parameter', # Has parameters - 'https://example.com/a?query', # Has query - 'https://example.com/a#fragment', # Has fragment - 'ftp://example.com', # Invalid scheme - - ]) - def test_upload_file_invalid_url(self, url, patched_upload): - patched_upload.urlopen.side_effect = Exception("Should not be reached") - - cmd = patched_upload.cmd - cmd.repository = url - - cmd.ensure_finalized() - with pytest.raises(AssertionError): - cmd.run() - - def test_upload_file_http_error(self, patched_upload): - patched_upload.urlopen.side_effect = six.moves.urllib.error.HTTPError( - 'https://example.com', - 404, - 'File not found', - None, - None - ) - - cmd = patched_upload.cmd - cmd.ensure_finalized() - with pytest.raises(DistutilsError): + with pytest.raises(RemovedCommandError): cmd.run() - - cmd.announce.assert_any_call( - 'Upload failed (404): File not found', - log.ERROR) - - def test_upload_file_os_error(self, patched_upload): - patched_upload.urlopen.side_effect = OSError("Invalid") - - cmd = patched_upload.cmd - cmd.ensure_finalized() - - with pytest.raises(OSError): - cmd.run() - - cmd.announce.assert_any_call('Invalid', log.ERROR) - - @mock.patch('setuptools.command.upload.spawn') - def test_upload_file_gpg(self, spawn, patched_upload): - cmd, urlopen = patched_upload - - cmd.sign = True - cmd.identity = "Alice" - cmd.dry_run = True - content_fname = cmd.distribution.dist_files[0][2] - signed_file = content_fname + '.asc' - - with open(signed_file, 'wb') as f: - f.write("signed-data".encode('utf-8')) - - cmd.ensure_finalized() - cmd.run() - - # Make sure that GPG was called - spawn.assert_called_once_with([ - "gpg", "--detach-sign", "--local-user", "Alice", "-a", - content_fname - ], dry_run=True) - - # Read the 'signed' data that was transmitted - entries = patched_upload.get_uploaded_metadata() - assert entries['gpg_signature'] == 'signed-data' - - def test_show_response_no_error(self, patched_upload): - # This test is just that show_response doesn't throw an error - # It is not really important what the printed response looks like - # in a deprecated command, but we don't want to introduce new - # errors when importing this function from distutils - - patched_upload.cmd.show_response = True - patched_upload.cmd.ensure_finalized() - patched_upload.cmd.run() -- cgit v1.2.1