]> git.ozlabs.org Git - patchwork/commitdiff
[tests] Add initial bundle tests
authorJeremy Kerr <jk@ozlabs.org>
Tue, 10 Feb 2009 00:47:40 +0000 (11:47 +1100)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 10 Feb 2009 00:47:40 +0000 (11:47 +1100)
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
apps/patchwork/tests/__init__.py
apps/patchwork/tests/bundles.py [new file with mode: 0644]
apps/patchwork/tests/utils.py

index 113de523663591caf328f85fd56be96a3e87738f..94d629be29696394614f51845e284c010448e5e1 100644 (file)
@@ -18,9 +18,9 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 import unittest
-from patchwork.tests import patchparser, encodings
+from patchwork.tests import patchparser, encodings, bundles
 
-modules = [patchparser, encodings]
+modules = [patchparser, encodings, bundles]
 
 def suite():
     suite = unittest.TestSuite()
diff --git a/apps/patchwork/tests/bundles.py b/apps/patchwork/tests/bundles.py
new file mode 100644 (file)
index 0000000..1346cd8
--- /dev/null
@@ -0,0 +1,287 @@
+# Patchwork - automated patch tracking system
+# Copyright (C) 2009 Jeremy Kerr <jk@ozlabs.org>
+#
+# This file is part of the Patchwork package.
+#
+# Patchwork is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Patchwork is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Patchwork; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import unittest
+from django.test import TestCase
+from django.test.client import Client
+from patchwork.models import Patch, Bundle, BundlePatch, Person
+from patchwork.tests.utils import defaults, create_user, find_in_context
+
+class BundleListTest(TestCase):
+    def setUp(self):
+        self.user = create_user()
+        self.client.login(username = self.user.username,
+                password = self.user.username)
+
+    def testNoBundles(self):
+        response = self.client.get('/user/bundles/')
+        self.failUnlessEqual(response.status_code, 200)
+        self.failUnlessEqual(
+                len(find_in_context(response.context, 'bundles')), 0)
+
+    def testSingleBundle(self):
+        defaults.project.save()
+        bundle = Bundle(owner = self.user, project = defaults.project)
+        bundle.save()
+        response = self.client.get('/user/bundles/')
+        self.failUnlessEqual(response.status_code, 200)
+        self.failUnlessEqual(
+                len(find_in_context(response.context, 'bundles')), 1)
+
+    def tearDown(self):
+        self.user.delete()
+
+class BundleTestBase(TestCase):
+    def setUp(self):
+        patch_names = ['testpatch1', 'testpatch2', 'testpatch3']
+        self.user = create_user()
+        self.client.login(username = self.user.username,
+                password = self.user.username)
+        defaults.project.save()
+        self.bundle = Bundle(owner = self.user, project = defaults.project,
+                name = 'testbundle')
+        self.bundle.save()
+        self.patches = []
+
+        for patch_name in patch_names:
+            patch = Patch(project = defaults.project,
+                               msgid = patch_name, name = patch_name,
+                               submitter = Person.objects.get(user = self.user),
+                               content = '')
+            patch.save()
+            self.patches.append(patch)
+
+    def tearDown(self):
+        for patch in self.patches:
+            patch.delete()
+        self.bundle.delete()
+        self.user.delete()
+
+class BundleViewTest(BundleTestBase):
+
+    def testEmptyBundle(self):
+        response = self.client.get('/user/bundle/%d/' % self.bundle.id)
+        self.failUnlessEqual(response.status_code, 200)
+        page = find_in_context(response.context, 'page')
+        self.failUnlessEqual(len(page.object_list), 0)
+
+    def testNonEmptyBundle(self):
+        self.bundle.append_patch(self.patches[0])
+
+        response = self.client.get('/user/bundle/%d/' % self.bundle.id)
+        self.failUnlessEqual(response.status_code, 200)
+        page = find_in_context(response.context, 'page')
+        self.failUnlessEqual(len(page.object_list), 1)
+
+    def testBundleOrder(self):
+        for patch in self.patches:
+            self.bundle.append_patch(patch)
+
+        response = self.client.get('/user/bundle/%d/' % self.bundle.id)
+
+        pos = 0
+        for patch in self.patches:
+            next_pos = response.content.find(patch.name)
+            # ensure that this patch is after the previous
+            self.failUnless(next_pos > pos)
+            pos = next_pos
+
+        # reorder and recheck
+        i = 0
+        for patch in self.patches.__reversed__():
+            bundlepatch = BundlePatch.objects.get(bundle = self.bundle,
+                    patch = patch)
+            bundlepatch.order = i
+            bundlepatch.save()
+            i += 1
+
+        response = self.client.get('/user/bundle/%d/' % self.bundle.id)
+        pos = len(response.content)
+        for patch in self.patches:
+            next_pos = response.content.find(patch.name)
+            # ensure that this patch is now *before* the previous
+            self.failUnless(next_pos < pos)
+            pos = next_pos
+
+class BundleCreateFromListTest(BundleTestBase):
+    def testCreateEmptyBundle(self):
+        newbundlename = 'testbundle-new'
+        params = {'form': 'patchlistform',
+                  'bundle_name': newbundlename,
+                  'action': 'Create',
+                  'project': defaults.project.id}
+
+        response = self.client.post(
+                '/project/%s/list/' % defaults.project.linkname,
+                params)
+
+        self.assertContains(response, 'Bundle %s created' % newbundlename)
+
+    def testCreateNonEmptyBundle(self):
+        newbundlename = 'testbundle-new'
+        patch = self.patches[0]
+
+        params = {'form': 'patchlistform',
+                  'bundle_name': newbundlename,
+                  'action': 'Create',
+                  'project': defaults.project.id,
+                  'patch_id:%d' % patch.id: 'checked'}
+
+        response = self.client.post(
+                '/project/%s/list/' % defaults.project.linkname,
+                params)
+
+        self.assertContains(response, 'Bundle %s created' % newbundlename)
+        self.assertContains(response, 'added to bundle %s' % newbundlename,
+            count = 1)
+
+        bundle = Bundle.objects.get(name = newbundlename)
+        self.failUnlessEqual(bundle.patches.count(), 1)
+        self.failUnlessEqual(bundle.patches.all()[0], patch)
+
+class BundleCreateFromPatchTest(BundleTestBase):
+    def testCreateNonEmptyBundle(self):
+        newbundlename = 'testbundle-new'
+        patch = self.patches[0]
+
+        params = {'name': newbundlename,
+                  'action': 'createbundle'}
+
+        response = self.client.post('/patch/%d/' % patch.id, params)
+
+        self.assertContains(response,
+                'Bundle %s created' % newbundlename)
+
+        bundle = Bundle.objects.get(name = newbundlename)
+        self.failUnlessEqual(bundle.patches.count(), 1)
+        self.failUnlessEqual(bundle.patches.all()[0], patch)
+
+
+class BundleAddFromListTest(BundleTestBase):
+    def testAddToEmptyBundle(self):
+        patch = self.patches[0]
+        params = {'form': 'patchlistform',
+                  'action': 'Add',
+                  'project': defaults.project.id,
+                  'bundle_id': self.bundle.id,
+                  'patch_id:%d' % patch.id: 'checked'}
+
+        response = self.client.post(
+                '/project/%s/list/' % defaults.project.linkname,
+                params)
+
+        self.assertContains(response, 'added to bundle %s' % self.bundle.name,
+            count = 1)
+
+        self.failUnlessEqual(self.bundle.patches.count(), 1)
+        self.failUnlessEqual(self.bundle.patches.all()[0], patch)
+
+    def testAddToNonEmptyBundle(self):
+        self.bundle.append_patch(self.patches[0])
+        patch = self.patches[1]
+        params = {'form': 'patchlistform',
+                  'action': 'Add',
+                  'project': defaults.project.id,
+                  'bundle_id': self.bundle.id,
+                  'patch_id:%d' % patch.id: 'checked'}
+
+        response = self.client.post(
+                '/project/%s/list/' % defaults.project.linkname,
+                params)
+
+        self.assertContains(response, 'added to bundle %s' % self.bundle.name,
+            count = 1)
+
+        self.failUnlessEqual(self.bundle.patches.count(), 2)
+        self.failUnless(self.patches[0] in self.bundle.patches.all())
+        self.failUnless(self.patches[1] in self.bundle.patches.all())
+
+        # check order
+        bps = [ BundlePatch.objects.get(bundle = self.bundle,
+                                        patch = self.patches[i]) \
+                for i in [0, 1] ]
+        self.failUnless(bps[0].order < bps[1].order)
+
+class BundleAddFromPatchTest(BundleTestBase):
+    def testAddToEmptyBundle(self):
+        patch = self.patches[0]
+        params = {'action': 'addtobundle',
+                  'bundle_id': self.bundle.id}
+
+        response = self.client.post('/patch/%d/' % patch.id, params)
+
+        self.assertContains(response,
+                'added to bundle &quot;%s&quot;' % self.bundle.name,
+                count = 1)
+
+        self.failUnlessEqual(self.bundle.patches.count(), 1)
+        self.failUnlessEqual(self.bundle.patches.all()[0], patch)
+
+    def testAddToNonEmptyBundle(self):
+        self.bundle.append_patch(self.patches[0])
+        patch = self.patches[1]
+        params = {'action': 'addtobundle',
+                  'bundle_id': self.bundle.id}
+
+        response = self.client.post('/patch/%d/' % patch.id, params)
+
+        self.assertContains(response,
+                'added to bundle &quot;%s&quot;' % self.bundle.name,
+                count = 1)
+
+        self.failUnlessEqual(self.bundle.patches.count(), 2)
+        self.failUnless(self.patches[0] in self.bundle.patches.all())
+        self.failUnless(self.patches[1] in self.bundle.patches.all())
+
+        # check order
+        bps = [ BundlePatch.objects.get(bundle = self.bundle,
+                                        patch = self.patches[i]) \
+                for i in [0, 1] ]
+        self.failUnless(bps[0].order < bps[1].order)
+
+class BundleReorderTest(BundleTestBase):
+    def setUp(self):
+        super(BundleReorderTest, self).setUp()
+        self.bundle.append_patch(self.patches[0])
+        self.bundle.append_patch(self.patches[1])
+        self.bundle.append_patch(self.patches[2])
+
+    def testBundleReorder(self):
+        bundlepatch = BundlePatch.objects.get(bundle = self.bundle,
+                patch = self.patches[0])
+
+        neworder = [self.patches[2], self.patches[0], self.patches[1]]
+        neworder_ids = [ p.id for p in neworder ]
+
+        params = {'form': 'reorderform',
+                  'order_start': bundlepatch.order,
+                  'neworder': neworder_ids}
+
+        response = self.client.post('/user/bundle/%d/' % self.bundle.id,
+                                    params)
+
+        self.failUnlessEqual(response.status_code, 200)
+
+        bundle_ids = [ bp.patch.id for bp in \
+                        BundlePatch.objects.filter(bundle = self.bundle) \
+                        .order_by('order') ]
+
+        self.failUnlessEqual(neworder_ids, bundle_ids)
+
+
index a2bec15061a012c9ce8582ee93447da9b4af7fe4..7166ed27ccdc0fdb7bdb11fce584fab3e2f0c05d 100644 (file)
@@ -19,7 +19,9 @@
 
 import os
 import codecs
-from patchwork.models import Project, Person
+from patchwork.models import Project, Person, UserProfile
+from django.contrib.auth.models import User
+
 try:
     from email.mime.text import MIMEText
     from email.mime.multipart import MIMEMultipart
@@ -47,6 +49,31 @@ class defaults(object):
 
     patch_name = 'Test Patch'
 
+_user_idx = 1
+def create_user():
+    global _user_idx
+    userid = 'test-%d' % _user_idx
+    email = '%s@example.com' % userid
+    _user_idx += 1
+
+    user = User.objects.create_user(userid, email, userid)
+    user.save()
+
+    profile = UserProfile(user = user)
+    profile.save()
+
+    return user
+
+def find_in_context(context, key):
+    if isinstance(context, list):
+        for c in context:
+            v = find_in_context(c, key)
+            if v is not None:
+                return v
+    else:
+        if key in context:
+            return context[key]
+    return None
 
 def read_patch(filename, encoding = None):
     file_path = os.path.join(_test_patch_dir, filename)