Free and open source ticket system written in python
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")