blob: d2696866fe216f1d8fd8beb9d06b75969241661d [file] [log] [blame]
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +00001"""Tests for distutils.command.upload."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +00002import os
3import unittest
Tarek Ziadé36797272010-07-22 12:50:05 +00004import http.client as httpclient
Éric Araujo70ec44a2010-11-06 02:44:43 +00005from test.support import run_unittest
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +00006
7from distutils.command.upload import upload
8from distutils.core import Distribution
9
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000010from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
11
Tarek Ziadé8b9361a2009-12-21 00:02:20 +000012PYPIRC_LONG_PASSWORD = """\
13[distutils]
14
15index-servers =
16 server1
17 server2
18
19[server1]
20username:me
21password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
22
23[server2]
24username:meagain
25password: secret
26realm:acme
27repository:http://another.pypi/
28"""
29
30
Tarek Ziadé13f7c3b2009-01-09 00:15:45 +000031PYPIRC_NOPASSWORD = """\
32[distutils]
33
34index-servers =
35 server1
36
37[server1]
38username:me
39"""
Tarek Ziadé36797272010-07-22 12:50:05 +000040class Response(object):
41 def __init__(self, status=200, reason='OK'):
42 self.status = status
43 self.reason = reason
Tarek Ziadé13f7c3b2009-01-09 00:15:45 +000044
Tarek Ziadé36797272010-07-22 12:50:05 +000045class FakeConnection(object):
Tarek Ziadébaf51802009-03-31 21:37:16 +000046
Tarek Ziadé36797272010-07-22 12:50:05 +000047 def __init__(self):
48 self.requests = []
49 self.headers = []
50 self.body = ''
Tarek Ziadébaf51802009-03-31 21:37:16 +000051
Tarek Ziadé36797272010-07-22 12:50:05 +000052 def __call__(self, netloc):
53 return self
Tarek Ziadébaf51802009-03-31 21:37:16 +000054
Tarek Ziadé36797272010-07-22 12:50:05 +000055 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é13f7c3b2009-01-09 00:15:45 +000070
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000071class uploadTestCase(PyPIRCCommandTestCase):
72
Tarek Ziadébaf51802009-03-31 21:37:16 +000073 def setUp(self):
74 super(uploadTestCase, self).setUp()
Benjamin Peterson45c97042013-03-18 15:20:56 -070075 self.old_class = httpclient.HTTPSConnection
76 self.conn = httpclient.HTTPSConnection = FakeConnection()
Tarek Ziadébaf51802009-03-31 21:37:16 +000077
78 def tearDown(self):
Benjamin Peterson45c97042013-03-18 15:20:56 -070079 httpclient.HTTPSConnection = self.old_class
Tarek Ziadébaf51802009-03-31 21:37:16 +000080 super(uploadTestCase, self).tearDown()
81
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000082 def test_finalize_options(self):
83
84 # new format
Tarek Ziadébaf51802009-03-31 21:37:16 +000085 self.write_file(self.rc, PYPIRC)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000086 dist = Distribution()
87 cmd = upload(dist)
88 cmd.finalize_options()
89 for attr, waited in (('username', 'me'), ('password', 'secret'),
90 ('realm', 'pypi'),
Benjamin Peterson45c97042013-03-18 15:20:56 -070091 ('repository', 'https://pypi.python.org/pypi')):
Ezio Melottib3aedd42010-11-20 19:04:17 +000092 self.assertEqual(getattr(cmd, attr), waited)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000093
Tarek Ziadé13f7c3b2009-01-09 00:15:45 +000094 def test_saved_password(self):
95 # file with no password
Tarek Ziadébaf51802009-03-31 21:37:16 +000096 self.write_file(self.rc, PYPIRC_NOPASSWORD)
Tarek Ziadé13f7c3b2009-01-09 00:15:45 +000097
98 # make sure it passes
99 dist = Distribution()
100 cmd = upload(dist)
101 cmd.finalize_options()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000102 self.assertEqual(cmd.password, None)
Tarek Ziadé13f7c3b2009-01-09 00:15:45 +0000103
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 Melottib3aedd42010-11-20 19:04:17 +0000109 self.assertEqual(cmd.password, 'xxx')
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000110
Tarek Ziadébaf51802009-03-31 21:37:16 +0000111 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é8b9361a2009-12-21 00:02:20 +0000117 self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
Tarek Ziadébaf51802009-03-31 21:37:16 +0000118
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é36797272010-07-22 12:50:05 +0000126 headers = dict(self.conn.headers)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000127 self.assertEqual(headers['Content-length'], '2087')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000128 self.assertTrue(headers['Content-type'].startswith('multipart/form-data'))
Tarek Ziadé36797272010-07-22 12:50:05 +0000129 self.assertFalse('\n' in headers['Authorization'])
130
Ezio Melottib3aedd42010-11-20 19:04:17 +0000131 self.assertEqual(self.conn.requests, [('POST', '/pypi')])
132 self.assertTrue((b'xxx') in self.conn.body)
Tarek Ziadébaf51802009-03-31 21:37:16 +0000133
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000134def test_suite():
135 return unittest.makeSuite(uploadTestCase)
136
137if __name__ == "__main__":
Éric Araujo70ec44a2010-11-06 02:44:43 +0000138 run_unittest(test_suite())