Commit effd4017 authored by Raphaël Hertzog's avatar Raphaël Hertzog
Browse files

Fix UserAuthMixin to behave deterministically

When you had multiple users, the login() method without any username
specified would use a random user. Now it will raise an exception. You
have to specify the username in that situation.

Also update the code in a way that doesn't modify the original
UserAuthMixin.USERS, instead we fully override it every time. However
to avoid too much duplication, we have improved it to attribute default
email and passwords.
parent da9b9c45
...@@ -590,12 +590,13 @@ class DeleteTeamViewTest(UserAuthMixin, TestCase): ...@@ -590,12 +590,13 @@ class DeleteTeamViewTest(UserAuthMixin, TestCase):
""" """
Tests for the :class:`distro_tracker.core.views.DeleteTeamView`. Tests for the :class:`distro_tracker.core.views.DeleteTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
...@@ -647,12 +648,13 @@ class UpdateTeamViewTest(UserAuthMixin, TestCase): ...@@ -647,12 +648,13 @@ class UpdateTeamViewTest(UserAuthMixin, TestCase):
""" """
Tests for the :class:`distro_tracker.core.views.UpdateTeamView`. Tests for the :class:`distro_tracker.core.views.UpdateTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.update_POST_data = { self.update_POST_data = {
...@@ -727,12 +729,13 @@ class AddPackageToTeamViewTest(UserAuthMixin, TestCase): ...@@ -727,12 +729,13 @@ class AddPackageToTeamViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.AddPackageToTeamView`. :class:`distro_tracker.core.views.AddPackageToTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.package = SourcePackageName.objects.create(name='dummy-package') self.package = SourcePackageName.objects.create(name='dummy-package')
...@@ -786,12 +789,13 @@ class RemovePackageFromTeamViewTest(UserAuthMixin, TestCase): ...@@ -786,12 +789,13 @@ class RemovePackageFromTeamViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.RemovePackageFromTeamView`. :class:`distro_tracker.core.views.RemovePackageFromTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.package = SourcePackageName.objects.create(name='dummy-package') self.package = SourcePackageName.objects.create(name='dummy-package')
...@@ -897,19 +901,22 @@ class AddTeamMemberTest(UserAuthMixin, TestCase): ...@@ -897,19 +901,22 @@ class AddTeamMemberTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.AddTeamMember`. :class:`distro_tracker.core.views.AddTeamMember`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.team.add_members( self.team.add_members(
UserEmail.objects.filter(email=self.team.owner.main_email)) UserEmail.objects.filter(email=self.team.owner.main_email))
self.prev_user_email_count = UserEmail.objects.count() self.prev_user_email_count = UserEmail.objects.count()
def post_add_team_member(self, slug='team-name', email='paul@debian.org'): def post_add_team_member(self, email=None, slug='team-name'):
if email is None:
email = self.get_user('paul').main_email
return self.client.post( return self.client.post(
reverse('dtracker-team-add-member', kwargs={'slug': slug}), reverse('dtracker-team-add-member', kwargs={'slug': slug}),
{'email': email} {'email': email}
...@@ -920,12 +927,13 @@ class AddTeamMemberTest(UserAuthMixin, TestCase): ...@@ -920,12 +927,13 @@ class AddTeamMemberTest(UserAuthMixin, TestCase):
Tests adding an existing user as team member logged in as the team Tests adding an existing user as team member logged in as the team
owner owner
""" """
response = self.post_add_team_member() paul_email = self.get_user('paul').main_email
response = self.post_add_team_member(email=paul_email)
self.assertRedirects(response, reverse('dtracker-team-manage', kwargs={ self.assertRedirects(response, reverse('dtracker-team-manage', kwargs={
'slug': self.team.slug 'slug': self.team.slug
})) }))
self.assertIn( self.assertIn(
UserEmail.objects.get(email=self.get_user('paul').main_email), UserEmail.objects.get(email=paul_email),
self.team.members.all() self.team.members.all()
) )
self.assertEqual(MembershipConfirmation.objects.count(), 1) self.assertEqual(MembershipConfirmation.objects.count(), 1)
...@@ -982,20 +990,22 @@ class JoinTeamViewTest(UserAuthMixin, TestCase): ...@@ -982,20 +990,22 @@ class JoinTeamViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.JoinTeamView`. :class:`distro_tracker.core.views.JoinTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = {
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login='paul') self.setup_users(login='paul')
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.get_user('john'), name="Team name", public=True) owner=self.get_user('john'), name="Team name", public=True)
self.team.add_members( self.team.add_members(
UserEmail.objects.filter(email=self.team.owner.main_email)) UserEmail.objects.filter(email=self.team.owner.main_email))
def request_join_team(self, method='post', slug='team-name', def request_join_team(self, email=None, method='post', slug='team-name'):
email='paul@debian.org'):
path = reverse('dtracker-team-join', kwargs={'slug': slug}) path = reverse('dtracker-team-join', kwargs={'slug': slug})
if email is None:
email = self.get_user('paul').main_email
data = {'email': email} data = {'email': email}
if method == 'post': if method == 'post':
return self.client.post(path, data) return self.client.post(path, data)
...@@ -1089,12 +1099,13 @@ class LeaveTeamViewTest(UserAuthMixin, TestCase): ...@@ -1089,12 +1099,13 @@ class LeaveTeamViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.LeaveTeamView`. :class:`distro_tracker.core.views.LeaveTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.team.add_members( self.team.add_members(
...@@ -1170,12 +1181,13 @@ class ManageTeamMembersTest(UserAuthMixin, TestCase): ...@@ -1170,12 +1181,13 @@ class ManageTeamMembersTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.ManageTeamMembers`. :class:`distro_tracker.core.views.ManageTeamMembers`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.team.add_members( self.team.add_members(
...@@ -1222,12 +1234,13 @@ class RemoveTeamMemberTest(UserAuthMixin, TestCase): ...@@ -1222,12 +1234,13 @@ class RemoveTeamMemberTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.RemoveTeamMember`. :class:`distro_tracker.core.views.RemoveTeamMember`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.team.add_members( self.team.add_members(
...@@ -1235,8 +1248,9 @@ class RemoveTeamMemberTest(UserAuthMixin, TestCase): ...@@ -1235,8 +1248,9 @@ class RemoveTeamMemberTest(UserAuthMixin, TestCase):
self.team.add_members( self.team.add_members(
UserEmail.objects.filter(email=self.get_user('paul').main_email)) UserEmail.objects.filter(email=self.get_user('paul').main_email))
def post_remove_team_member(self, slug='team-name', def post_remove_team_member(self, slug='team-name', email=None):
email='paul@debian.org'): if email is None:
email = self.get_user('paul').main_email
return self.client.post( return self.client.post(
reverse('dtracker-team-remove-member', kwargs={'slug': slug}), reverse('dtracker-team-remove-member', kwargs={'slug': slug}),
{'email': email} {'email': email}
...@@ -1391,12 +1405,13 @@ class SetMuteTeamViewTest(UserAuthMixin, TestCase): ...@@ -1391,12 +1405,13 @@ class SetMuteTeamViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.SetMuteTeamView`. :class:`distro_tracker.core.views.SetMuteTeamView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.membership = self.team.add_members( self.membership = self.team.add_members(
...@@ -1494,12 +1509,13 @@ class SetMembershipKeywordsTest(UserAuthMixin, TestCase): ...@@ -1494,12 +1509,13 @@ class SetMembershipKeywordsTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.SetMembershipKeywords`. :class:`distro_tracker.core.views.SetMembershipKeywords`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.membership = self.team.add_members( self.membership = self.team.add_members(
...@@ -1615,12 +1631,13 @@ class EditMembershipViewTest(UserAuthMixin, TestCase): ...@@ -1615,12 +1631,13 @@ class EditMembershipViewTest(UserAuthMixin, TestCase):
Tests for the Tests for the
:class:`distro_tracker.core.views.EditMembershipView`. :class:`distro_tracker.core.views.EditMembershipView`.
""" """
USERS = {
'john': {},
'paul': {},
}
def setUp(self): def setUp(self):
self.USERS['paul'] = { self.setup_users(login='john')
'main_email': 'paul@debian.org',
'password': 'paulpassword'
}
self.setup_users(login=True)
self.team = Team.objects.create_with_slug( self.team = Team.objects.create_with_slug(
owner=self.current_user, name="Team name", public=True) owner=self.current_user, name="Team name", public=True)
self.membership = self.team.add_members( self.membership = self.team.add_members(
......
...@@ -181,24 +181,21 @@ class UserAuthMixin(object): ...@@ -181,24 +181,21 @@ class UserAuthMixin(object):
One may define additional USERS before call self.setup_users() One may define additional USERS before call self.setup_users()
in self.setUp() in self.setUp()
""" """
USERS = { USERS = {
'john': { 'john': {},
'main_email': 'john@example.com',
'password': 'johnpassword',
},
} }
def setup_users(self, login=False): def setup_users(self, login=False):
""" """
Creates users defined in self.USERS and use the 'login' parameter as Creates users defined in self.USERS and use the 'login' parameter as
follows: follows:
* If Flase: no user login * If False: no user login
* If True: login with default user * If True: login with the only user defined
* If a particular username: login with the user who owns the username * If a particular username: login with the user who owns the username
""" """
self.users = {} self.users = {}
for username, user_data in self.USERS.items(): for username in self.USERS:
user_data = self._get_user_data(username)
self.users[username] = User.objects.create_user(**user_data) self.users[username] = User.objects.create_user(**user_data)
if login: if login:
username = None if login is True else login username = None if login is True else login
...@@ -206,14 +203,18 @@ class UserAuthMixin(object): ...@@ -206,14 +203,18 @@ class UserAuthMixin(object):
def login(self, username=None): def login(self, username=None):
""" """
Logins with a the user that owns the 'username' or with the first user Login with the user that owns the 'username' or with the only available
in self.users user in self.users. If multiple users are available, you must specify
the username or you will trigger a ValueError exception.
""" """
if not username: if not username:
if len(self.users) > 1:
raise ValueError("multiple users but username not specified")
username = list(self.users.keys())[0] username = list(self.users.keys())[0]
user_data = self._get_user_data(username)
self.client.login( self.client.login(
username=self.USERS[username]['main_email'], username=user_data['main_email'],
password=self.USERS[username]['password'] password=user_data['password'],
) )
self.current_user = self.users[username] self.current_user = self.users[username]
return self.current_user return self.current_user
...@@ -222,3 +223,9 @@ class UserAuthMixin(object): ...@@ -222,3 +223,9 @@ class UserAuthMixin(object):
if not username: if not username:
return self.current_user return self.current_user
return self.users[username] return self.users[username]
def _get_user_data(self, username):
user_data = self.USERS[username].copy()
user_data.setdefault('main_email', '{}@example.com'.format(username))
user_data.setdefault('password', '{}password'.format(username))
return user_data
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment