| """Tests for distutils.command.upload.""" |
| import os |
| import unittest |
| import http.client as httpclient |
| from test.support import run_unittest |
| |
| from distutils.command.upload import upload |
| from distutils.core import Distribution |
| |
| from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase |
| |
| PYPIRC_LONG_PASSWORD = """\ |
| [distutils] |
| |
| index-servers = |
| server1 |
| server2 |
| |
| [server1] |
| username:me |
| password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| |
| [server2] |
| username:meagain |
| password: secret |
| realm:acme |
| repository:http://another.pypi/ |
| """ |
| |
| |
| PYPIRC_NOPASSWORD = """\ |
| [distutils] |
| |
| index-servers = |
| server1 |
| |
| [server1] |
| username:me |
| """ |
| class Response(object): |
| def __init__(self, status=200, reason='OK'): |
| self.status = status |
| self.reason = reason |
| |
| class FakeConnection(object): |
| |
| def __init__(self): |
| self.requests = [] |
| self.headers = [] |
| self.body = '' |
| |
| def __call__(self, netloc): |
| return self |
| |
| def connect(self): |
| pass |
| endheaders = connect |
| |
| def putrequest(self, method, url): |
| self.requests.append((method, url)) |
| |
| def putheader(self, name, value): |
| self.headers.append((name, value)) |
| |
| def send(self, body): |
| self.body = body |
| |
| def getresponse(self): |
| return Response() |
| |
| class uploadTestCase(PyPIRCCommandTestCase): |
| |
| def setUp(self): |
| super(uploadTestCase, self).setUp() |
| self.old_class = httpclient.HTTPConnection |
| self.conn = httpclient.HTTPConnection = FakeConnection() |
| |
| def tearDown(self): |
| httpclient.HTTPConnection = self.old_class |
| super(uploadTestCase, self).tearDown() |
| |
| def test_finalize_options(self): |
| |
| # new format |
| self.write_file(self.rc, PYPIRC) |
| dist = Distribution() |
| cmd = upload(dist) |
| cmd.finalize_options() |
| for attr, waited in (('username', 'me'), ('password', 'secret'), |
| ('realm', 'pypi'), |
| ('repository', 'http://pypi.python.org/pypi')): |
| self.assertEqual(getattr(cmd, attr), waited) |
| |
| def test_saved_password(self): |
| # file with no password |
| self.write_file(self.rc, PYPIRC_NOPASSWORD) |
| |
| # make sure it passes |
| dist = Distribution() |
| cmd = upload(dist) |
| cmd.finalize_options() |
| self.assertEqual(cmd.password, None) |
| |
| # make sure we get it as well, if another command |
| # initialized it at the dist level |
| dist.password = 'xxx' |
| cmd = upload(dist) |
| cmd.finalize_options() |
| self.assertEqual(cmd.password, 'xxx') |
| |
| def test_upload(self): |
| tmp = self.mkdtemp() |
| path = os.path.join(tmp, 'xxx') |
| self.write_file(path) |
| command, pyversion, filename = 'xxx', '2.6', path |
| dist_files = [(command, pyversion, filename)] |
| self.write_file(self.rc, PYPIRC_LONG_PASSWORD) |
| |
| # lets run it |
| pkg_dir, dist = self.create_dist(dist_files=dist_files) |
| cmd = upload(dist) |
| cmd.ensure_finalized() |
| cmd.run() |
| |
| # what did we send ? |
| headers = dict(self.conn.headers) |
| self.assertEqual(headers['Content-length'], '2087') |
| self.assertTrue(headers['Content-type'].startswith('multipart/form-data')) |
| self.assertFalse('\n' in headers['Authorization']) |
| |
| self.assertEqual(self.conn.requests, [('POST', '/pypi')]) |
| self.assertTrue((b'xxx') in self.conn.body) |
| |
| def test_suite(): |
| return unittest.makeSuite(uploadTestCase) |
| |
| if __name__ == "__main__": |
| run_unittest(test_suite()) |