def test_rejecting_sends_email(self): # when curator rejects someone, they are sent an email curator = UserFactory() self.group.curators.add(curator.userprofile) user = UserFactory() self.group.add_member(user.userprofile, GroupMembership.PENDING) # no email when someone makes request eq_(0, len(mail.outbox)) # Using French for curator page to make sure that doesn't affect the language # that is used to email the member. url = reverse( 'groups:remove_member', args=[self.group.url, user.userprofile.pk], prefix='/fr/', ) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) # email sent for curated group ok_(mock_email.delay.called) group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[ 0] eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(GroupMembership.PENDING, old_status) ok_(new_status is None)
def test_remove_from_nda_group(self, unsubscribe_mock): """Test to remove a member from a closed group.""" self.group.accepting_new_members = Group.CLOSED self.group.url = 'nda' self.group.name = 'nda' self.group.save() curator = UserFactory() user = UserFactory() self.group.add_member(user.userprofile) self.group.curators.add(curator.userprofile) url = reverse( 'groups:remove_member', args=[ self.group.url, user.userprofile.pk, GroupMembership.PENDING ], prefix='/fr/', ) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) membership = GroupMembership.objects.get(group=self.group, userprofile=user.userprofile) group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[ 0] ok_(mock_email.delay.called) eq_(membership.status, GroupMembership.PENDING) eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(old_status, GroupMembership.MEMBER) eq_(new_status, GroupMembership.PENDING) ok_(unsubscribe_mock.delay.called)
def test_remove_member_send_mail(self): # when curator remove someone, sent mail to member curator = UserFactory() self.group.curators.add(curator.userprofile) user = UserFactory() self.group.add_member(user.userprofile) url = reverse( 'groups:remove_member', args=[self.group.url, user.userprofile.pk], prefix='/fr/', ) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) # email sent for curated group group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[ 0] ok_(mock_email.delay.called) eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(old_status, GroupMembership.MEMBER) eq_(new_status, None)
def test_member_counts(self): # The Group admin computes how many vouched members there are # and how many overall # IMPORTANT: This test is expected to fail on Postgres, and # probably other databases where the Boolean type is not just # an alias for a small integer. Mozillians is currently # deployed on a database where this works. If we ever try # deploying it on another database where it doesn't work, this # test will alert us quickly that we'll need to take another # approach to this feature. # Create group with 1 vouched member and 1 unvouched member group = GroupFactory() user = UserFactory(userprofile={'is_vouched': False}) group.members.add(user.userprofile) user2 = UserFactory(userprofile={'is_vouched': True}) group.members.add(user2.userprofile) admin = GroupAdmin(model=Group, admin_site=site) mock_request = Mock(spec=HttpRequest) qset = admin.queryset(mock_request) g = qset.get(name=group.name) eq_(2, g.member_count) eq_(1, g.vouched_member_count)
def setUp(self): self.group = GroupFactory() self.member = UserFactory(userprofile={'is_vouched': True}) self.group.add_member(self.member.userprofile) self.url = reverse('groups:remove_member', prefix='/en-US/', kwargs={'group_pk': self.group.pk, 'user_pk': self.member.userprofile.pk})
def test_as_manager_from_unleavable_group(self): # manager can remove people even from unleavable groups user = UserFactory(manager=True) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member.userprofile))
def test_as_manager(self): # manager can remove another from a group they're not curator of user = UserFactory(manager=True) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member.userprofile))
def setUp(self): self.group = GroupFactory() self.member = UserFactory() self.group.add_member(self.member.userprofile) self.url = reverse('groups:remove_member', prefix='/en-US/', kwargs={'url': self.group.url, 'user_pk': self.member.userprofile.pk})
def test_as_superuser(self): # superuser can remove another from a group they're not curator of user = UserFactory(is_superuser=True, userprofile={'is_vouched': True}) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member))
def test_as_superuser_from_unleavable_group(self): # superuser can remove people even from unleavable groups user = UserFactory(is_superuser=True, userprofile={'is_vouched': True}) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member))
def test_as_curator(self): # curator can remove another curator = UserFactory() self.group.curators.add(curator.userprofile) with self.login(curator) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member.userprofile))
def test_as_manager_removing_curator(self): # but even manager cannot remove a curator user = UserFactory(manager=True) self.group.curators.add(self.member.userprofile) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(self.group.has_member(self.member.userprofile))
def test_as_curator_twice(self): # removing a second time doesn't blow up curator = UserFactory(userprofile={'is_vouched': True}) self.group.curator = curator.userprofile self.group.save() with self.login(curator) as client: client.post(self.url, follow=False) client.post(self.url, follow=False)
def test_as_superuser_removing_curator(self): # but even superuser cannot remove a curator user = UserFactory(is_superuser=True, userprofile={'is_vouched': True}) self.group.curator = self.member.userprofile self.group.save() with self.login(user) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(self.group.has_member(self.member))
def test_as_curator(self): # curator can remove another curator = UserFactory(userprofile={'is_vouched': True}) self.group.curator = curator.userprofile self.group.save() with self.login(curator) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member))
def test_as_curator_from_unleavable(self): # curator can remove another even from an unleavable group self.group.members_can_leave = False self.group.save() curator = UserFactory() self.group.curators.add(curator.userprofile) with self.login(curator) as client: response = client.post(self.url, follow=False) eq_(302, response.status_code) ok_(not self.group.has_member(self.member.userprofile))
def test_remove_member_send_mail(self): # when curator remove someone, sent mail to member curator = UserFactory() self.group.curator = curator.userprofile self.group.save() user = UserFactory() self.group.add_member(user.userprofile) url = reverse( 'groups:remove_member', args=[self.group.url, user.userprofile.pk], prefix='/fr/', ) with patch('mozillians.groups.models.member_removed_email', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) # email sent for curated group ok_(mock_email.delay.called) group_pk, user_pk = mock_email.delay.call_args[0] eq_(self.group.pk, group_pk) eq_(user.pk, user_pk)
def test_as_simple_user_removing_another(self): # user cannot remove anyone else user = UserFactory(userprofile={'is_vouched': True}) with self.login(user) as client: response = client.post(self.url, follow=False) eq_(404, response.status_code)
def test_vouched_access_scope(self): request = self.factory.get('/') request.user = UserFactory(vouched=True) eq_(UserAccessLevel.get_privacy(request), 'vouched')
def test_private_access_scope_superuser(self): request = self.factory.get('/') request.user = UserFactory(is_superuser=True) user = request.user eq_(UserAccessLevel.get_privacy(request, user), 'private')
def test_authenticated_access_scope(self): request = self.factory.get('/') request.user = UserFactory(vouched=False) eq_(UserAccessLevel.get_privacy(request), 'authenticated')