ยปCore Development>Code coverage>Lib/packaging/tests/test_uninstall.py

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

#countcontent
1n/a"""Tests for the packaging.uninstall module."""
2n/aimport os
3n/aimport logging
4n/aimport packaging.util
5n/a
6n/afrom packaging.errors import PackagingError
7n/afrom packaging.install import remove
8n/afrom packaging.database import disable_cache, enable_cache
9n/a
10n/afrom packaging.tests import unittest, support
11n/a
12n/aSETUP_CFG = """
13n/a[metadata]
14n/aname = %(name)s
15n/aversion = %(version)s
16n/a
17n/a[files]
18n/apackages =
19n/a %(pkg)s
20n/a %(pkg)s.sub
21n/a"""
22n/a
23n/a
24n/aclass UninstallTestCase(support.TempdirManager,
25n/a support.LoggingCatcher,
26n/a support.EnvironRestorer,
27n/a unittest.TestCase):
28n/a
29n/a restore_environ = ['PLAT']
30n/a
31n/a def setUp(self):
32n/a super(UninstallTestCase, self).setUp()
33n/a self.addCleanup(enable_cache)
34n/a self.addCleanup(packaging.util._path_created.clear)
35n/a disable_cache()
36n/a
37n/a def get_path(self, dist, name):
38n/a # the dist argument must contain an install_dist command correctly
39n/a # initialized with a prefix option and finalized befored this method
40n/a # can be called successfully; practically, this means that you should
41n/a # call self.install_dist before self.get_path
42n/a cmd = dist.get_command_obj('install_dist')
43n/a return getattr(cmd, 'install_' + name)
44n/a
45n/a def make_dist(self, name='Foo', **kw):
46n/a kw['name'] = name
47n/a pkg = name.lower()
48n/a if 'version' not in kw:
49n/a kw['version'] = '0.1'
50n/a project_dir, dist = self.create_dist(**kw)
51n/a kw['pkg'] = pkg
52n/a
53n/a pkg_dir = os.path.join(project_dir, pkg)
54n/a os.makedirs(os.path.join(pkg_dir, 'sub'))
55n/a
56n/a self.write_file((project_dir, 'setup.cfg'), SETUP_CFG % kw)
57n/a self.write_file((pkg_dir, '__init__.py'), '#')
58n/a self.write_file((pkg_dir, pkg + '_utils.py'), '#')
59n/a self.write_file((pkg_dir, 'sub', '__init__.py'), '#')
60n/a self.write_file((pkg_dir, 'sub', pkg + '_utils.py'), '#')
61n/a
62n/a return project_dir
63n/a
64n/a def install_dist(self, name='Foo', dirname=None, **kw):
65n/a if not dirname:
66n/a dirname = self.make_dist(name, **kw)
67n/a os.chdir(dirname)
68n/a
69n/a dist = support.TestDistribution()
70n/a # for some unfathomable reason, the tests will fail horribly if the
71n/a # parse_config_files method is not called, even if it doesn't do
72n/a # anything useful; trying to build and use a command object manually
73n/a # also fails
74n/a dist.parse_config_files()
75n/a dist.finalize_options()
76n/a dist.run_command('install_dist',
77n/a {'prefix': ('command line', self.mkdtemp())})
78n/a
79n/a site_packages = self.get_path(dist, 'purelib')
80n/a return dist, site_packages
81n/a
82n/a def test_uninstall_unknown_distribution(self):
83n/a dist, site_packages = self.install_dist('Foospam')
84n/a self.assertRaises(PackagingError, remove, 'Foo',
85n/a paths=[site_packages])
86n/a
87n/a def test_uninstall(self):
88n/a dist, site_packages = self.install_dist()
89n/a self.assertIsFile(site_packages, 'foo', '__init__.py')
90n/a self.assertIsFile(site_packages, 'foo', 'sub', '__init__.py')
91n/a self.assertIsFile(site_packages, 'Foo-0.1.dist-info', 'RECORD')
92n/a self.assertTrue(remove('Foo', paths=[site_packages]))
93n/a self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py')
94n/a self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD')
95n/a
96n/a def test_uninstall_error_handling(self):
97n/a # makes sure if there are OSErrors (like permission denied)
98n/a # remove() stops and displays a clean error
99n/a dist, site_packages = self.install_dist('Meh')
100n/a
101n/a # breaking os.rename
102n/a old = os.rename
103n/a
104n/a def _rename(source, target):
105n/a raise OSError(42, 'impossible operation')
106n/a
107n/a os.rename = _rename
108n/a try:
109n/a self.assertFalse(remove('Meh', paths=[site_packages]))
110n/a finally:
111n/a os.rename = old
112n/a
113n/a logs = [log for log in self.get_logs(logging.INFO)
114n/a if log.startswith('Error:')]
115n/a self.assertEqual(logs, ['Error: [Errno 42] impossible operation'])
116n/a
117n/a self.assertTrue(remove('Meh', paths=[site_packages]))
118n/a
119n/a
120n/adef test_suite():
121n/a return unittest.makeSuite(UninstallTestCase)
122n/a
123n/aif __name__ == '__main__':
124n/a unittest.main(defaultTest='test_suite')