diff options
| -rw-r--r-- | apps/patchwork/tests/__init__.py | 4 | ||||
| -rw-r--r-- | apps/patchwork/tests/bundles.py | 287 | ||||
| -rw-r--r-- | apps/patchwork/tests/utils.py | 29 | 
3 files changed, 317 insertions, 3 deletions
diff --git a/apps/patchwork/tests/__init__.py b/apps/patchwork/tests/__init__.py index 113de52..94d629b 100644 --- a/apps/patchwork/tests/__init__.py +++ b/apps/patchwork/tests/__init__.py @@ -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 index 0000000..1346cd8 --- /dev/null +++ b/apps/patchwork/tests/bundles.py @@ -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 "%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 = {'action': 'addtobundle', +                  'bundle_id': self.bundle.id} + +        response = self.client.post('/patch/%d/' % patch.id, 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 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) + + diff --git a/apps/patchwork/tests/utils.py b/apps/patchwork/tests/utils.py index a2bec15..7166ed2 100644 --- a/apps/patchwork/tests/utils.py +++ b/apps/patchwork/tests/utils.py @@ -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)  | 
