1 # Patchwork - automated patch tracking system
2 # Copyright (C) 2009 Jeremy Kerr <jk@ozlabs.org>
4 # This file is part of the Patchwork package.
6 # Patchwork is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # Patchwork is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with Patchwork; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 from django.test import TestCase
22 from django.test.client import Client
23 from patchwork.models import Patch, Bundle, BundlePatch, Person
24 from patchwork.tests.utils import defaults, create_user, find_in_context
26 class BundleListTest(TestCase):
28 self.user = create_user()
29 self.client.login(username = self.user.username,
30 password = self.user.username)
32 def testNoBundles(self):
33 response = self.client.get('/user/bundles/')
34 self.failUnlessEqual(response.status_code, 200)
36 len(find_in_context(response.context, 'bundles')), 0)
38 def testSingleBundle(self):
39 defaults.project.save()
40 bundle = Bundle(owner = self.user, project = defaults.project)
42 response = self.client.get('/user/bundles/')
43 self.failUnlessEqual(response.status_code, 200)
45 len(find_in_context(response.context, 'bundles')), 1)
50 class BundleTestBase(TestCase):
52 patch_names = ['testpatch1', 'testpatch2', 'testpatch3']
53 self.user = create_user()
54 self.client.login(username = self.user.username,
55 password = self.user.username)
56 defaults.project.save()
57 self.bundle = Bundle(owner = self.user, project = defaults.project,
62 for patch_name in patch_names:
63 patch = Patch(project = defaults.project,
64 msgid = patch_name, name = patch_name,
65 submitter = Person.objects.get(user = self.user),
68 self.patches.append(patch)
71 for patch in self.patches:
76 class BundleViewTest(BundleTestBase):
78 def testEmptyBundle(self):
79 response = self.client.get('/user/bundle/%d/' % self.bundle.id)
80 self.failUnlessEqual(response.status_code, 200)
81 page = find_in_context(response.context, 'page')
82 self.failUnlessEqual(len(page.object_list), 0)
84 def testNonEmptyBundle(self):
85 self.bundle.append_patch(self.patches[0])
87 response = self.client.get('/user/bundle/%d/' % self.bundle.id)
88 self.failUnlessEqual(response.status_code, 200)
89 page = find_in_context(response.context, 'page')
90 self.failUnlessEqual(len(page.object_list), 1)
92 def testBundleOrder(self):
93 for patch in self.patches:
94 self.bundle.append_patch(patch)
96 response = self.client.get('/user/bundle/%d/' % self.bundle.id)
99 for patch in self.patches:
100 next_pos = response.content.find(patch.name)
101 # ensure that this patch is after the previous
102 self.failUnless(next_pos > pos)
105 # reorder and recheck
107 for patch in self.patches.__reversed__():
108 bundlepatch = BundlePatch.objects.get(bundle = self.bundle,
110 bundlepatch.order = i
114 response = self.client.get('/user/bundle/%d/' % self.bundle.id)
115 pos = len(response.content)
116 for patch in self.patches:
117 next_pos = response.content.find(patch.name)
118 # ensure that this patch is now *before* the previous
119 self.failUnless(next_pos < pos)
122 class BundleCreateFromListTest(BundleTestBase):
123 def testCreateEmptyBundle(self):
124 newbundlename = 'testbundle-new'
125 params = {'form': 'patchlistform',
126 'bundle_name': newbundlename,
128 'project': defaults.project.id}
130 response = self.client.post(
131 '/project/%s/list/' % defaults.project.linkname,
134 self.assertContains(response, 'Bundle %s created' % newbundlename)
136 def testCreateNonEmptyBundle(self):
137 newbundlename = 'testbundle-new'
138 patch = self.patches[0]
140 params = {'form': 'patchlistform',
141 'bundle_name': newbundlename,
143 'project': defaults.project.id,
144 'patch_id:%d' % patch.id: 'checked'}
146 response = self.client.post(
147 '/project/%s/list/' % defaults.project.linkname,
150 self.assertContains(response, 'Bundle %s created' % newbundlename)
151 self.assertContains(response, 'added to bundle %s' % newbundlename,
154 bundle = Bundle.objects.get(name = newbundlename)
155 self.failUnlessEqual(bundle.patches.count(), 1)
156 self.failUnlessEqual(bundle.patches.all()[0], patch)
158 def testCreateNonEmptyBundleEmptyName(self):
159 newbundlename = 'testbundle-new'
160 patch = self.patches[0]
162 n_bundles = Bundle.objects.count()
164 params = {'form': 'patchlistform',
167 'project': defaults.project.id,
168 'patch_id:%d' % patch.id: 'checked'}
170 response = self.client.post(
171 '/project/%s/list/' % defaults.project.linkname,
174 self.assertContains(response, 'No bundle name was specified',
177 # test that no new bundles are present
178 self.failUnlessEqual(n_bundles, Bundle.objects.count())
180 class BundleCreateFromPatchTest(BundleTestBase):
181 def testCreateNonEmptyBundle(self):
182 newbundlename = 'testbundle-new'
183 patch = self.patches[0]
185 params = {'name': newbundlename,
186 'action': 'createbundle'}
188 response = self.client.post('/patch/%d/' % patch.id, params)
190 self.assertContains(response,
191 'Bundle %s created' % newbundlename)
193 bundle = Bundle.objects.get(name = newbundlename)
194 self.failUnlessEqual(bundle.patches.count(), 1)
195 self.failUnlessEqual(bundle.patches.all()[0], patch)
197 def testCreateWithExistingName(self):
198 newbundlename = self.bundle.name
199 patch = self.patches[0]
201 params = {'name': newbundlename,
202 'action': 'createbundle'}
204 response = self.client.post('/patch/%d/' % patch.id, params)
206 self.assertContains(response,
207 'A bundle called %s already exists' % newbundlename)
209 count = Bundle.objects.count()
210 self.failUnlessEqual(Bundle.objects.count(), 1)
212 class BundleAddFromListTest(BundleTestBase):
213 def testAddToEmptyBundle(self):
214 patch = self.patches[0]
215 params = {'form': 'patchlistform',
217 'project': defaults.project.id,
218 'bundle_id': self.bundle.id,
219 'patch_id:%d' % patch.id: 'checked'}
221 response = self.client.post(
222 '/project/%s/list/' % defaults.project.linkname,
225 self.assertContains(response, 'added to bundle %s' % self.bundle.name,
228 self.failUnlessEqual(self.bundle.patches.count(), 1)
229 self.failUnlessEqual(self.bundle.patches.all()[0], patch)
231 def testAddToNonEmptyBundle(self):
232 self.bundle.append_patch(self.patches[0])
233 patch = self.patches[1]
234 params = {'form': 'patchlistform',
236 'project': defaults.project.id,
237 'bundle_id': self.bundle.id,
238 'patch_id:%d' % patch.id: 'checked'}
240 response = self.client.post(
241 '/project/%s/list/' % defaults.project.linkname,
244 self.assertContains(response, 'added to bundle %s' % self.bundle.name,
247 self.failUnlessEqual(self.bundle.patches.count(), 2)
248 self.failUnless(self.patches[0] in self.bundle.patches.all())
249 self.failUnless(self.patches[1] in self.bundle.patches.all())
252 bps = [ BundlePatch.objects.get(bundle = self.bundle,
253 patch = self.patches[i]) \
255 self.failUnless(bps[0].order < bps[1].order)
257 def testAddDuplicate(self):
258 self.bundle.append_patch(self.patches[0])
259 count = self.bundle.patches.count()
260 patch = self.patches[0]
262 params = {'form': 'patchlistform',
264 'project': defaults.project.id,
265 'bundle_id': self.bundle.id,
266 'patch_id:%d' % patch.id: 'checked'}
268 response = self.client.post(
269 '/project/%s/list/' % defaults.project.linkname,
272 self.assertContains(response, 'Patch '%s' already in bundle' \
273 % patch.name, count = 1, status_code = 200)
275 self.assertEquals(count, self.bundle.patches.count())
277 def testAddNewAndDuplicate(self):
278 self.bundle.append_patch(self.patches[0])
279 count = self.bundle.patches.count()
280 patch = self.patches[0]
282 params = {'form': 'patchlistform',
284 'project': defaults.project.id,
285 'bundle_id': self.bundle.id,
286 'patch_id:%d' % patch.id: 'checked',
287 'patch_id:%d' % self.patches[1].id: 'checked'}
289 response = self.client.post(
290 '/project/%s/list/' % defaults.project.linkname,
293 self.assertContains(response, 'Patch '%s' already in bundle' \
294 % patch.name, count = 1, status_code = 200)
295 self.assertContains(response, 'Patch '%s' added to bundle' \
296 % self.patches[1].name, count = 1,
298 self.assertEquals(count + 1, self.bundle.patches.count())
300 class BundleAddFromPatchTest(BundleTestBase):
301 def testAddToEmptyBundle(self):
302 patch = self.patches[0]
303 params = {'action': 'addtobundle',
304 'bundle_id': self.bundle.id}
306 response = self.client.post('/patch/%d/' % patch.id, params)
308 self.assertContains(response,
309 'added to bundle "%s"' % self.bundle.name,
312 self.failUnlessEqual(self.bundle.patches.count(), 1)
313 self.failUnlessEqual(self.bundle.patches.all()[0], patch)
315 def testAddToNonEmptyBundle(self):
316 self.bundle.append_patch(self.patches[0])
317 patch = self.patches[1]
318 params = {'action': 'addtobundle',
319 'bundle_id': self.bundle.id}
321 response = self.client.post('/patch/%d/' % patch.id, params)
323 self.assertContains(response,
324 'added to bundle "%s"' % self.bundle.name,
327 self.failUnlessEqual(self.bundle.patches.count(), 2)
328 self.failUnless(self.patches[0] in self.bundle.patches.all())
329 self.failUnless(self.patches[1] in self.bundle.patches.all())
332 bps = [ BundlePatch.objects.get(bundle = self.bundle,
333 patch = self.patches[i]) \
335 self.failUnless(bps[0].order < bps[1].order)
337 class BundleReorderTest(BundleTestBase):
339 super(BundleReorderTest, self).setUp()
340 self.bundle.append_patch(self.patches[0])
341 self.bundle.append_patch(self.patches[1])
342 self.bundle.append_patch(self.patches[2])
344 def testBundleReorder(self):
345 bundlepatch = BundlePatch.objects.get(bundle = self.bundle,
346 patch = self.patches[0])
348 neworder = [self.patches[2], self.patches[0], self.patches[1]]
349 neworder_ids = [ p.id for p in neworder ]
351 params = {'form': 'reorderform',
352 'order_start': bundlepatch.order,
353 'neworder': neworder_ids}
355 response = self.client.post('/user/bundle/%d/' % self.bundle.id,
358 self.failUnlessEqual(response.status_code, 200)
360 bundle_ids = [ bp.patch.id for bp in \
361 BundlePatch.objects.filter(bundle = self.bundle) \
364 self.failUnlessEqual(neworder_ids, bundle_ids)