|
@@ -0,0 +1,306 @@
|
|
|
+from django.contrib.auth import get_user_model
|
|
|
+from django.core.urlresolvers import reverse
|
|
|
+
|
|
|
+from misago.acl.testutils import override_acl
|
|
|
+from misago.admin.testutils import AdminTestCase
|
|
|
+from misago.core import threadstore
|
|
|
+from misago.core.cache import cache
|
|
|
+
|
|
|
+from misago.users.warnings import warn_user
|
|
|
+from misago.users.models import WarningLevel
|
|
|
+
|
|
|
+
|
|
|
+class WarningTestCase(AdminTestCase):
|
|
|
+ def setUp(self):
|
|
|
+ super(WarningTestCase, self).setUp()
|
|
|
+ self.test_user = get_user_model().objects.create_user(
|
|
|
+ "Bob", "bob@bob.com", "Pass.123")
|
|
|
+ self.link_kwargs = {'user_slug': 'bob', 'user_id': self.test_user.pk}
|
|
|
+
|
|
|
+ self.warning_levels = (
|
|
|
+ WarningLevel.objects.create(name='Lvl 1'),
|
|
|
+ WarningLevel.objects.create(name='Lvl 2'),
|
|
|
+ WarningLevel.objects.create(name='Lvl 3'),
|
|
|
+ WarningLevel.objects.create(name='Lvl 4'),
|
|
|
+ )
|
|
|
+
|
|
|
+ cache.clear()
|
|
|
+ threadstore.clear()
|
|
|
+
|
|
|
+ def warn_user(self, reason):
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:warn_user', kwargs=self.link_kwargs),
|
|
|
+ data={'reason': reason})
|
|
|
+
|
|
|
+
|
|
|
+class WarnUserTests(WarningTestCase):
|
|
|
+ def test_no_permission(self):
|
|
|
+ """fail to warn due to permissions"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 0,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ override_acl(self.test_user, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_be_warned': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ response = self.client.get(reverse('misago:warn_user',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+
|
|
|
+ def test_protected_user(self):
|
|
|
+ """fail to warn due to user's can_be_warned"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ override_acl(self.test_user, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_be_warned': 0,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ response = self.client.get(reverse('misago:warn_user',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+
|
|
|
+ def test_warn_user(self):
|
|
|
+ """can warn user to the roof"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ override_acl(self.test_user, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_be_warned': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ for level in self.warning_levels:
|
|
|
+ response = self.client.get(reverse('misago:warn_user',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
+
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:warn_user', kwargs=self.link_kwargs),
|
|
|
+ data={'reason': 'Warning %s' % level.name})
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 4)
|
|
|
+
|
|
|
+
|
|
|
+class UserWarningsListTests(WarningTestCase):
|
|
|
+ def test_no_permission(self):
|
|
|
+ """can't see other user warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 0,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ self.warn_user('Test Warning!')
|
|
|
+ response = self.client.get(reverse('misago:user_warnings',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 404)
|
|
|
+
|
|
|
+ def test_see_user_warnings(self):
|
|
|
+ """can see user warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ override_acl(self.test_user, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_be_warned': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ response = self.client.get(reverse('misago:user_warnings',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
+ self.assertIn('Bob has no warnings', response.content)
|
|
|
+
|
|
|
+ self.warn_user('Test Warning!')
|
|
|
+
|
|
|
+ response = self.client.get(reverse('misago:user_warnings',
|
|
|
+ kwargs=self.link_kwargs))
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
+ self.assertIn('Test Warning!', response.content)
|
|
|
+
|
|
|
+
|
|
|
+class CancelWarningTests(WarningTestCase):
|
|
|
+ def test_no_permission(self):
|
|
|
+ """can't cancel warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_cancel_warnings': 0,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:cancel_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+ self.assertFalse(self.test_user.warnings.get(id=warning.pk).canceled)
|
|
|
+
|
|
|
+ def test_no_permission_other(self):
|
|
|
+ """can't cancel other mod warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_cancel_warnings': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_user, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:cancel_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+ self.assertFalse(self.test_user.warnings.get(id=warning.pk).canceled)
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:cancel_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+
|
|
|
+ warning = self.test_user.warnings.get(id=warning.pk)
|
|
|
+ self.assertTrue(self.test_user.warnings.get(id=warning.pk).canceled)
|
|
|
+
|
|
|
+ def test_cancel_other_and_owned_warnings(self):
|
|
|
+ """cancel everyone's warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_cancel_warnings': 2,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_user, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:cancel_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertTrue(self.test_user.warnings.get(id=warning.pk).canceled)
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:cancel_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertTrue(self.test_user.warnings.get(id=warning.pk).canceled)
|
|
|
+
|
|
|
+
|
|
|
+class DeleteWarningTests(WarningTestCase):
|
|
|
+ def test_no_permission(self):
|
|
|
+ """can't delete warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_delete_warnings': 0,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:delete_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 1)
|
|
|
+
|
|
|
+ def test_no_permission_other(self):
|
|
|
+ """can't delete other mod warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_delete_warnings': 1,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_user, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:delete_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 1)
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:delete_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 1)
|
|
|
+
|
|
|
+ def test_cancel_other_and_owned_warnings(self):
|
|
|
+ """delete everyone's warnings"""
|
|
|
+ override_acl(self.test_admin, {
|
|
|
+ 'misago.users.permissions.warnings': {
|
|
|
+ 'can_warn_users': 1,
|
|
|
+ 'can_see_other_users_warnings': 1,
|
|
|
+ 'can_delete_warnings': 2,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ warning = warn_user(self.test_user, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:delete_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 0)
|
|
|
+
|
|
|
+ warning = warn_user(self.test_admin, self.test_user)
|
|
|
+ response = self.client.post(
|
|
|
+ reverse('misago:delete_warning', kwargs={
|
|
|
+ 'user_slug': 'bob',
|
|
|
+ 'user_id': self.test_user.pk,
|
|
|
+ 'warning_id': warning.pk
|
|
|
+ }))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(self.test_user.warnings.count(), 0)
|