"""Tests for the packaging.pypi.xmlrpc module.""" from packaging.pypi.xmlrpc import Client, InvalidSearchField, ProjectNotFound from packaging.tests import unittest from packaging.tests.support import fake_dec try: import threading from packaging.tests.pypi_server import use_xmlrpc_server except ImportError: threading = None use_xmlrpc_server = fake_dec @unittest.skipIf(threading is None, "Needs threading") class TestXMLRPCClient(unittest.TestCase): def _get_client(self, server, *args, **kwargs): return Client(server.full_address, *args, **kwargs) @use_xmlrpc_server() def test_search_projects(self, server): client = self._get_client(server) server.xmlrpc.set_search_result(['FooBar', 'Foo', 'FooFoo']) results = [r.name for r in client.search_projects(name='Foo')] self.assertEqual(3, len(results)) self.assertIn('FooBar', results) self.assertIn('Foo', results) self.assertIn('FooFoo', results) def test_search_projects_bad_fields(self): client = Client() self.assertRaises(InvalidSearchField, client.search_projects, invalid="test") @use_xmlrpc_server() def test_get_releases(self, server): client = self._get_client(server) server.xmlrpc.set_distributions([ {'name': 'FooBar', 'version': '1.1'}, {'name': 'FooBar', 'version': '1.2', 'url': 'http://some/url/'}, {'name': 'FooBar', 'version': '1.3', 'url': 'http://other/url/'}, ]) # use a lambda here to avoid an useless mock call server.xmlrpc.list_releases = lambda *a, **k: ['1.1', '1.2', '1.3'] releases = client.get_releases('FooBar (<=1.2)') # dont call release_data and release_url; just return name and version. self.assertEqual(2, len(releases)) versions = releases.get_versions() self.assertIn('1.1', versions) self.assertIn('1.2', versions) self.assertNotIn('1.3', versions) self.assertRaises(ProjectNotFound, client.get_releases, 'Foo') @use_xmlrpc_server() def test_get_distributions(self, server): client = self._get_client(server) server.xmlrpc.set_distributions([ {'name': 'FooBar', 'version': '1.1', 'url': 'http://example.org/foobar-1.1-sdist.tar.gz', 'digest': '1234567', 'type': 'sdist', 'python_version': 'source'}, {'name':'FooBar', 'version': '1.1', 'url': 'http://example.org/foobar-1.1-bdist.tar.gz', 'digest': '8912345', 'type': 'bdist'}, ]) releases = client.get_releases('FooBar', '1.1') client.get_distributions('FooBar', '1.1') release = releases.get_release('1.1') self.assertTrue('http://example.org/foobar-1.1-sdist.tar.gz', release['sdist'].url['url']) self.assertTrue('http://example.org/foobar-1.1-bdist.tar.gz', release['bdist'].url['url']) self.assertEqual(release['sdist'].python_version, 'source') @use_xmlrpc_server() def test_get_metadata(self, server): client = self._get_client(server) server.xmlrpc.set_distributions([ {'name': 'FooBar', 'version': '1.1', 'keywords': '', 'obsoletes_dist': ['FooFoo'], 'requires_external': ['Foo'], }]) release = client.get_metadata('FooBar', '1.1') self.assertEqual(['Foo'], release.metadata['requires_external']) self.assertEqual(['FooFoo'], release.metadata['obsoletes_dist']) def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestXMLRPCClient)) return suite if __name__ == '__main__': unittest.main(defaultTest='test_suite')