1# -*- encoding: utf8 -*-
2"""Tests for distutils.command.upload."""
3import os
4import unittest
5from test.test_support import run_unittest
6
7from distutils.command import upload as upload_mod
8from distutils.command.upload import upload
9from distutils.core import Distribution
10
11from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
12
13PYPIRC_LONG_PASSWORD = """\
14[distutils]
15
16index-servers =
17    server1
18    server2
19
20[server1]
21username:me
22password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
23
24[server2]
25username:meagain
26password: secret
27realm:acme
28repository:http://another.pypi/
29"""
30
31
32PYPIRC_NOPASSWORD = """\
33[distutils]
34
35index-servers =
36    server1
37
38[server1]
39username:me
40"""
41
42class FakeOpen(object):
43
44    def __init__(self, url):
45        self.url = url
46        if not isinstance(url, str):
47            self.req = url
48        else:
49            self.req = None
50        self.msg = 'OK'
51
52    def getcode(self):
53        return 200
54
55
56class uploadTestCase(PyPIRCCommandTestCase):
57
58    def setUp(self):
59        super(uploadTestCase, self).setUp()
60        self.old_open = upload_mod.urlopen
61        upload_mod.urlopen = self._urlopen
62        self.last_open = None
63
64    def tearDown(self):
65        upload_mod.urlopen = self.old_open
66        super(uploadTestCase, self).tearDown()
67
68    def _urlopen(self, url):
69        self.last_open = FakeOpen(url)
70        return self.last_open
71
72    def test_finalize_options(self):
73
74        # new format
75        self.write_file(self.rc, PYPIRC)
76        dist = Distribution()
77        cmd = upload(dist)
78        cmd.finalize_options()
79        for attr, waited in (('username', 'me'), ('password', 'secret'),
80                             ('realm', 'pypi'),
81                             ('repository', 'http://pypi.python.org/pypi')):
82            self.assertEqual(getattr(cmd, attr), waited)
83
84    def test_saved_password(self):
85        # file with no password
86        self.write_file(self.rc, PYPIRC_NOPASSWORD)
87
88        # make sure it passes
89        dist = Distribution()
90        cmd = upload(dist)
91        cmd.finalize_options()
92        self.assertEqual(cmd.password, None)
93
94        # make sure we get it as well, if another command
95        # initialized it at the dist level
96        dist.password = 'xxx'
97        cmd = upload(dist)
98        cmd.finalize_options()
99        self.assertEqual(cmd.password, 'xxx')
100
101    def test_upload(self):
102        tmp = self.mkdtemp()
103        path = os.path.join(tmp, 'xxx')
104        self.write_file(path)
105        command, pyversion, filename = 'xxx', '2.6', path
106        dist_files = [(command, pyversion, filename)]
107        self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
108
109        # lets run it
110        pkg_dir, dist = self.create_dist(dist_files=dist_files, author=u'dédé')
111        cmd = upload(dist)
112        cmd.ensure_finalized()
113        cmd.run()
114
115        # what did we send ?
116        self.assertIn('dédé', self.last_open.req.data)
117        headers = dict(self.last_open.req.headers)
118        self.assertEqual(headers['Content-length'], '2085')
119        self.assertTrue(headers['Content-type'].startswith('multipart/form-data'))
120        self.assertEqual(self.last_open.req.get_method(), 'POST')
121        self.assertEqual(self.last_open.req.get_full_url(),
122                         'http://pypi.python.org/pypi')
123        self.assertTrue('xxx' in self.last_open.req.data)
124        auth = self.last_open.req.headers['Authorization']
125        self.assertFalse('\n' in auth)
126
127def test_suite():
128    return unittest.makeSuite(uploadTestCase)
129
130if __name__ == "__main__":
131    run_unittest(test_suite())
132