1 # Patchwork - automated patch tracking system
2 # Copyright (C) 2010 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 django.core import mail
24 from django.core.urlresolvers import reverse
25 from django.conf import settings
26 from django.contrib.auth.models import User
27 from patchwork.models import EmailConfirmation, Person, Bundle
28 from patchwork.tests.utils import defaults, error_strings
30 def _confirmation_url(conf):
31 return reverse('patchwork.views.confirm', kwargs = {'key': conf.key})
33 class TestUser(object):
35 email = 'test@example.com'
36 secondary_email = 'test2@example.com'
40 self.password = User.objects.make_random_password()
41 self.user = User.objects.create_user(self.username,
42 self.email, self.password)
44 class UserPersonRequestTest(TestCase):
46 self.user = TestUser()
47 self.client.login(username = self.user.username,
48 password = self.user.password)
49 EmailConfirmation.objects.all().delete()
51 def testUserPersonRequestForm(self):
52 response = self.client.get('/user/link/')
53 self.assertEquals(response.status_code, 200)
54 self.assertTrue(response.context['linkform'])
56 def testUserPersonRequestEmpty(self):
57 response = self.client.post('/user/link/', {'email': ''})
58 self.assertEquals(response.status_code, 200)
59 self.assertTrue(response.context['linkform'])
60 self.assertFormError(response, 'linkform', 'email',
61 'This field is required.')
63 def testUserPersonRequestInvalid(self):
64 response = self.client.post('/user/link/', {'email': 'foo'})
65 self.assertEquals(response.status_code, 200)
66 self.assertTrue(response.context['linkform'])
67 self.assertFormError(response, 'linkform', 'email',
68 error_strings['email'])
70 def testUserPersonRequestValid(self):
71 response = self.client.post('/user/link/',
72 {'email': self.user.secondary_email})
73 self.assertEquals(response.status_code, 200)
74 self.assertTrue(response.context['confirmation'])
76 # check that we have a confirmation saved
77 self.assertEquals(EmailConfirmation.objects.count(), 1)
78 conf = EmailConfirmation.objects.all()[0]
79 self.assertEquals(conf.user, self.user.user)
80 self.assertEquals(conf.email, self.user.secondary_email)
81 self.assertEquals(conf.type, 'userperson')
83 # check that an email has gone out...
84 self.assertEquals(len(mail.outbox), 1)
86 self.assertEquals(msg.subject, 'Patchwork email address confirmation')
87 self.assertTrue(self.user.secondary_email in msg.to)
88 self.assertTrue(_confirmation_url(conf) in msg.body)
90 # ...and that the URL is valid
91 response = self.client.get(_confirmation_url(conf))
92 self.assertEquals(response.status_code, 200)
93 self.assertTemplateUsed(response, 'patchwork/user-link-confirm.html')
95 class UserPersonConfirmTest(TestCase):
97 EmailConfirmation.objects.all().delete()
98 Person.objects.all().delete()
99 self.user = TestUser()
100 self.client.login(username = self.user.username,
101 password = self.user.password)
102 self.conf = EmailConfirmation(type = 'userperson',
103 email = self.user.secondary_email,
104 user = self.user.user)
107 def testUserPersonConfirm(self):
108 self.assertEquals(Person.objects.count(), 0)
109 response = self.client.get(_confirmation_url(self.conf))
110 self.assertEquals(response.status_code, 200)
112 # check that the Person object has been created and linked
113 self.assertEquals(Person.objects.count(), 1)
114 person = Person.objects.get(email = self.user.secondary_email)
115 self.assertEquals(person.email, self.user.secondary_email)
116 self.assertEquals(person.user, self.user.user)
118 # check that the confirmation has been marked as inactive. We
119 # need to reload the confirmation to check this.
120 conf = EmailConfirmation.objects.get(pk = self.conf.pk)
121 self.assertEquals(conf.active, False)
123 class UserLoginRedirectTest(TestCase):
125 def testUserLoginRedirect(self):
127 response = self.client.get(url)
128 self.assertRedirects(response, settings.LOGIN_URL + '?next=' + url)
130 class UserProfileTest(TestCase):
133 self.user = TestUser()
134 self.client.login(username = self.user.username,
135 password = self.user.password)
137 def testUserProfile(self):
138 response = self.client.get('/user/')
139 self.assertContains(response, 'User Profile: %s' % self.user.username)
140 self.assertContains(response, 'User Profile: %s' % self.user.username)
142 def testUserProfileNoBundles(self):
143 response = self.client.get('/user/')
144 self.assertContains(response, 'You have no bundles')
146 def testUserProfileBundles(self):
147 project = defaults.project
150 bundle = Bundle(project = project, name = 'test-1',
151 owner = self.user.user)
154 response = self.client.get('/user/')
156 self.assertContains(response, 'You have the following bundle')
157 self.assertContains(response, bundle.get_absolute_url())
159 class UserPasswordChangeTest(TestCase):
160 form_url = reverse('django.contrib.auth.views.password_change')
161 done_url = reverse('django.contrib.auth.views.password_change_done')
163 def testPasswordChangeForm(self):
164 self.user = TestUser()
165 self.client.login(username = self.user.username,
166 password = self.user.password)
168 response = self.client.get(self.form_url)
169 self.assertContains(response, 'Change my password')
171 def testPasswordChange(self):
172 self.user = TestUser()
173 self.client.login(username = self.user.username,
174 password = self.user.password)
176 old_password = self.user.password
177 new_password = User.objects.make_random_password()
180 'old_password': old_password,
181 'new_password1': new_password,
182 'new_password2': new_password,
185 response = self.client.post(self.form_url, data)
186 self.assertRedirects(response, self.done_url)
188 user = User.objects.get(id = self.user.user.id)
190 self.assertFalse(user.check_password(old_password))
191 self.assertTrue(user.check_password(new_password))
193 response = self.client.get(self.done_url)
194 self.assertContains(response,
195 "Your password has been changed sucessfully")