XMLRPC defines a bunch of very similar methods for getting and listing a bunch of different models. So create a mixin that allows us to test an arbitrary model, then use that to create test classes to test the various models.
Add other tests as well. Signed-off-by: Daniel Axtens <[email protected]> --- patchwork/tests/test_xmlrpc.py | 196 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 179 insertions(+), 17 deletions(-) diff --git a/patchwork/tests/test_xmlrpc.py b/patchwork/tests/test_xmlrpc.py index ec804ac668c3..d3b8b9fbf818 100644 --- a/patchwork/tests/test_xmlrpc.py +++ b/patchwork/tests/test_xmlrpc.py @@ -24,42 +24,204 @@ from django.core.urlresolvers import reverse from django.test import LiveServerTestCase from django.utils.six.moves import xmlrpc_client -from patchwork.tests.utils import create_patches +from patchwork.tests import utils @unittest.skipUnless(settings.ENABLE_XMLRPC, 'requires xmlrpc interface (use the ENABLE_XMLRPC ' 'setting)') class XMLRPCTest(LiveServerTestCase): - def setUp(self): self.url = self.live_server_url + reverse('xmlrpc') self.rpc = xmlrpc_client.Server(self.url) + +class XMLRPCGenericTest(XMLRPCTest): + def test_pw_rpc_version(self): + # If you update the RPC version, update the tests! + self.assertEqual(self.rpc.pw_rpc_version(), [1, 2, 0]) + def test_get_redirect(self): response = self.client.patch(self.url) self.assertRedirects( response, reverse('help', kwargs={'path': 'pwclient/'})) + def test_invalid_method(self): + with self.assertRaises(xmlrpc_client.Fault): + self.rpc.xyzzy() + + def test_absent_auth(self): + with self.assertRaises(xmlrpc_client.Fault): + self.rpc.patch_set(0, {}) + + +class XMLRPCAuthenticatedTest(LiveServerTestCase): + def setUp(self): + self.url = self.live_server_url + reverse('xmlrpc') + # url is of the form http://localhost:PORT/PATH + # strip the http and replace it with the username/passwd of a user. + self.project = utils.create_project() + self.user = utils.create_maintainer(self.project) + self.url = ('http://%s:%s@' + self.url[7:]) % (self.user.username, + self.user.username) + self.rpc = xmlrpc_client.Server(self.url) + + def test_patch_set(self): + patch = utils.create_patch(project=self.project) + result = self.rpc.patch_get(patch.id) + self.assertFalse(result['archived']) + + self.rpc.patch_set(patch.id, {'archived': True}) + + # reload the patch + result = self.rpc.patch_get(patch.id) + self.assertTrue(result['archived']) + + +class XMLRPCModelTestMixin: + def CREATE_MULTIPLE(self, count): + return [self.CREATE_ONE() for i in range(count)] + + def test_get_none(self): + self.assertEqual(self.GET_ENDPOINT(0), {}) + + def test_list_none(self): + self.assertEqual(self.LIST_ENDPOINT(), []) + def test_list_single(self): - patch_objs = create_patches() - patches = self.rpc.patch_list() - self.assertEqual(len(patches), 1) - self.assertEqual(patches[0]['id'], patch_objs[0].id) + obj = self.CREATE_ONE() + result = self.LIST_ENDPOINT() + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], obj.id) + + def test_list_named(self): + obj = self.CREATE_ONE(name='FOOBARBAZ') + self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT('oobarb') + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], obj.id) + + def test_list_named_none(self): + self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT('invisible') + self.assertEqual(len(result), 0) + + def test_get_single(self): + obj = self.CREATE_ONE() + result = self.GET_ENDPOINT(obj.id) + self.assertEqual(result['id'], obj.id) + + def test_get_invalid(self): + obj = self.CREATE_ONE() + result = self.GET_ENDPOINT(obj.id + 1) + self.assertEqual(result, {}) def test_list_multiple(self): - create_patches(5) - patches = self.rpc.patch_list() - self.assertEqual(len(patches), 5) + self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT() + self.assertEqual(len(result), 5) + + def test_list_max_count(self): + objs = self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT("", 2) + self.assertEqual(len(result), 2) + self.assertEqual(result[0]['id'], objs[0].id) + + def test_list_negative_max_count(self): + objs = self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT("", -1) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], objs[-1].id) + +class XMLRPCFilterModelTestMixin(XMLRPCModelTestMixin): + # override these tests due to the way you pass in filters def test_list_max_count(self): - patch_objs = create_patches(5) - patches = self.rpc.patch_list({'max_count': 2}) - self.assertEqual(len(patches), 2) - self.assertEqual(patches[0]['id'], patch_objs[0].id) + objs = self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT({'max_count': 2}) + self.assertEqual(len(result), 2) + self.assertEqual(result[0]['id'], objs[0].id) def test_list_negative_max_count(self): - patch_objs = create_patches(5) - patches = self.rpc.patch_list({'max_count': -1}) - self.assertEqual(len(patches), 1) - self.assertEqual(patches[0]['id'], patch_objs[-1].id) + objs = self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT({'max_count': -1}) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], objs[-1].id) + + def test_list_named(self): + obj = self.CREATE_ONE(name='FOOBARBAZ') + self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT({'name__icontains': 'oobarb'}) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], obj.id) + + def test_list_named_none(self): + self.CREATE_MULTIPLE(5) + result = self.LIST_ENDPOINT({'name__icontains': 'invisible'}) + self.assertEqual(len(result), 0) + + +class XMLRPCPatchTest(XMLRPCTest, XMLRPCFilterModelTestMixin): + def setUp(self): + super(XMLRPCPatchTest, self).setUp() + self.GET_ENDPOINT = self.rpc.patch_get + self.LIST_ENDPOINT = self.rpc.patch_list + self.CREATE_MULTIPLE = utils.create_patches + + def CREATE_ONE(self, **kwargs): + return utils.create_patches(**kwargs)[0] + + def test_patch_check_get(self): + patch = self.CREATE_ONE() + check = utils.create_check(patch=patch) + result = self.rpc.patch_check_get(patch.id) + self.assertEqual(result['total'], 1) + self.assertEqual(result['checks'][0]['id'], check.id) + self.assertEqual(result['checks'][0]['patch_id'], patch.id) + + def test_patch_get_by_hash(self): + patch = self.CREATE_ONE() + result = self.rpc.patch_get_by_hash(patch.hash) + self.assertEqual(result['id'], patch.id) + + +class XMLRPCPersonTest(XMLRPCTest, XMLRPCModelTestMixin): + def setUp(self): + super(XMLRPCPersonTest, self).setUp() + self.GET_ENDPOINT = self.rpc.person_get + self.LIST_ENDPOINT = self.rpc.person_list + self.CREATE_ONE = utils.create_person + + +class XMLRPCProjectTest(XMLRPCTest, XMLRPCModelTestMixin): + def setUp(self): + super(XMLRPCProjectTest, self).setUp() + self.GET_ENDPOINT = self.rpc.project_get + self.LIST_ENDPOINT = self.rpc.project_list + self.CREATE_ONE = utils.create_project + + # project filters by linkname, not name! + def test_list_named(self): + obj = self.CREATE_ONE(linkname='FOOBARBAZ') + result = self.LIST_ENDPOINT('oobarb') + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['id'], obj.id) + + +class XMLRPCStateTest(XMLRPCTest, XMLRPCModelTestMixin): + def setUp(self): + super(XMLRPCStateTest, self).setUp() + self.GET_ENDPOINT = self.rpc.state_get + self.LIST_ENDPOINT = self.rpc.state_list + self.CREATE_ONE = utils.create_state + + +class XMLRPCCheckTest(XMLRPCTest, XMLRPCFilterModelTestMixin): + def setUp(self): + super(XMLRPCCheckTest, self).setUp() + self.GET_ENDPOINT = self.rpc.check_get + self.LIST_ENDPOINT = self.rpc.check_list + self.CREATE_ONE = utils.create_check + + def test_list_named(self): + pass -- 2.7.4 _______________________________________________ Patchwork mailing list [email protected] https://lists.ozlabs.org/listinfo/patchwork
