X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Ftests%2Fbundles.py;h=5e8b95ba92f7fafd3dcda2f04698b0c731133275;hb=628a57c214b63b81e457a4a369cc370f4254358f;hp=d516ea8d578509ae9e10d24c2bfe924de132b6a3;hpb=92d396d5e2d95dfaca844dcf13918ed66c39eead;p=patchwork diff --git a/apps/patchwork/tests/bundles.py b/apps/patchwork/tests/bundles.py index d516ea8..5e8b95b 100644 --- a/apps/patchwork/tests/bundles.py +++ b/apps/patchwork/tests/bundles.py @@ -22,9 +22,13 @@ import datetime from django.test import TestCase from django.test.client import Client from django.utils.http import urlencode +from django.conf import settings from patchwork.models import Patch, Bundle, BundlePatch, Person from patchwork.tests.utils import defaults, create_user, find_in_context +def bundle_url(bundle): + return '/bundle/%s/%s/' % (bundle.owner.username, bundle.name) + class BundleListTest(TestCase): def setUp(self): self.user = create_user() @@ -78,7 +82,7 @@ class BundleTestBase(TestCase): class BundleViewTest(BundleTestBase): def testEmptyBundle(self): - response = self.client.get('/user/bundle/%d/' % self.bundle.id) + response = self.client.get(bundle_url(self.bundle)) self.failUnlessEqual(response.status_code, 200) page = find_in_context(response.context, 'page') self.failUnlessEqual(len(page.object_list), 0) @@ -86,7 +90,7 @@ class BundleViewTest(BundleTestBase): def testNonEmptyBundle(self): self.bundle.append_patch(self.patches[0]) - response = self.client.get('/user/bundle/%d/' % self.bundle.id) + response = self.client.get(bundle_url(self.bundle)) self.failUnlessEqual(response.status_code, 200) page = find_in_context(response.context, 'page') self.failUnlessEqual(len(page.object_list), 1) @@ -95,7 +99,7 @@ class BundleViewTest(BundleTestBase): for patch in self.patches: self.bundle.append_patch(patch) - response = self.client.get('/user/bundle/%d/' % self.bundle.id) + response = self.client.get(bundle_url(self.bundle)) pos = 0 for patch in self.patches: @@ -113,7 +117,7 @@ class BundleViewTest(BundleTestBase): bundlepatch.save() i += 1 - response = self.client.get('/user/bundle/%d/' % self.bundle.id) + response = self.client.get(bundle_url(self.bundle)) pos = len(response.content) for patch in self.patches: next_pos = response.content.find(patch.name) @@ -121,13 +125,85 @@ class BundleViewTest(BundleTestBase): self.failUnless(next_pos < pos) pos = next_pos +class BundleUpdateTest(BundleTestBase): + + def setUp(self): + super(BundleUpdateTest, self).setUp() + self.newname = 'newbundlename' + + def checkPatchformErrors(self, response): + formname = 'patchform' + if not formname in response.context: + return + form = response.context[formname] + if not form: + return + self.assertEquals(form.errors, {}) + + def publicString(self, public): + if public: + return 'on' + return '' + + def testNoAction(self): + data = { + 'form': 'bundle', + 'name': self.newname, + 'public': self.publicString(not self.bundle.public) + } + response = self.client.post(bundle_url(self.bundle), data) + self.assertEqual(response.status_code, 200) + + bundle = Bundle.objects.get(pk = self.bundle.pk) + self.assertEqual(bundle.name, self.bundle.name) + self.assertEqual(bundle.public, self.bundle.public) + + def testUpdateName(self): + newname = 'newbundlename' + data = { + 'form': 'bundle', + 'action': 'update', + 'name': newname, + 'public': self.publicString(self.bundle.public) + } + response = self.client.post(bundle_url(self.bundle), data) + bundle = Bundle.objects.get(pk = self.bundle.pk) + self.assertRedirects(response, bundle_url(bundle)) + self.assertEqual(bundle.name, newname) + self.assertEqual(bundle.public, self.bundle.public) + + def testUpdatePublic(self): + newname = 'newbundlename' + data = { + 'form': 'bundle', + 'action': 'update', + 'name': self.bundle.name, + 'public': self.publicString(not self.bundle.public) + } + response = self.client.post(bundle_url(self.bundle), data) + self.assertEqual(response.status_code, 200) + bundle = Bundle.objects.get(pk = self.bundle.pk) + self.assertEqual(bundle.name, self.bundle.name) + self.assertEqual(bundle.public, not self.bundle.public) + + # check other forms for errors + self.checkPatchformErrors(response) + +class BundleMaintainerUpdateTest(BundleUpdateTest): + + def setUp(self): + super(BundleMaintainerUpdateTest, self).setUp() + profile = self.user.get_profile() + profile.maintainer_projects.add(defaults.project) + profile.save() + class BundlePublicViewTest(BundleTestBase): def setUp(self): super(BundlePublicViewTest, self).setUp() self.client.logout() self.bundle.append_patch(self.patches[0]) - self.url = '/bundle/%s/%s/' % (self.user.username, self.bundle.name) + self.url = bundle_url(self.bundle) def testPublicBundle(self): self.bundle.public = True @@ -145,8 +221,53 @@ class BundlePublicViewTest(BundleTestBase): class BundlePublicViewMboxTest(BundlePublicViewTest): def setUp(self): super(BundlePublicViewMboxTest, self).setUp() - self.url = '/bundle/%s/%s/mbox/' % (self.user.username, - self.bundle.name) + self.url = bundle_url(self.bundle) + "mbox/" + +class BundlePublicModifyTest(BundleTestBase): + """Ensure that non-owners can't modify bundles""" + + def setUp(self): + super(BundlePublicModifyTest, self).setUp() + self.bundle.public = True + self.bundle.save() + self.other_user = create_user() + + def testBundleFormPresence(self): + """Check for presence of the modify form on the bundle""" + self.client.login(username = self.other_user.username, + password = self.other_user.username) + response = self.client.get(bundle_url(self.bundle)) + self.assertNotContains(response, 'name="form" value="bundle"') + self.assertNotContains(response, 'Change order') + + def testBundleFormSubmission(self): + oldname = 'oldbundlename' + newname = 'newbundlename' + data = { + 'form': 'bundle', + 'action': 'update', + 'name': newname, + } + self.bundle.name = oldname + self.bundle.save() + + # first, check that we can modify with the owner + self.client.login(username = self.user.username, + password = self.user.username) + response = self.client.post(bundle_url(self.bundle), data) + self.bundle = Bundle.objects.get(pk = self.bundle.pk) + self.assertEqual(self.bundle.name, newname) + + # reset bundle name + self.bundle.name = oldname + self.bundle.save() + + # log in with a different user, and check that we can no longer modify + self.client.login(username = self.other_user.username, + password = self.other_user.username) + response = self.client.post(bundle_url(self.bundle), data) + self.bundle = Bundle.objects.get(pk = self.bundle.pk) + self.assertNotEqual(self.bundle.name, newname) class BundleCreateFromListTest(BundleTestBase): def testCreateEmptyBundle(self): @@ -472,8 +593,7 @@ class BundleReorderTest(BundleTestBase): 'order_start': firstpatch.id, 'neworder': slice_ids} - response = self.client.post('/user/bundle/%d/' % self.bundle.id, - params) + response = self.client.post(bundle_url(self.bundle), params) self.failUnlessEqual(response.status_code, 200) @@ -504,3 +624,23 @@ class BundleReorderTest(BundleTestBase): def testBundleReorderMiddle(self): # reorder only 2nd, 3rd, and 4th patches self.checkReordering([0,2,3,1,4], 1, 4) + +class BundleRedirTest(BundleTestBase): + # old URL: private bundles used to be under /user/bundle/ + + def setUp(self): + super(BundleRedirTest, self).setUp() + + @unittest.skipIf(not settings.COMPAT_REDIR, "compat redirections disabled") + def testBundleRedir(self): + url = '/user/bundle/%d/' % self.bundle.id + response = self.client.get(url) + self.assertRedirects(response, bundle_url(self.bundle)) + + @unittest.skipIf(not settings.COMPAT_REDIR, "compat redirections disabled") + def testMboxRedir(self): + url = '/user/bundle/%d/mbox/' % self.bundle.id + response = self.client.get(url) + self.assertRedirects(response,'/bundle/%s/%s/mbox/' % + (self.bundle.owner.username, + self.bundle.name))