Free and open source ticket system written in python
at main 128 lines 6.1 kB view raw
1from django.test import TestCase 2from django.contrib.auth.models import Group 3from django.urls import reverse 4from .utils.initial_data import populate_groups 5from .utils.general import sanitize_username 6from .models import PawUser 7from django.conf import settings 8 9 10class PopulateGroupTestCase(TestCase): 11 def setUp(self): 12 populate_groups(None, None) 13 14 def test_groups_created(self): 15 self.assertEqual(Group.objects.filter(name__in=["Client", "Supporter"]).count(), 2) 16 # Run again and confirm no duplicates 17 populate_groups(None, None) 18 self.assertEqual(Group.objects.filter(name__in=["Client", "Supporter"]).count(), 2) 19 20class UsernameSanitizationTestCase(TestCase): 21 def test_allows_safe_chars(self): 22 self.assertEqual(sanitize_username("Alice-01_@corp"), "Alice-01_@corp") 23 24 def test_strips_spaces_and_symbols(self): 25 self.assertEqual(sanitize_username(" alice.smith "), "alicesmith") 26 self.assertEqual(sanitize_username("a/b\\c"), "abc") 27 self.assertEqual(sanitize_username("a%b^c&d*e"), "abcde") 28 29 def test_empty_and_only_illegal(self): 30 self.assertEqual(sanitize_username(""), "") 31 self.assertEqual(sanitize_username("!#$()., +="), "") 32 33 def test_unicode_behavior(self): 34 # Decide policy: currently regex drops non ASCII letters. 35 self.assertEqual(sanitize_username("álïçé"), "l") 36 37class LoginViewTestCase(TestCase): 38 def setUp(self): 39 self.username = "testuser" 40 self.password = "testpassword" 41 self.user = PawUser.objects.create_user(username=self.username, password=self.password) 42 43 def test_login_view(self): 44 url = reverse("login") 45 response = self.client.post(url, {"username": self.username, "password": self.password}) 46 self.assertEqual(response.status_code, 302) 47 self.assertEqual(response.url, reverse("home")) 48 49 def test_login_view_invalid(self): 50 url = reverse("login") 51 response = self.client.post(url, {"username": self.username, "password": "invalid"}) 52 self.assertEqual(response.status_code, 200) 53 self.assertContains(response, "Please enter a correct username and password") 54 55 def test_user_language(self): 56 url = reverse("home") 57 self.client.force_login(self.user) 58 response = self.client.get(url) 59 self.assertEqual(response.status_code, 302) 60 self.client.cookies.load(response.cookies) 61 self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, self.user.language) 62 self.assertEqual(response.url, reverse("all_tickets")) 63 64 def test_login_sets_session(self): 65 resp = self.client.post(reverse("login"), {"username": self.username, "password": self.password}) 66 self.assertEqual(resp.status_code, 302) 67 # Access a protected view to ensure session auth holds 68 resp2 = self.client.get(reverse("home")) 69 self.assertIn("_auth_user_id", self.client.session) 70 71class RegisterViewTestCase(TestCase): 72 73 def test_register_view(self): 74 url = reverse("register") 75 response = self.client.post(url, {"username": "test", "email": "test@example.com", "password": "testtesttesttest", "password_confirm": "testtesttesttest"}) 76 self.assertEqual(response.status_code, 302) 77 self.assertEqual(response.url, reverse("login")) 78 self.assertEqual(PawUser.objects.count(), 1) 79 user = PawUser.objects.first() 80 self.assertEqual(user.username, "test") 81 self.assertEqual(user.email, "test@example.com") 82 self.assertTrue(user.check_password("testtesttesttest")) 83 self.assertEqual(user.groups.count(), 0) # No group assigned, might want to give Client group by default 84 85 def test_register_view_password_too_short(self): 86 url = reverse("register") 87 response = self.client.post(url, {"username": "test", "email": "test@example.com", "password": "123456789", "password_confirm": "123456789"}) 88 self.assertEqual(response.status_code, 200) 89 self.assertContains(response, "Password must be at least 10 characters long.") 90 91 def test_register_view_password_mismatch(self): 92 url = reverse("register") 93 response = self.client.post(url, {"username": "test", "email": "test@example.com", "password": "1234567890", "password_confirm": "123456789"}) 94 self.assertEqual(response.status_code, 200) 95 self.assertContains(response, "Password and Confirm Password do not match.") 96 97class SettingsViewTestCase(TestCase): 98 99 def test_settings_view(self): 100 url = reverse("settings") 101 response = self.client.get(url) 102 self.assertEqual(response.status_code, 302) 103 self.assertEqual(response.url, "%s?next=%s" % (reverse("login"), reverse("settings"))) 104 105 user = PawUser.objects.create_user(username="test", password="testtesttesttest", email="test@example.com") 106 self.client.force_login(user) 107 response = self.client.get(url) 108 self.assertEqual(response.status_code, 200) 109 self.assertContains(response, "Settings") 110 111 response = self.client.post(url, {"language": "fr", "email": "test@example.com"}) 112 self.assertEqual(response.status_code, 200) 113 user.refresh_from_db() 114 self.assertEqual(user.language, "fr") 115 self.client.cookies.load(response.cookies) 116 self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "fr") 117 118 response = self.client.post(url, {"language": "invalid", "email": "test@example.com"}) 119 self.assertEqual(response.status_code, 200) 120 self.client.cookies.load(response.cookies) 121 self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "fr") 122 123 response = self.client.post(url, {"language": "en", "email": "test@example.com"}) 124 self.assertEqual(response.status_code, 200) 125 user.refresh_from_db() 126 self.assertEqual(user.language, "en") 127 self.client.cookies.load(response.cookies) 128 self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "en")