»Core Development>Code coverage>Lib/distutils/tests/test_register.py

Python code coverage for Lib/distutils/tests/test_register.py

#countcontent
1n/a"""Tests for distutils.command.register."""
2n/aimport os
3n/aimport unittest
4n/aimport getpass
5n/aimport urllib
6n/aimport warnings
7n/a
8n/afrom test.support import check_warnings, run_unittest
9n/a
10n/afrom distutils.command import register as register_module
11n/afrom distutils.command.register import register
12n/afrom distutils.errors import DistutilsSetupError
13n/afrom distutils.log import INFO
14n/a
15n/afrom distutils.tests.test_config import BasePyPIRCCommandTestCase
16n/a
17n/atry:
18n/a import docutils
19n/aexcept ImportError:
20n/a docutils = None
21n/a
22n/aPYPIRC_NOPASSWORD = """\
23n/a[distutils]
24n/a
25n/aindex-servers =
26n/a server1
27n/a
28n/a[server1]
29n/ausername:me
30n/a"""
31n/a
32n/aWANTED_PYPIRC = """\
33n/a[distutils]
34n/aindex-servers =
35n/a pypi
36n/a
37n/a[pypi]
38n/ausername:tarek
39n/apassword:password
40n/a"""
41n/a
42n/aclass Inputs(object):
43n/a """Fakes user inputs."""
44n/a def __init__(self, *answers):
45n/a self.answers = answers
46n/a self.index = 0
47n/a
48n/a def __call__(self, prompt=''):
49n/a try:
50n/a return self.answers[self.index]
51n/a finally:
52n/a self.index += 1
53n/a
54n/aclass FakeOpener(object):
55n/a """Fakes a PyPI server"""
56n/a def __init__(self):
57n/a self.reqs = []
58n/a
59n/a def __call__(self, *args):
60n/a return self
61n/a
62n/a def open(self, req, data=None, timeout=None):
63n/a self.reqs.append(req)
64n/a return self
65n/a
66n/a def read(self):
67n/a return b'xxx'
68n/a
69n/a def getheader(self, name, default=None):
70n/a return {
71n/a 'content-type': 'text/plain; charset=utf-8',
72n/a }.get(name.lower(), default)
73n/a
74n/a
75n/aclass RegisterTestCase(BasePyPIRCCommandTestCase):
76n/a
77n/a def setUp(self):
78n/a super(RegisterTestCase, self).setUp()
79n/a # patching the password prompt
80n/a self._old_getpass = getpass.getpass
81n/a def _getpass(prompt):
82n/a return 'password'
83n/a getpass.getpass = _getpass
84n/a urllib.request._opener = None
85n/a self.old_opener = urllib.request.build_opener
86n/a self.conn = urllib.request.build_opener = FakeOpener()
87n/a
88n/a def tearDown(self):
89n/a getpass.getpass = self._old_getpass
90n/a urllib.request._opener = None
91n/a urllib.request.build_opener = self.old_opener
92n/a super(RegisterTestCase, self).tearDown()
93n/a
94n/a def _get_cmd(self, metadata=None):
95n/a if metadata is None:
96n/a metadata = {'url': 'xxx', 'author': 'xxx',
97n/a 'author_email': 'xxx',
98n/a 'name': 'xxx', 'version': 'xxx'}
99n/a pkg_info, dist = self.create_dist(**metadata)
100n/a return register(dist)
101n/a
102n/a def test_create_pypirc(self):
103n/a # this test makes sure a .pypirc file
104n/a # is created when requested.
105n/a
106n/a # let's create a register instance
107n/a cmd = self._get_cmd()
108n/a
109n/a # we shouldn't have a .pypirc file yet
110n/a self.assertFalse(os.path.exists(self.rc))
111n/a
112n/a # patching input and getpass.getpass
113n/a # so register gets happy
114n/a #
115n/a # Here's what we are faking :
116n/a # use your existing login (choice 1.)
117n/a # Username : 'tarek'
118n/a # Password : 'password'
119n/a # Save your login (y/N)? : 'y'
120n/a inputs = Inputs('1', 'tarek', 'y')
121n/a register_module.input = inputs.__call__
122n/a # let's run the command
123n/a try:
124n/a cmd.run()
125n/a finally:
126n/a del register_module.input
127n/a
128n/a # we should have a brand new .pypirc file
129n/a self.assertTrue(os.path.exists(self.rc))
130n/a
131n/a # with the content similar to WANTED_PYPIRC
132n/a f = open(self.rc)
133n/a try:
134n/a content = f.read()
135n/a self.assertEqual(content, WANTED_PYPIRC)
136n/a finally:
137n/a f.close()
138n/a
139n/a # now let's make sure the .pypirc file generated
140n/a # really works : we shouldn't be asked anything
141n/a # if we run the command again
142n/a def _no_way(prompt=''):
143n/a raise AssertionError(prompt)
144n/a register_module.input = _no_way
145n/a
146n/a cmd.show_response = 1
147n/a cmd.run()
148n/a
149n/a # let's see what the server received : we should
150n/a # have 2 similar requests
151n/a self.assertEqual(len(self.conn.reqs), 2)
152n/a req1 = dict(self.conn.reqs[0].headers)
153n/a req2 = dict(self.conn.reqs[1].headers)
154n/a
155n/a self.assertEqual(req1['Content-length'], '1374')
156n/a self.assertEqual(req2['Content-length'], '1374')
157n/a self.assertIn(b'xxx', self.conn.reqs[1].data)
158n/a
159n/a def test_password_not_in_file(self):
160n/a
161n/a self.write_file(self.rc, PYPIRC_NOPASSWORD)
162n/a cmd = self._get_cmd()
163n/a cmd._set_config()
164n/a cmd.finalize_options()
165n/a cmd.send_metadata()
166n/a
167n/a # dist.password should be set
168n/a # therefore used afterwards by other commands
169n/a self.assertEqual(cmd.distribution.password, 'password')
170n/a
171n/a def test_registering(self):
172n/a # this test runs choice 2
173n/a cmd = self._get_cmd()
174n/a inputs = Inputs('2', 'tarek', 'tarek@ziade.org')
175n/a register_module.input = inputs.__call__
176n/a try:
177n/a # let's run the command
178n/a cmd.run()
179n/a finally:
180n/a del register_module.input
181n/a
182n/a # we should have send a request
183n/a self.assertEqual(len(self.conn.reqs), 1)
184n/a req = self.conn.reqs[0]
185n/a headers = dict(req.headers)
186n/a self.assertEqual(headers['Content-length'], '608')
187n/a self.assertIn(b'tarek', req.data)
188n/a
189n/a def test_password_reset(self):
190n/a # this test runs choice 3
191n/a cmd = self._get_cmd()
192n/a inputs = Inputs('3', 'tarek@ziade.org')
193n/a register_module.input = inputs.__call__
194n/a try:
195n/a # let's run the command
196n/a cmd.run()
197n/a finally:
198n/a del register_module.input
199n/a
200n/a # we should have send a request
201n/a self.assertEqual(len(self.conn.reqs), 1)
202n/a req = self.conn.reqs[0]
203n/a headers = dict(req.headers)
204n/a self.assertEqual(headers['Content-length'], '290')
205n/a self.assertIn(b'tarek', req.data)
206n/a
207n/a @unittest.skipUnless(docutils is not None, 'needs docutils')
208n/a def test_strict(self):
209n/a # testing the script option
210n/a # when on, the register command stops if
211n/a # the metadata is incomplete or if
212n/a # long_description is not reSt compliant
213n/a
214n/a # empty metadata
215n/a cmd = self._get_cmd({})
216n/a cmd.ensure_finalized()
217n/a cmd.strict = 1
218n/a self.assertRaises(DistutilsSetupError, cmd.run)
219n/a
220n/a # metadata are OK but long_description is broken
221n/a metadata = {'url': 'xxx', 'author': 'xxx',
222n/a 'author_email': 'éxéxé',
223n/a 'name': 'xxx', 'version': 'xxx',
224n/a 'long_description': 'title\n==\n\ntext'}
225n/a
226n/a cmd = self._get_cmd(metadata)
227n/a cmd.ensure_finalized()
228n/a cmd.strict = 1
229n/a self.assertRaises(DistutilsSetupError, cmd.run)
230n/a
231n/a # now something that works
232n/a metadata['long_description'] = 'title\n=====\n\ntext'
233n/a cmd = self._get_cmd(metadata)
234n/a cmd.ensure_finalized()
235n/a cmd.strict = 1
236n/a inputs = Inputs('1', 'tarek', 'y')
237n/a register_module.input = inputs.__call__
238n/a # let's run the command
239n/a try:
240n/a cmd.run()
241n/a finally:
242n/a del register_module.input
243n/a
244n/a # strict is not by default
245n/a cmd = self._get_cmd()
246n/a cmd.ensure_finalized()
247n/a inputs = Inputs('1', 'tarek', 'y')
248n/a register_module.input = inputs.__call__
249n/a # let's run the command
250n/a try:
251n/a cmd.run()
252n/a finally:
253n/a del register_module.input
254n/a
255n/a # and finally a Unicode test (bug #12114)
256n/a metadata = {'url': 'xxx', 'author': '\u00c9ric',
257n/a 'author_email': 'xxx', 'name': 'xxx',
258n/a 'version': 'xxx',
259n/a 'description': 'Something about esszet \u00df',
260n/a 'long_description': 'More things about esszet \u00df'}
261n/a
262n/a cmd = self._get_cmd(metadata)
263n/a cmd.ensure_finalized()
264n/a cmd.strict = 1
265n/a inputs = Inputs('1', 'tarek', 'y')
266n/a register_module.input = inputs.__call__
267n/a # let's run the command
268n/a try:
269n/a cmd.run()
270n/a finally:
271n/a del register_module.input
272n/a
273n/a @unittest.skipUnless(docutils is not None, 'needs docutils')
274n/a def test_register_invalid_long_description(self):
275n/a description = ':funkie:`str`' # mimic Sphinx-specific markup
276n/a metadata = {'url': 'xxx', 'author': 'xxx',
277n/a 'author_email': 'xxx',
278n/a 'name': 'xxx', 'version': 'xxx',
279n/a 'long_description': description}
280n/a cmd = self._get_cmd(metadata)
281n/a cmd.ensure_finalized()
282n/a cmd.strict = True
283n/a inputs = Inputs('2', 'tarek', 'tarek@ziade.org')
284n/a register_module.input = inputs
285n/a self.addCleanup(delattr, register_module, 'input')
286n/a
287n/a self.assertRaises(DistutilsSetupError, cmd.run)
288n/a
289n/a def test_check_metadata_deprecated(self):
290n/a # makes sure make_metadata is deprecated
291n/a cmd = self._get_cmd()
292n/a with check_warnings() as w:
293n/a warnings.simplefilter("always")
294n/a cmd.check_metadata()
295n/a self.assertEqual(len(w.warnings), 1)
296n/a
297n/a def test_list_classifiers(self):
298n/a cmd = self._get_cmd()
299n/a cmd.list_classifiers = 1
300n/a cmd.run()
301n/a results = self.get_logs(INFO)
302n/a self.assertEqual(results, ['running check', 'xxx'])
303n/a
304n/a def test_show_response(self):
305n/a # test that the --show-response option return a well formatted response
306n/a cmd = self._get_cmd()
307n/a inputs = Inputs('1', 'tarek', 'y')
308n/a register_module.input = inputs.__call__
309n/a cmd.show_response = 1
310n/a try:
311n/a cmd.run()
312n/a finally:
313n/a del register_module.input
314n/a
315n/a results = self.get_logs(INFO)
316n/a self.assertEqual(results[3], 75 * '-' + '\nxxx\n' + 75 * '-')
317n/a
318n/a
319n/adef test_suite():
320n/a return unittest.makeSuite(RegisterTestCase)
321n/a
322n/aif __name__ == "__main__":
323n/a run_unittest(test_suite())