X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Ftests%2Fbundles.py;h=5e8b95ba92f7fafd3dcda2f04698b0c731133275;hb=628a57c214b63b81e457a4a369cc370f4254358f;hp=e500b3e5412b3180ed119b84c423c45a642125dc;hpb=5bbfb1fc8dc4c034416a9e951de8b9b27ff1d838;p=patchwork diff --git a/apps/patchwork/tests/bundles.py b/apps/patchwork/tests/bundles.py index e500b3e..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,6 +125,150 @@ 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_url(self.bundle) + + def testPublicBundle(self): + self.bundle.public = True + self.bundle.save() + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertContains(response, self.patches[0].name) + + def testPrivateBundle(self): + self.bundle.public = False + self.bundle.save() + response = self.client.get(self.url) + self.assertEqual(response.status_code, 404) + +class BundlePublicViewMboxTest(BundlePublicViewTest): + def setUp(self): + super(BundlePublicViewMboxTest, self).setUp() + 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): newbundlename = 'testbundle-new' @@ -445,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) @@ -477,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))