Use django-webtest for hanging tests instead of TestCase

This commit is contained in:
Basraah 2017-10-02 00:06:06 +10:00
parent 01d34b54eb
commit d7cb1a2fab
2 changed files with 23 additions and 44 deletions

View File

@ -1,13 +1,11 @@
from unittest import mock from django_webtest import WebTest
from django.test import TestCase
from django import urls from django import urls
from django.contrib.auth.models import Group, Permission from django.contrib.auth.models import Group, Permission
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
class PermissionsToolViewsTestCase(TestCase): class PermissionsToolViewsTestCase(WebTest):
def setUp(self): def setUp(self):
self.member = AuthUtils.create_member('auth_member') self.member = AuthUtils.create_member('auth_member')
self.member.email = 'auth_member@example.com' self.member.email = 'auth_member@example.com'
@ -36,8 +34,8 @@ class PermissionsToolViewsTestCase(TestCase):
AuthUtils.connect_signals() AuthUtils.connect_signals()
def test_menu_item(self): def test_menu_item(self):
self.client.force_login(self.member) self.app.set_user(self.member)
response = self.client.get(urls.reverse('permissions_tool:overview')) response = self.app.get(urls.reverse('permissions_tool:overview'))
response_content = response.content.decode('utf-8') response_content = response.content.decode('utf-8')
@ -45,9 +43,9 @@ class PermissionsToolViewsTestCase(TestCase):
'<i class="fa fa-key fa-id-card"></i> Permissions Audit</a></li>', response_content) '<i class="fa fa-key fa-id-card"></i> Permissions Audit</a></li>', response_content)
def test_permissions_overview(self): def test_permissions_overview(self):
self.client.force_login(self.member) self.app.set_user(self.member)
response = self.client.get(urls.reverse('permissions_tool:overview')) response = self.app.get(urls.reverse('permissions_tool:overview'))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTemplateUsed('permissions_tool/overview.html') self.assertTemplateUsed('permissions_tool/overview.html')
@ -71,9 +69,9 @@ class PermissionsToolViewsTestCase(TestCase):
def test_permissions_overview_perms(self): def test_permissions_overview_perms(self):
# Ensure permission effectively denys access # Ensure permission effectively denys access
self.client.force_login(self.no_perm_user) self.app.set_user(self.no_perm_user)
response = self.client.get(urls.reverse('permissions_tool:overview')) response = self.app.get(urls.reverse('permissions_tool:overview'))
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
@ -99,9 +97,9 @@ class PermissionsToolViewsTestCase(TestCase):
def test_permissions_audit_perms(self): def test_permissions_audit_perms(self):
# Ensure permission effectively denys access # Ensure permission effectively denys access
self.client.force_login(self.no_perm_user) self.app.set_user(self.no_perm_user)
response = self.client.get(urls.reverse('permissions_tool:audit', response = self.app.get(urls.reverse('permissions_tool:audit',
kwargs={ kwargs={
'app_label': self.permission.content_type.app_label, 'app_label': self.permission.content_type.app_label,
'model': self.permission.content_type.model, 'model': self.permission.content_type.model,

View File

@ -1,3 +1,8 @@
import json
import urllib
import datetime
import requests_mock
from django_webtest import WebTest
from unittest import mock from unittest import mock
from django.test import TestCase, RequestFactory from django.test import TestCase, RequestFactory
@ -10,9 +15,8 @@ from .auth_hooks import DiscordService
from .models import DiscordUser from .models import DiscordUser
from .tasks import DiscordTasks from .tasks import DiscordTasks
from .manager import DiscordOAuthManager from .manager import DiscordOAuthManager
from . import manager
import requests_mock
import datetime
MODULE_PATH = 'allianceauth.services.modules.discord' MODULE_PATH = 'allianceauth.services.modules.discord'
DEFAULT_AUTH_GROUP = 'Member' DEFAULT_AUTH_GROUP = 'Member'
@ -138,26 +142,26 @@ class DiscordHooksTestCase(TestCase):
# TODO: Test update nicknames # TODO: Test update nicknames
class DiscordViewsTestCase(TestCase): class DiscordViewsTestCase(WebTest):
def setUp(self): def setUp(self):
self.member = AuthUtils.create_member('auth_member') self.member = AuthUtils.create_member('auth_member')
add_permissions() add_permissions()
def login(self): def login(self):
self.client.force_login(self.member) self.app.set_user(self.member)
@mock.patch(MODULE_PATH + '.views.DiscordOAuthManager') @mock.patch(MODULE_PATH + '.views.DiscordOAuthManager')
def test_activate(self, manager): def test_activate(self, manager):
self.login() self.login()
manager.generate_oauth_redirect_url.return_value = '/example.com/oauth/' manager.generate_oauth_redirect_url.return_value = '/example.com/oauth/'
response = self.client.get('/discord/activate/', follow=False) response = self.app.get('/discord/activate/', auto_follow=False)
self.assertRedirects(response, expected_url='/example.com/oauth/', target_status_code=404) self.assertRedirects(response, expected_url='/example.com/oauth/', target_status_code=404)
@mock.patch(MODULE_PATH + '.tasks.DiscordOAuthManager') @mock.patch(MODULE_PATH + '.tasks.DiscordOAuthManager')
def test_callback(self, manager): def test_callback(self, manager):
self.login() self.login()
manager.add_user.return_value = '1234' manager.add_user.return_value = '1234'
response = self.client.get('/discord/callback/', data={'code': '1234'}) response = self.app.get('/discord/callback/', params={'code': '1234'})
self.member = User.objects.get(pk=self.member.pk) self.member = User.objects.get(pk=self.member.pk)
@ -172,7 +176,7 @@ class DiscordViewsTestCase(TestCase):
DiscordUser.objects.create(user=self.member, uid='12345') DiscordUser.objects.create(user=self.member, uid='12345')
manager.delete_user.return_value = True manager.delete_user.return_value = True
response = self.client.get('/discord/reset/') response = self.app.get('/discord/reset/')
self.assertRedirects(response, expected_url='/discord/activate/', target_status_code=302) self.assertRedirects(response, expected_url='/discord/activate/', target_status_code=302)
@ -182,7 +186,7 @@ class DiscordViewsTestCase(TestCase):
DiscordUser.objects.create(user=self.member, uid='12345') DiscordUser.objects.create(user=self.member, uid='12345')
manager.delete_user.return_value = True manager.delete_user.return_value = True
response = self.client.get('/discord/deactivate/') response = self.app.get('/discord/deactivate/')
self.assertTrue(manager.delete_user.called) self.assertTrue(manager.delete_user.called)
self.assertRedirects(response, expected_url='/services/', target_status_code=200) self.assertRedirects(response, expected_url='/services/', target_status_code=200)
@ -201,7 +205,6 @@ class DiscordManagerTestCase(TestCase):
self.assertEqual(group_name, 'GroupName_Test') self.assertEqual(group_name, 'GroupName_Test')
def test_generate_Bot_add_url(self): def test_generate_Bot_add_url(self):
from . import manager
bot_add_url = DiscordOAuthManager.generate_bot_add_url() bot_add_url = DiscordOAuthManager.generate_bot_add_url()
auth_url = manager.AUTH_URL auth_url = manager.AUTH_URL
@ -209,23 +212,15 @@ class DiscordManagerTestCase(TestCase):
self.assertEqual(bot_add_url, real_bot_add_url) self.assertEqual(bot_add_url, real_bot_add_url)
def test_generate_oauth_redirect_url(self): def test_generate_oauth_redirect_url(self):
from . import manager
import urllib
import sys
oauth_url = DiscordOAuthManager.generate_oauth_redirect_url() oauth_url = DiscordOAuthManager.generate_oauth_redirect_url()
self.assertIn(manager.AUTH_URL, oauth_url) self.assertIn(manager.AUTH_URL, oauth_url)
self.assertIn('+'.join(manager.SCOPES), oauth_url) self.assertIn('+'.join(manager.SCOPES), oauth_url)
self.assertIn(settings.DISCORD_APP_ID, oauth_url) self.assertIn(settings.DISCORD_APP_ID, oauth_url)
if sys.version_info[0] < 3: self.assertIn(urllib.parse.quote_plus(settings.DISCORD_CALLBACK_URL), oauth_url)
# Py2
self.assertIn(urllib.quote_plus(settings.DISCORD_CALLBACK_URL), oauth_url)
else: # Py3
self.assertIn(urllib.parse.quote_plus(settings.DISCORD_CALLBACK_URL), oauth_url)
@mock.patch(MODULE_PATH + '.manager.OAuth2Session') @mock.patch(MODULE_PATH + '.manager.OAuth2Session')
def test__process_callback_code(self, oauth): def test__process_callback_code(self, oauth):
from . import manager
instance = oauth.return_value instance = oauth.return_value
instance.fetch_token.return_value = {'access_token': 'mywonderfultoken'} instance.fetch_token.return_value = {'access_token': 'mywonderfultoken'}
@ -245,9 +240,6 @@ class DiscordManagerTestCase(TestCase):
@mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._process_callback_code') @mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._process_callback_code')
@requests_mock.Mocker() @requests_mock.Mocker()
def test_add_user(self, oauth_token, m): def test_add_user(self, oauth_token, m):
from . import manager
import json
# Arrange # Arrange
oauth_token.return_value = {'access_token': 'accesstoken'} oauth_token.return_value = {'access_token': 'accesstoken'}
@ -272,9 +264,6 @@ class DiscordManagerTestCase(TestCase):
@requests_mock.Mocker() @requests_mock.Mocker()
def test_delete_user(self, m): def test_delete_user(self, m):
from . import manager
import json
# Arrange # Arrange
headers = {'accept': 'application/json', 'authorization': 'Bot ' + settings.DISCORD_BOT_TOKEN} headers = {'accept': 'application/json', 'authorization': 'Bot ' + settings.DISCORD_BOT_TOKEN}
@ -321,7 +310,6 @@ class DiscordManagerTestCase(TestCase):
@requests_mock.Mocker() @requests_mock.Mocker()
def test_update_nickname(self, m): def test_update_nickname(self, m):
from . import manager
# Arrange # Arrange
headers = {'content-type': 'application/json', 'authorization': 'Bot ' + settings.DISCORD_BOT_TOKEN} headers = {'content-type': 'application/json', 'authorization': 'Bot ' + settings.DISCORD_BOT_TOKEN}
@ -339,9 +327,6 @@ class DiscordManagerTestCase(TestCase):
@mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups') @mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups')
@requests_mock.Mocker() @requests_mock.Mocker()
def test_update_groups(self, group_cache, m): def test_update_groups(self, group_cache, m):
from . import manager
import json
# Arrange # Arrange
groups = ['Member', 'Blue', 'Special Group'] groups = ['Member', 'Blue', 'Special Group']
@ -373,8 +358,6 @@ class DiscordManagerTestCase(TestCase):
@mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups') @mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups')
@requests_mock.Mocker() @requests_mock.Mocker()
def test_update_groups_backoff(self, group_cache, djcache, m): def test_update_groups_backoff(self, group_cache, djcache, m):
from . import manager
# Arrange # Arrange
groups = ['Member'] groups = ['Member']
group_cache.return_value = [{'id': 111, 'name': 'Member'}] group_cache.return_value = [{'id': 111, 'name': 'Member'}]
@ -408,8 +391,6 @@ class DiscordManagerTestCase(TestCase):
@mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups') @mock.patch(MODULE_PATH + '.manager.DiscordOAuthManager._get_groups')
@requests_mock.Mocker() @requests_mock.Mocker()
def test_update_groups_global_backoff(self, group_cache, djcache, m): def test_update_groups_global_backoff(self, group_cache, djcache, m):
from . import manager
# Arrange # Arrange
groups = ['Member'] groups = ['Member']
group_cache.return_value = [{'id': 111, 'name': 'Member'}] group_cache.return_value = [{'id': 111, 'name': 'Member'}]