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

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

#countcontent
1n/a"""Tests for the packaging.pypi.dist module."""
2n/a
3n/aimport os
4n/aimport shutil
5n/afrom packaging.version import VersionPredicate
6n/afrom packaging.pypi.dist import (ReleaseInfo, ReleasesList, DistInfo,
7n/a split_archive_name, get_infos_from_url)
8n/afrom packaging.pypi.errors import HashDoesNotMatch, UnsupportedHashName
9n/a
10n/afrom packaging.tests import unittest
11n/afrom packaging.tests.support import TempdirManager, requires_zlib, fake_dec
12n/atry:
13n/a import threading
14n/a from packaging.tests.pypi_server import use_pypi_server
15n/aexcept ImportError:
16n/a threading = None
17n/a use_pypi_server = fake_dec
18n/a
19n/a
20n/adef Dist(*args, **kwargs):
21n/a # DistInfo takes a release as a first parameter, avoid this in tests.
22n/a return DistInfo(None, *args, **kwargs)
23n/a
24n/a
25n/aclass TestReleaseInfo(unittest.TestCase):
26n/a
27n/a def test_instantiation(self):
28n/a # Test the DistInfo class provides us the good attributes when
29n/a # given on construction
30n/a release = ReleaseInfo("FooBar", "1.1")
31n/a self.assertEqual("FooBar", release.name)
32n/a self.assertEqual("1.1", "%s" % release.version)
33n/a
34n/a def test_add_dist(self):
35n/a # empty distribution type should assume "sdist"
36n/a release = ReleaseInfo("FooBar", "1.1")
37n/a release.add_distribution(url="http://example.org/")
38n/a # should not fail
39n/a release['sdist']
40n/a
41n/a def test_get_unknown_distribution(self):
42n/a # should raise a KeyError
43n/a pass
44n/a
45n/a def test_get_infos_from_url(self):
46n/a # Test that the the URLs are parsed the right way
47n/a url_list = {
48n/a 'FooBar-1.1.0.tar.gz': {
49n/a 'name': 'foobar', # lowercase the name
50n/a 'version': '1.1.0',
51n/a },
52n/a 'Foo-Bar-1.1.0.zip': {
53n/a 'name': 'foo-bar', # keep the dash
54n/a 'version': '1.1.0',
55n/a },
56n/a 'foobar-1.1b2.tar.gz#md5=123123123123123': {
57n/a 'name': 'foobar',
58n/a 'version': '1.1b2',
59n/a 'url': 'http://example.org/foobar-1.1b2.tar.gz', # no hash
60n/a 'hashval': '123123123123123',
61n/a 'hashname': 'md5',
62n/a },
63n/a 'foobar-1.1-rc2.tar.gz': { # use suggested name
64n/a 'name': 'foobar',
65n/a 'version': '1.1c2',
66n/a 'url': 'http://example.org/foobar-1.1-rc2.tar.gz',
67n/a }
68n/a }
69n/a
70n/a for url, attributes in url_list.items():
71n/a # for each url
72n/a infos = get_infos_from_url("http://example.org/" + url)
73n/a for attribute, expected in attributes.items():
74n/a got = infos.get(attribute)
75n/a if attribute == "version":
76n/a self.assertEqual("%s" % got, expected)
77n/a else:
78n/a self.assertEqual(got, expected)
79n/a
80n/a def test_split_archive_name(self):
81n/a # Test we can split the archive names
82n/a names = {
83n/a 'foo-bar-baz-1.0-rc2': ('foo-bar-baz', '1.0c2'),
84n/a 'foo-bar-baz-1.0': ('foo-bar-baz', '1.0'),
85n/a 'foobarbaz-1.0': ('foobarbaz', '1.0'),
86n/a }
87n/a for name, results in names.items():
88n/a self.assertEqual(results, split_archive_name(name))
89n/a
90n/a
91n/aclass TestDistInfo(TempdirManager, unittest.TestCase):
92n/a srcpath = "/packages/source/f/foobar/foobar-0.1.tar.gz"
93n/a
94n/a def test_get_url(self):
95n/a # Test that the url property works well
96n/a
97n/a d = Dist(url="test_url")
98n/a self.assertDictEqual(d.url, {
99n/a "url": "test_url",
100n/a "is_external": True,
101n/a "hashname": None,
102n/a "hashval": None,
103n/a })
104n/a
105n/a # add a new url
106n/a d.add_url(url="internal_url", is_external=False)
107n/a self.assertEqual(d._url, None)
108n/a self.assertDictEqual(d.url, {
109n/a "url": "internal_url",
110n/a "is_external": False,
111n/a "hashname": None,
112n/a "hashval": None,
113n/a })
114n/a self.assertEqual(2, len(d.urls))
115n/a
116n/a def test_comparison(self):
117n/a # Test that we can compare DistInfoributionInfoList
118n/a foo1 = ReleaseInfo("foo", "1.0")
119n/a foo2 = ReleaseInfo("foo", "2.0")
120n/a bar = ReleaseInfo("bar", "2.0")
121n/a # assert we use the version to compare
122n/a self.assertTrue(foo1 < foo2)
123n/a self.assertFalse(foo1 > foo2)
124n/a self.assertFalse(foo1 == foo2)
125n/a
126n/a # assert we can't compare dists with different names
127n/a self.assertRaises(TypeError, foo1.__eq__, bar)
128n/a
129n/a @unittest.skipIf(threading is None, 'needs threading')
130n/a @use_pypi_server("downloads_with_md5")
131n/a def test_download(self, server):
132n/a # Download is possible, and the md5 is checked if given
133n/a
134n/a url = server.full_address + self.srcpath
135n/a
136n/a # check that a md5 if given
137n/a dist = Dist(url=url, hashname="md5",
138n/a hashval="fe18804c5b722ff024cabdf514924fc4")
139n/a dist.download(self.mkdtemp())
140n/a
141n/a # a wrong md5 fails
142n/a dist2 = Dist(url=url, hashname="md5", hashval="wrongmd5")
143n/a
144n/a self.assertRaises(HashDoesNotMatch, dist2.download, self.mkdtemp())
145n/a
146n/a # we can omit the md5 hash
147n/a dist3 = Dist(url=url)
148n/a dist3.download(self.mkdtemp())
149n/a
150n/a # and specify a temporary location
151n/a # for an already downloaded dist
152n/a path1 = self.mkdtemp()
153n/a dist3.download(path=path1)
154n/a # and for a new one
155n/a path2_base = self.mkdtemp()
156n/a dist4 = Dist(url=url)
157n/a path2 = dist4.download(path=path2_base)
158n/a self.assertIn(path2_base, path2)
159n/a
160n/a def test_hashname(self):
161n/a # Invalid hashnames raises an exception on assignation
162n/a Dist(hashname="md5", hashval="value")
163n/a
164n/a self.assertRaises(UnsupportedHashName, Dist,
165n/a hashname="invalid_hashname",
166n/a hashval="value")
167n/a
168n/a @unittest.skipIf(threading is None, 'needs threading')
169n/a @requires_zlib
170n/a @use_pypi_server('downloads_with_md5')
171n/a def test_unpack(self, server):
172n/a url = server.full_address + self.srcpath
173n/a dist1 = Dist(url=url)
174n/a
175n/a # unpack the distribution in a specfied folder
176n/a dist1_here = self.mkdtemp()
177n/a dist1_there = dist1.unpack(path=dist1_here)
178n/a
179n/a # assert we unpack to the path provided
180n/a self.assertEqual(dist1_here, dist1_there)
181n/a dist1_result = os.listdir(dist1_there)
182n/a self.assertIn('paf', dist1_result)
183n/a os.remove(os.path.join(dist1_there, 'paf'))
184n/a
185n/a # Test unpack works without a path argument
186n/a dist2 = Dist(url=url)
187n/a # doing an unpack
188n/a dist2_there = dist2.unpack()
189n/a self.addCleanup(shutil.rmtree, dist2_there)
190n/a dist2_result = os.listdir(dist2_there)
191n/a self.assertIn('paf', dist2_result)
192n/a os.remove(os.path.join(dist2_there, 'paf'))
193n/a
194n/a
195n/aclass TestReleasesList(unittest.TestCase):
196n/a
197n/a def test_filter(self):
198n/a # Test we filter the distributions the right way, using version
199n/a # predicate match method
200n/a releases = ReleasesList('FooBar', (
201n/a ReleaseInfo("FooBar", "1.1"),
202n/a ReleaseInfo("FooBar", "1.1.1"),
203n/a ReleaseInfo("FooBar", "1.2"),
204n/a ReleaseInfo("FooBar", "1.2.1"),
205n/a ))
206n/a filtered = releases.filter(VersionPredicate("FooBar (<1.2)"))
207n/a self.assertNotIn(releases[2], filtered)
208n/a self.assertNotIn(releases[3], filtered)
209n/a self.assertIn(releases[0], filtered)
210n/a self.assertIn(releases[1], filtered)
211n/a
212n/a def test_append(self):
213n/a # When adding a new item to the list, the behavior is to test if
214n/a # a release with the same name and version number already exists,
215n/a # and if so, to add a new distribution for it. If the distribution type
216n/a # is already defined too, add url informations to the existing DistInfo
217n/a # object.
218n/a
219n/a releases = ReleasesList("FooBar", [
220n/a ReleaseInfo("FooBar", "1.1", url="external_url",
221n/a dist_type="sdist"),
222n/a ])
223n/a self.assertEqual(1, len(releases))
224n/a releases.add_release(release=ReleaseInfo("FooBar", "1.1",
225n/a url="internal_url",
226n/a is_external=False,
227n/a dist_type="sdist"))
228n/a self.assertEqual(1, len(releases))
229n/a self.assertEqual(2, len(releases[0]['sdist'].urls))
230n/a
231n/a releases.add_release(release=ReleaseInfo("FooBar", "1.1.1",
232n/a dist_type="sdist"))
233n/a self.assertEqual(2, len(releases))
234n/a
235n/a # when adding a distribution whith a different type, a new distribution
236n/a # has to be added.
237n/a releases.add_release(release=ReleaseInfo("FooBar", "1.1.1",
238n/a dist_type="bdist"))
239n/a self.assertEqual(2, len(releases))
240n/a self.assertEqual(2, len(releases[1].dists))
241n/a
242n/a def test_prefer_final(self):
243n/a # Can order the distributions using prefer_final
244n/a fb10 = ReleaseInfo("FooBar", "1.0") # final distribution
245n/a fb11a = ReleaseInfo("FooBar", "1.1a1") # alpha
246n/a fb12a = ReleaseInfo("FooBar", "1.2a1") # alpha
247n/a fb12b = ReleaseInfo("FooBar", "1.2b1") # beta
248n/a dists = ReleasesList("FooBar", [fb10, fb11a, fb12a, fb12b])
249n/a
250n/a dists.sort_releases(prefer_final=True)
251n/a self.assertEqual(fb10, dists[0])
252n/a
253n/a dists.sort_releases(prefer_final=False)
254n/a self.assertEqual(fb12b, dists[0])
255n/a
256n/a @unittest.skip('method not implemented yet')
257n/a def test_prefer_source(self):
258n/a # Ordering supports prefer_source
259n/a fb_source = Dist("FooBar", "1.0", type="source")
260n/a fb_binary = Dist("FooBar", "1.0", type="binary")
261n/a fb2_binary = Dist("FooBar", "2.0", type="binary")
262n/a dists = ReleasesList([fb_binary, fb_source])
263n/a
264n/a dists.sort_distributions(prefer_source=True)
265n/a self.assertEqual(fb_source, dists[0])
266n/a
267n/a dists.sort_distributions(prefer_source=False)
268n/a self.assertEqual(fb_binary, dists[0])
269n/a
270n/a dists.append(fb2_binary)
271n/a dists.sort_distributions(prefer_source=True)
272n/a self.assertEqual(fb2_binary, dists[0])
273n/a
274n/a def test_get_last(self):
275n/a dists = ReleasesList('Foo')
276n/a self.assertEqual(dists.get_last('Foo 1.0'), None)
277n/a
278n/a
279n/adef test_suite():
280n/a suite = unittest.TestSuite()
281n/a suite.addTest(unittest.makeSuite(TestDistInfo))
282n/a suite.addTest(unittest.makeSuite(TestReleaseInfo))
283n/a suite.addTest(unittest.makeSuite(TestReleasesList))
284n/a return suite
285n/a
286n/aif __name__ == '__main__':
287n/a unittest.main(defaultTest='test_suite')