Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 1 | """Tests for distutils.command.upload.""" |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 2 | import os |
| 3 | import unittest |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 4 | import http.client as httpclient |
Éric Araujo | 70ec44a | 2010-11-06 02:44:43 +0000 | [diff] [blame] | 5 | from test.support import run_unittest |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 6 | |
| 7 | from distutils.command.upload import upload |
| 8 | from distutils.core import Distribution |
| 9 | |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 10 | from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase |
| 11 | |
Tarek Ziadé | 8b9361a | 2009-12-21 00:02:20 +0000 | [diff] [blame] | 12 | PYPIRC_LONG_PASSWORD = """\ |
| 13 | [distutils] |
| 14 | |
| 15 | index-servers = |
| 16 | server1 |
| 17 | server2 |
| 18 | |
| 19 | [server1] |
| 20 | username:me |
| 21 | password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| 22 | |
| 23 | [server2] |
| 24 | username:meagain |
| 25 | password: secret |
| 26 | realm:acme |
| 27 | repository:http://another.pypi/ |
| 28 | """ |
| 29 | |
| 30 | |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 31 | PYPIRC_NOPASSWORD = """\ |
| 32 | [distutils] |
| 33 | |
| 34 | index-servers = |
| 35 | server1 |
| 36 | |
| 37 | [server1] |
| 38 | username:me |
| 39 | """ |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 40 | class Response(object): |
| 41 | def __init__(self, status=200, reason='OK'): |
| 42 | self.status = status |
| 43 | self.reason = reason |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 44 | |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 45 | class FakeConnection(object): |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 46 | |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 47 | def __init__(self): |
| 48 | self.requests = [] |
| 49 | self.headers = [] |
| 50 | self.body = '' |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 51 | |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 52 | def __call__(self, netloc): |
| 53 | return self |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 54 | |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 55 | def connect(self): |
| 56 | pass |
| 57 | endheaders = connect |
| 58 | |
| 59 | def putrequest(self, method, url): |
| 60 | self.requests.append((method, url)) |
| 61 | |
| 62 | def putheader(self, name, value): |
| 63 | self.headers.append((name, value)) |
| 64 | |
| 65 | def send(self, body): |
| 66 | self.body = body |
| 67 | |
| 68 | def getresponse(self): |
| 69 | return Response() |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 70 | |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 71 | class uploadTestCase(PyPIRCCommandTestCase): |
| 72 | |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 73 | def setUp(self): |
| 74 | super(uploadTestCase, self).setUp() |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 75 | self.old_class = httpclient.HTTPConnection |
| 76 | self.conn = httpclient.HTTPConnection = FakeConnection() |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 77 | |
| 78 | def tearDown(self): |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 79 | httpclient.HTTPConnection = self.old_class |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 80 | super(uploadTestCase, self).tearDown() |
| 81 | |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 82 | def test_finalize_options(self): |
| 83 | |
| 84 | # new format |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 85 | self.write_file(self.rc, PYPIRC) |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 86 | dist = Distribution() |
| 87 | cmd = upload(dist) |
| 88 | cmd.finalize_options() |
| 89 | for attr, waited in (('username', 'me'), ('password', 'secret'), |
| 90 | ('realm', 'pypi'), |
| 91 | ('repository', 'http://pypi.python.org/pypi')): |
Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 92 | self.assertEqual(getattr(cmd, attr), waited) |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 93 | |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 94 | def test_saved_password(self): |
| 95 | # file with no password |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 96 | self.write_file(self.rc, PYPIRC_NOPASSWORD) |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 97 | |
| 98 | # make sure it passes |
| 99 | dist = Distribution() |
| 100 | cmd = upload(dist) |
| 101 | cmd.finalize_options() |
Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 102 | self.assertEqual(cmd.password, None) |
Tarek Ziadé | 13f7c3b | 2009-01-09 00:15:45 +0000 | [diff] [blame] | 103 | |
| 104 | # make sure we get it as well, if another command |
| 105 | # initialized it at the dist level |
| 106 | dist.password = 'xxx' |
| 107 | cmd = upload(dist) |
| 108 | cmd.finalize_options() |
Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 109 | self.assertEqual(cmd.password, 'xxx') |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 110 | |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 111 | def test_upload(self): |
| 112 | tmp = self.mkdtemp() |
| 113 | path = os.path.join(tmp, 'xxx') |
| 114 | self.write_file(path) |
| 115 | command, pyversion, filename = 'xxx', '2.6', path |
| 116 | dist_files = [(command, pyversion, filename)] |
Tarek Ziadé | 8b9361a | 2009-12-21 00:02:20 +0000 | [diff] [blame] | 117 | self.write_file(self.rc, PYPIRC_LONG_PASSWORD) |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 118 | |
| 119 | # lets run it |
| 120 | pkg_dir, dist = self.create_dist(dist_files=dist_files) |
| 121 | cmd = upload(dist) |
| 122 | cmd.ensure_finalized() |
| 123 | cmd.run() |
| 124 | |
| 125 | # what did we send ? |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 126 | headers = dict(self.conn.headers) |
Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 127 | self.assertEqual(headers['Content-length'], '2087') |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 128 | self.assertTrue(headers['Content-type'].startswith('multipart/form-data')) |
Tarek Ziadé | 3679727 | 2010-07-22 12:50:05 +0000 | [diff] [blame] | 129 | self.assertFalse('\n' in headers['Authorization']) |
| 130 | |
Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 131 | self.assertEqual(self.conn.requests, [('POST', '/pypi')]) |
| 132 | self.assertTrue((b'xxx') in self.conn.body) |
Tarek Ziadé | baf5180 | 2009-03-31 21:37:16 +0000 | [diff] [blame] | 133 | |
Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 134 | def test_suite(): |
| 135 | return unittest.makeSuite(uploadTestCase) |
| 136 | |
| 137 | if __name__ == "__main__": |
Éric Araujo | 70ec44a | 2010-11-06 02:44:43 +0000 | [diff] [blame] | 138 | run_unittest(test_suite()) |