»Core Development>Code coverage>Lib/packaging/tests/test_command_register.py

Python code coverage for Lib/packaging/tests/test_command_register.py

#countcontent
1n/a"""Tests for packaging.command.register."""
2n/aimport os
3n/aimport getpass
4n/aimport urllib.request
5n/aimport urllib.error
6n/aimport urllib.parse
7n/a
8n/atry:
9n/a import docutils
10n/a DOCUTILS_SUPPORT = True
11n/aexcept ImportError:
12n/a DOCUTILS_SUPPORT = False
13n/a
14n/afrom packaging.tests import unittest, support
15n/afrom packaging.tests.support import Inputs
16n/afrom packaging.command import register as register_module
17n/afrom packaging.command.register import register
18n/afrom packaging.errors import PackagingSetupError
19n/a
20n/a
21n/aPYPIRC_NOPASSWORD = """\
22n/a[distutils]
23n/a
24n/aindex-servers =
25n/a server1
26n/a
27n/a[server1]
28n/ausername:me
29n/a"""
30n/a
31n/aWANTED_PYPIRC = """\
32n/a[distutils]
33n/aindex-servers =
34n/a pypi
35n/a
36n/a[pypi]
37n/ausername:tarek
38n/apassword:password
39n/a"""
40n/a
41n/a
42n/aclass FakeOpener:
43n/a """Fakes a PyPI server"""
44n/a def __init__(self):
45n/a self.reqs = []
46n/a
47n/a def __call__(self, *args):
48n/a return self
49n/a
50n/a def open(self, req):
51n/a self.reqs.append(req)
52n/a return self
53n/a
54n/a def read(self):
55n/a return 'xxx'
56n/a
57n/a
58n/aclass RegisterTestCase(support.TempdirManager,
59n/a support.EnvironRestorer,
60n/a support.LoggingCatcher,
61n/a unittest.TestCase):
62n/a
63n/a restore_environ = ['HOME']
64n/a
65n/a def setUp(self):
66n/a super(RegisterTestCase, self).setUp()
67n/a self.tmp_dir = self.mkdtemp()
68n/a self.rc = os.path.join(self.tmp_dir, '.pypirc')
69n/a os.environ['HOME'] = self.tmp_dir
70n/a
71n/a # patching the password prompt
72n/a self._old_getpass = getpass.getpass
73n/a
74n/a def _getpass(prompt):
75n/a return 'password'
76n/a
77n/a getpass.getpass = _getpass
78n/a self.old_opener = urllib.request.build_opener
79n/a self.conn = urllib.request.build_opener = FakeOpener()
80n/a
81n/a def tearDown(self):
82n/a getpass.getpass = self._old_getpass
83n/a urllib.request.build_opener = self.old_opener
84n/a if hasattr(register_module, 'input'):
85n/a del register_module.input
86n/a super(RegisterTestCase, self).tearDown()
87n/a
88n/a def _get_cmd(self, metadata=None):
89n/a if metadata is None:
90n/a metadata = {'home_page': 'xxx', 'author': 'xxx',
91n/a 'author_email': 'xxx',
92n/a 'name': 'xxx', 'version': 'xxx'}
93n/a pkg_info, dist = self.create_dist(**metadata)
94n/a return register(dist)
95n/a
96n/a def test_create_pypirc(self):
97n/a # this test makes sure a .pypirc file
98n/a # is created when requested.
99n/a
100n/a # let's create a register instance
101n/a cmd = self._get_cmd()
102n/a
103n/a # we shouldn't have a .pypirc file yet
104n/a self.assertFalse(os.path.exists(self.rc))
105n/a
106n/a # patching input and getpass.getpass
107n/a # so register gets happy
108n/a # Here's what we are faking :
109n/a # use your existing login (choice 1.)
110n/a # Username : 'tarek'
111n/a # Password : 'password'
112n/a # Save your login (y/N)? : 'y'
113n/a inputs = Inputs('1', 'tarek', 'y')
114n/a register_module.input = inputs
115n/a cmd.ensure_finalized()
116n/a cmd.run()
117n/a
118n/a # we should have a brand new .pypirc file
119n/a self.assertTrue(os.path.exists(self.rc))
120n/a
121n/a # with the content similar to WANTED_PYPIRC
122n/a with open(self.rc) as fp:
123n/a content = fp.read()
124n/a self.assertEqual(content, WANTED_PYPIRC)
125n/a
126n/a # now let's make sure the .pypirc file generated
127n/a # really works : we shouldn't be asked anything
128n/a # if we run the command again
129n/a def _no_way(prompt=''):
130n/a raise AssertionError(prompt)
131n/a
132n/a register_module.input = _no_way
133n/a cmd.show_response = True
134n/a cmd.finalized = False
135n/a cmd.ensure_finalized()
136n/a cmd.run()
137n/a
138n/a # let's see what the server received : we should
139n/a # have 2 similar requests
140n/a self.assertEqual(len(self.conn.reqs), 2)
141n/a req1 = dict(self.conn.reqs[0].headers)
142n/a req2 = dict(self.conn.reqs[1].headers)
143n/a self.assertEqual(req2['Content-length'], req1['Content-length'])
144n/a self.assertIn(b'xxx', self.conn.reqs[1].data)
145n/a
146n/a def test_password_not_in_file(self):
147n/a
148n/a self.write_file(self.rc, PYPIRC_NOPASSWORD)
149n/a cmd = self._get_cmd()
150n/a cmd.finalize_options()
151n/a cmd._set_config()
152n/a cmd.send_metadata()
153n/a
154n/a # dist.password should be set
155n/a # therefore used afterwards by other commands
156n/a self.assertEqual(cmd.distribution.password, 'password')
157n/a
158n/a def test_registration(self):
159n/a # this test runs choice 2
160n/a cmd = self._get_cmd()
161n/a inputs = Inputs('2', 'tarek', 'tarek@ziade.org')
162n/a register_module.input = inputs
163n/a # let's run the command
164n/a # FIXME does this send a real request? use a mock server
165n/a cmd.ensure_finalized()
166n/a cmd.run()
167n/a
168n/a # we should have send a request
169n/a self.assertEqual(len(self.conn.reqs), 1)
170n/a req = self.conn.reqs[0]
171n/a headers = dict(req.headers)
172n/a self.assertEqual(headers['Content-length'], '628')
173n/a self.assertIn(b'tarek', req.data)
174n/a
175n/a def test_password_reset(self):
176n/a # this test runs choice 3
177n/a cmd = self._get_cmd()
178n/a inputs = Inputs('3', 'tarek@ziade.org')
179n/a register_module.input = inputs
180n/a cmd.ensure_finalized()
181n/a cmd.run()
182n/a
183n/a # we should have send a request
184n/a self.assertEqual(len(self.conn.reqs), 1)
185n/a req = self.conn.reqs[0]
186n/a headers = dict(req.headers)
187n/a self.assertEqual(headers['Content-length'], '298')
188n/a self.assertIn(b'tarek', req.data)
189n/a
190n/a @unittest.skipUnless(DOCUTILS_SUPPORT, 'needs docutils')
191n/a def test_strict(self):
192n/a # testing the strict option: when on, the register command stops if the
193n/a # metadata is incomplete or if description contains bad reST
194n/a
195n/a # empty metadata # XXX this is not really empty..
196n/a cmd = self._get_cmd({'name': 'xxx', 'version': 'xxx'})
197n/a cmd.ensure_finalized()
198n/a cmd.strict = True
199n/a inputs = Inputs('1', 'tarek', 'y')
200n/a register_module.input = inputs
201n/a self.assertRaises(PackagingSetupError, cmd.run)
202n/a
203n/a # metadata is OK but description is broken
204n/a metadata = {'home_page': 'xxx', 'author': 'xxx',
205n/a 'author_email': 'éxéxé',
206n/a 'name': 'xxx', 'version': '4.2',
207n/a 'description': 'title\n==\n\ntext'}
208n/a
209n/a cmd = self._get_cmd(metadata)
210n/a cmd.ensure_finalized()
211n/a cmd.strict = True
212n/a self.assertRaises(PackagingSetupError, cmd.run)
213n/a
214n/a # now something that works
215n/a metadata['description'] = 'title\n=====\n\ntext'
216n/a cmd = self._get_cmd(metadata)
217n/a cmd.ensure_finalized()
218n/a cmd.strict = True
219n/a inputs = Inputs('1', 'tarek', 'y')
220n/a register_module.input = inputs
221n/a cmd.ensure_finalized()
222n/a cmd.run()
223n/a
224n/a # strict is not by default
225n/a cmd = self._get_cmd()
226n/a cmd.ensure_finalized()
227n/a inputs = Inputs('1', 'tarek', 'y')
228n/a register_module.input = inputs
229n/a cmd.ensure_finalized()
230n/a cmd.run()
231n/a
232n/a # and finally a Unicode test (bug #12114)
233n/a metadata = {'home_page': 'xxx', 'author': '\u00c9ric',
234n/a 'author_email': 'xxx', 'name': 'xxx',
235n/a 'version': 'xxx',
236n/a 'summary': 'Something about esszet \u00df',
237n/a 'description': 'More things about esszet \u00df'}
238n/a
239n/a cmd = self._get_cmd(metadata)
240n/a cmd.ensure_finalized()
241n/a cmd.strict = True
242n/a inputs = Inputs('1', 'tarek', 'y')
243n/a register_module.input = inputs
244n/a cmd.ensure_finalized()
245n/a cmd.run()
246n/a
247n/a def test_register_pep345(self):
248n/a cmd = self._get_cmd({})
249n/a cmd.ensure_finalized()
250n/a cmd.distribution.metadata['Requires-Dist'] = ['lxml']
251n/a data = cmd.build_post_data('submit')
252n/a self.assertEqual(data['metadata_version'], '1.2')
253n/a self.assertEqual(data['requires_dist'], ['lxml'])
254n/a
255n/a
256n/adef test_suite():
257n/a return unittest.makeSuite(RegisterTestCase)
258n/a
259n/aif __name__ == "__main__":
260n/a unittest.main(defaultTest="test_suite")