1"""Tests for distutils.pypirc.pypirc."""
2import os
3import unittest
4
5from distutils.core import PyPIRCCommand
6from distutils.core import Distribution
7from distutils.log import set_threshold
8from distutils.log import WARN
9
10from distutils.tests import support
11from test.support import run_unittest
12
13PYPIRC = """\
14[distutils]
15
16index-servers =
17    server1
18    server2
19    server3
20
21[server1]
22username:me
23password:secret
24
25[server2]
26username:meagain
27password: secret
28realm:acme
29repository:http://another.pypi/
30
31[server3]
32username:cbiggles
33password:yh^%#rest-of-my-password
34"""
35
36PYPIRC_OLD = """\
37[server-login]
38username:tarek
39password:secret
40"""
41
42WANTED = """\
43[distutils]
44index-servers =
45    pypi
46
47[pypi]
48username:tarek
49password:xxx
50"""
51
52
53class BasePyPIRCCommandTestCase(support.TempdirManager,
54                            support.LoggingSilencer,
55                            support.EnvironGuard,
56                            unittest.TestCase):
57
58    def setUp(self):
59        """Patches the environment."""
60        super(BasePyPIRCCommandTestCase, self).setUp()
61        self.tmp_dir = self.mkdtemp()
62        os.environ['HOME'] = self.tmp_dir
63        self.rc = os.path.join(self.tmp_dir, '.pypirc')
64        self.dist = Distribution()
65
66        class command(PyPIRCCommand):
67            def __init__(self, dist):
68                PyPIRCCommand.__init__(self, dist)
69            def initialize_options(self):
70                pass
71            finalize_options = initialize_options
72
73        self._cmd = command
74        self.old_threshold = set_threshold(WARN)
75
76    def tearDown(self):
77        """Removes the patch."""
78        set_threshold(self.old_threshold)
79        super(BasePyPIRCCommandTestCase, self).tearDown()
80
81
82class PyPIRCCommandTestCase(BasePyPIRCCommandTestCase):
83
84    def test_server_registration(self):
85        # This test makes sure PyPIRCCommand knows how to:
86        # 1. handle several sections in .pypirc
87        # 2. handle the old format
88
89        # new format
90        self.write_file(self.rc, PYPIRC)
91        cmd = self._cmd(self.dist)
92        config = cmd._read_pypirc()
93
94        config = list(sorted(config.items()))
95        waited = [('password', 'secret'), ('realm', 'pypi'),
96                  ('repository', 'https://upload.pypi.org/legacy/'),
97                  ('server', 'server1'), ('username', 'me')]
98        self.assertEqual(config, waited)
99
100        # old format
101        self.write_file(self.rc, PYPIRC_OLD)
102        config = cmd._read_pypirc()
103        config = list(sorted(config.items()))
104        waited = [('password', 'secret'), ('realm', 'pypi'),
105                  ('repository', 'https://upload.pypi.org/legacy/'),
106                  ('server', 'server-login'), ('username', 'tarek')]
107        self.assertEqual(config, waited)
108
109    def test_server_empty_registration(self):
110        cmd = self._cmd(self.dist)
111        rc = cmd._get_rc_file()
112        self.assertFalse(os.path.exists(rc))
113        cmd._store_pypirc('tarek', 'xxx')
114        self.assertTrue(os.path.exists(rc))
115        f = open(rc)
116        try:
117            content = f.read()
118            self.assertEqual(content, WANTED)
119        finally:
120            f.close()
121
122    def test_config_interpolation(self):
123        # using the % character in .pypirc should not raise an error (#20120)
124        self.write_file(self.rc, PYPIRC)
125        cmd = self._cmd(self.dist)
126        cmd.repository = 'server3'
127        config = cmd._read_pypirc()
128
129        config = list(sorted(config.items()))
130        waited = [('password', 'yh^%#rest-of-my-password'), ('realm', 'pypi'),
131                  ('repository', 'https://upload.pypi.org/legacy/'),
132                  ('server', 'server3'), ('username', 'cbiggles')]
133        self.assertEqual(config, waited)
134
135
136def test_suite():
137    return unittest.makeSuite(PyPIRCCommandTestCase)
138
139if __name__ == "__main__":
140    run_unittest(test_suite())
141