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

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

#countcontent
1n/aimport os
2n/aimport re
3n/aimport sys
4n/aimport shutil
5n/aimport unittest as ut1
6n/aimport packaging.database
7n/a
8n/afrom os.path import join
9n/afrom operator import getitem, setitem, delitem
10n/afrom packaging.command.build import build
11n/afrom packaging.tests import unittest
12n/afrom packaging.tests.support import (TempdirManager, EnvironRestorer,
13n/a LoggingCatcher)
14n/afrom packaging.command.test import test
15n/afrom packaging.command import set_command
16n/afrom packaging.dist import Distribution
17n/a
18n/a
19n/aEXPECTED_OUTPUT_RE = r'''FAIL: test_blah \(myowntestmodule.SomeTest\)
20n/a----------------------------------------------------------------------
21n/aTraceback \(most recent call last\):
22n/a File ".+/myowntestmodule.py", line \d+, in test_blah
23n/a self.fail\("horribly"\)
24n/aAssertionError: horribly
25n/a'''
26n/a
27n/ahere = os.path.dirname(os.path.abspath(__file__))
28n/a
29n/a
30n/aclass MockBuildCmd(build):
31n/a build_lib = "mock build lib"
32n/a command_name = 'build'
33n/a plat_name = 'whatever'
34n/a
35n/a def initialize_options(self):
36n/a pass
37n/a
38n/a def finalize_options(self):
39n/a pass
40n/a
41n/a def run(self):
42n/a self._record.append("build has run")
43n/a
44n/a
45n/aclass TestTest(TempdirManager,
46n/a EnvironRestorer,
47n/a LoggingCatcher,
48n/a unittest.TestCase):
49n/a
50n/a restore_environ = ['PYTHONPATH']
51n/a
52n/a def setUp(self):
53n/a super(TestTest, self).setUp()
54n/a self.addCleanup(packaging.database.clear_cache)
55n/a new_pythonpath = os.path.dirname(os.path.dirname(here))
56n/a pythonpath = os.environ.get('PYTHONPATH')
57n/a if pythonpath is not None:
58n/a new_pythonpath = os.pathsep.join((new_pythonpath, pythonpath))
59n/a os.environ['PYTHONPATH'] = new_pythonpath
60n/a
61n/a def assert_re_match(self, pattern, string):
62n/a def quote(s):
63n/a lines = ['## ' + line for line in s.split('\n')]
64n/a sep = ["#" * 60]
65n/a return [''] + sep + lines + sep
66n/a msg = quote(pattern) + ["didn't match"] + quote(string)
67n/a msg = "\n".join(msg)
68n/a if not re.search(pattern, string):
69n/a self.fail(msg)
70n/a
71n/a def prepare_dist(self, dist_name):
72n/a pkg_dir = join(os.path.dirname(__file__), "dists", dist_name)
73n/a temp_pkg_dir = join(self.mkdtemp(), dist_name)
74n/a shutil.copytree(pkg_dir, temp_pkg_dir)
75n/a return temp_pkg_dir
76n/a
77n/a def safely_replace(self, obj, attr,
78n/a new_val=None, delete=False, dictionary=False):
79n/a """Replace a object's attribute returning to its original state at the
80n/a end of the test run. Creates the attribute if not present before
81n/a (deleting afterwards). When delete=True, makes sure the value is del'd
82n/a for the test run. If dictionary is set to True, operates of its items
83n/a rather than attributes."""
84n/a if dictionary:
85n/a _setattr, _getattr, _delattr = setitem, getitem, delitem
86n/a
87n/a def _hasattr(_dict, value):
88n/a return value in _dict
89n/a else:
90n/a _setattr, _getattr, _delattr, _hasattr = (setattr, getattr,
91n/a delattr, hasattr)
92n/a
93n/a orig_has_attr = _hasattr(obj, attr)
94n/a if orig_has_attr:
95n/a orig_val = _getattr(obj, attr)
96n/a
97n/a if delete is False:
98n/a _setattr(obj, attr, new_val)
99n/a elif orig_has_attr:
100n/a _delattr(obj, attr)
101n/a
102n/a def do_cleanup():
103n/a if orig_has_attr:
104n/a _setattr(obj, attr, orig_val)
105n/a elif _hasattr(obj, attr):
106n/a _delattr(obj, attr)
107n/a
108n/a self.addCleanup(do_cleanup)
109n/a
110n/a def test_runs_unittest(self):
111n/a module_name, a_module = self.prepare_a_module()
112n/a record = []
113n/a a_module.recorder = lambda *args: record.append("suite")
114n/a
115n/a class MockTextTestRunner:
116n/a def __init__(*_, **__):
117n/a pass
118n/a
119n/a def run(_self, suite):
120n/a record.append("run")
121n/a
122n/a self.safely_replace(ut1, "TextTestRunner", MockTextTestRunner)
123n/a
124n/a dist = Distribution()
125n/a cmd = test(dist)
126n/a cmd.suite = "%s.recorder" % module_name
127n/a cmd.run()
128n/a self.assertEqual(record, ["suite", "run"])
129n/a
130n/a def test_builds_before_running_tests(self):
131n/a self.addCleanup(set_command, 'packaging.command.build.build')
132n/a set_command('packaging.tests.test_command_test.MockBuildCmd')
133n/a
134n/a dist = Distribution()
135n/a dist.get_command_obj('build')._record = record = []
136n/a cmd = test(dist)
137n/a cmd.runner = self.prepare_named_function(lambda: None)
138n/a cmd.ensure_finalized()
139n/a cmd.run()
140n/a self.assertEqual(['build has run'], record)
141n/a
142n/a @unittest.skip('needs to be written')
143n/a def test_works_with_2to3(self):
144n/a pass
145n/a
146n/a def test_checks_requires(self):
147n/a dist = Distribution()
148n/a cmd = test(dist)
149n/a phony_project = 'ohno_ohno-impossible_1234-name_stop-that!'
150n/a cmd.tests_require = [phony_project]
151n/a cmd.ensure_finalized()
152n/a logs = self.get_logs()
153n/a self.assertIn(phony_project, logs[-1])
154n/a
155n/a def prepare_a_module(self):
156n/a tmp_dir = self.mkdtemp()
157n/a sys.path.append(tmp_dir)
158n/a self.addCleanup(sys.path.remove, tmp_dir)
159n/a
160n/a self.write_file((tmp_dir, 'packaging_tests_a.py'), '')
161n/a import packaging_tests_a as a_module
162n/a return "packaging_tests_a", a_module
163n/a
164n/a def prepare_named_function(self, func):
165n/a module_name, a_module = self.prepare_a_module()
166n/a a_module.recorder = func
167n/a return "%s.recorder" % module_name
168n/a
169n/a def test_custom_runner(self):
170n/a dist = Distribution()
171n/a cmd = test(dist)
172n/a record = []
173n/a cmd.runner = self.prepare_named_function(
174n/a lambda: record.append("runner called"))
175n/a cmd.ensure_finalized()
176n/a cmd.run()
177n/a self.assertEqual(["runner called"], record)
178n/a
179n/a def prepare_mock_ut2(self):
180n/a class MockUTClass:
181n/a def __init__(*_, **__):
182n/a pass
183n/a
184n/a def discover(self):
185n/a pass
186n/a
187n/a def run(self, _):
188n/a pass
189n/a
190n/a class MockUTModule:
191n/a TestLoader = MockUTClass
192n/a TextTestRunner = MockUTClass
193n/a
194n/a mock_ut2 = MockUTModule()
195n/a self.safely_replace(sys.modules, "unittest2",
196n/a mock_ut2, dictionary=True)
197n/a return mock_ut2
198n/a
199n/a def test_gets_unittest_discovery(self):
200n/a mock_ut2 = self.prepare_mock_ut2()
201n/a dist = Distribution()
202n/a cmd = test(dist)
203n/a self.safely_replace(ut1.TestLoader, "discover", lambda: None)
204n/a self.assertEqual(cmd.get_ut_with_discovery(), ut1)
205n/a
206n/a del ut1.TestLoader.discover
207n/a self.assertEqual(cmd.get_ut_with_discovery(), mock_ut2)
208n/a
209n/a def test_calls_discover(self):
210n/a self.safely_replace(ut1.TestLoader, "discover", delete=True)
211n/a mock_ut2 = self.prepare_mock_ut2()
212n/a record = []
213n/a mock_ut2.TestLoader.discover = lambda self, path: record.append(path)
214n/a dist = Distribution()
215n/a cmd = test(dist)
216n/a cmd.run()
217n/a self.assertEqual([os.curdir], record)
218n/a
219n/a
220n/adef test_suite():
221n/a return unittest.makeSuite(TestTest)
222n/a
223n/aif __name__ == "__main__":
224n/a unittest.main(defaultTest="test_suite")