From 4b3e9bc87e4bb362c63139a3778b93bc9ce86c0b Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 23 Oct 2018 23:42:00 +0000 Subject: [PATCH] Adds unit tests for views. --- evennia/web/website/tests.py | 167 +++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 evennia/web/website/tests.py diff --git a/evennia/web/website/tests.py b/evennia/web/website/tests.py new file mode 100644 index 0000000000..26a81c0ea6 --- /dev/null +++ b/evennia/web/website/tests.py @@ -0,0 +1,167 @@ +from django.conf import settings +from django.utils.text import slugify +from django.test import Client +from django.urls import reverse +from evennia.utils.test_resources import EvenniaTest + +class EvenniaWebTest(EvenniaTest): + + # Use the same classes the views are expecting + account_typeclass = settings.BASE_ACCOUNT_TYPECLASS + object_typeclass = settings.BASE_OBJECT_TYPECLASS + character_typeclass = settings.BASE_CHARACTER_TYPECLASS + exit_typeclass = settings.BASE_EXIT_TYPECLASS + room_typeclass = settings.BASE_ROOM_TYPECLASS + script_typeclass = settings.BASE_SCRIPT_TYPECLASS + + # Default named url + url_name = 'index' + + # Response to expect for unauthenticated requests + unauthenticated_response = 200 + + # Response to expect for authenticated requests + authenticated_response = 200 + + def setUp(self): + super(EvenniaWebTest, self).setUp() + + # Add chars to account rosters + self.account.db._playable_characters = [self.char1] + self.account2.db._playable_characters = [self.char2] + + for account in (self.account, self.account2): + # Demote accounts to Player permissions + account.permissions.add('Player') + account.permissions.remove('Developer') + + # Grant permissions to chars + for char in account.db._playable_characters: + char.locks.add('edit:id(%s) or perm(Admin)' % account.pk) + char.locks.add('delete:id(%s) or perm(Admin)' % account.pk) + char.locks.add('view:all()') + + def test_valid_chars(self): + "Make sure account has playable characters" + self.assertTrue(self.char1 in self.account.db._playable_characters) + self.assertTrue(self.char2 in self.account2.db._playable_characters) + + def get_kwargs(self): + return {} + + def test_get(self): + # Try accessing page while not logged in + response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs())) + self.assertEqual(response.status_code, self.unauthenticated_response) + + def login(self): + return self.client.login(username='TestAccount', password='testpassword') + + def test_get_authenticated(self): + logged_in = self.login() + self.assertTrue(logged_in, 'Account failed to log in!') + + # Try accessing page while logged in + response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True) + + self.assertEqual(response.status_code, self.authenticated_response) + + +# ------------------------------------------------------------------------------ + +class AdminTest(EvenniaWebTest): + url_name = 'django_admin' + unauthenticated_response = 302 + +class IndexTest(EvenniaWebTest): + url_name = 'index' + +class RegisterTest(EvenniaWebTest): + url_name = 'register' + unauthenticated_response = 302 + +class LoginTest(EvenniaWebTest): + url_name = 'login' + +class LogoutTest(EvenniaWebTest): + url_name = 'logout' + +class PasswordResetTest(EvenniaWebTest): + url_name = 'password_change' + unauthenticated_response = 302 + +class WebclientTest(EvenniaWebTest): + url_name = 'webclient:index' + +class CharacterCreateView(EvenniaWebTest): + url_name = 'character-create' + unauthenticated_response = 302 + +class CharacterManageView(EvenniaWebTest): + url_name = 'character-manage' + unauthenticated_response = 302 + +class CharacterUpdateView(EvenniaWebTest): + url_name = 'character-update' + unauthenticated_response = 302 + + def get_kwargs(self): + return { + 'pk': self.char1.pk, + 'slug': slugify(self.char1.name) + } + + def test_valid_access(self): + "Account1 should be able to update Account1:Char1" + # Login account + self.login() + + # Try to access update page for char1 + response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True) + self.assertEqual(response.status_code, 200) + + def test_invalid_access(self): + "Account1 should not be able to update Account2:Char2" + # Login account + self.login() + + # Try to access update page for char2 + kwargs = { + 'pk': self.char2.pk, + 'slug': slugify(self.char2.name) + } + response = self.client.get(reverse(self.url_name, kwargs=kwargs), follow=True) + self.assertEqual(response.status_code, 403) + +class CharacterDeleteView(EvenniaWebTest): + url_name = 'character-delete' + unauthenticated_response = 302 + + def get_kwargs(self): + return { + 'pk': self.char1.pk, + 'slug': slugify(self.char1.name) + } + + def test_valid_access(self): + "Account1 should be able to delete Account1:Char1" + # Login account + self.login() + + # Try to access delete page for char1 + response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True) + self.assertEqual(response.status_code, 200) + + def test_invalid_access(self): + "Account1 should not be able to delete Account2:Char2" + # Login account + self.login() + + # Try to access delete page for char2 + kwargs = { + 'pk': self.char2.pk, + 'slug': slugify(self.char2.name) + } + response = self.client.get(reverse(self.url_name, kwargs=kwargs), follow=True) + self.assertEqual(response.status_code, 403) + \ No newline at end of file