Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1from django.test import TestCase
2from django.test import Client as HttpClient
3from django.contrib.auth.models import User, Permission
4from django.core.management import call_command
5from django.apps import apps
6
7from faker import Factory
8
9from conf.models import Site, SitePermission
10
11
12fake = Factory.create()
13
14
15def init_api_test_data():
16 """
17 Generates fake data, starts an HttpClient session, creates a fake user and
18 logs that user in.
19 """
20 call_command("migrate", verbosity=0)
21 call_command("fake", verbosity=0, iterations=1)
22
23 c = HttpClient()
24
25 fake_user = fake.simple_profile()
26 fake_password = fake.password()
27 user = User.objects.create_user(
28 fake_user["username"], fake_user["mail"], fake_password
29 )
30 site_permission = SitePermission.objects.create(user=user)
31 site_permission.sites.set(Site.objects.filter(id=1))
32 site_permission.save()
33
34 user = User.objects.get(username=fake_user["username"])
35 c.login(username=fake_user["username"], password=fake_password)
36
37 return [c, user]
38
39
40class AppTestCase(TestCase):
41 def test_api_config(self):
42 self.assertEqual(apps.get_app_config("api").name, "api")
43
44
45class ClientBrowseableApiTestCase(TestCase):
46 def setUp(self):
47 self.c, self.user = init_api_test_data()
48
49 def test_clients_get(self):
50 page = self.c.get("/api/clients/")
51 self.assertEqual(page.status_code, 403)
52
53 self.user.user_permissions.add(Permission.objects.get(codename="view_client"))
54
55 page = self.c.get("/api/clients/")
56 self.assertEqual(page.status_code, 200)
57
58 def test_clients_post(self):
59 page = self.c.post("/api/clients/", {"name": fake.company()})
60 self.assertEqual(page.status_code, 403)
61
62 self.user.user_permissions.add(Permission.objects.get(codename="add_client"))
63
64 page = self.c.post("/api/clients/", {"name": fake.company()})
65 self.assertEqual(page.status_code, 201)
66
67 def test_clients_post_unicode(self):
68 self.user.user_permissions.add(Permission.objects.get(codename="add_client"))
69
70 page = self.c.post("/api/clients/", {"name": "Юникод"})
71 self.assertEqual(page.status_code, 201)
72
73
74class ProjectBrowseableApiTestCase(TestCase):
75 def setUp(self):
76 self.c, self.user = init_api_test_data()
77
78 def test_projects_get(self):
79 page = self.c.get("/api/projects/")
80 self.assertEqual(page.status_code, 403)
81
82 self.user.user_permissions.add(Permission.objects.get(codename="view_project"))
83
84 page = self.c.get("/api/projects/")
85 self.assertEqual(page.status_code, 200)
86
87 def test_projects_post(self):
88 self.user.user_permissions.add(Permission.objects.get(codename="view_client"))
89
90 clients_page = self.c.get("/api/clients/")
91 clients = clients_page.json()
92
93 page = self.c.post(
94 "/api/projects/", {"client": clients[0]["url"], "name": fake.job()}
95 )
96
97 self.assertEqual(page.status_code, 403)
98
99 self.user.user_permissions.add(Permission.objects.get(codename="add_project"))
100
101 page = self.c.post(
102 "/api/projects/", {"client": clients[0]["url"], "name": fake.job()}
103 )
104
105 self.assertEqual(page.status_code, 201)
106
107 def test_projects_post_unicode(self):
108 self.user.user_permissions.add(
109 Permission.objects.get(codename="add_project"),
110 Permission.objects.get(codename="view_client"),
111 )
112
113 clients_page = self.c.get("/api/clients/")
114 clients = clients_page.json()
115
116 page = self.c.post(
117 "/api/projects/", {"client": clients[0]["url"], "name": "Юникод"}
118 )
119
120 self.assertEqual(page.status_code, 201)
121
122
123class EntryBrowseableApiTestCase(TestCase):
124 def setUp(self):
125 self.c, self.user = init_api_test_data()
126
127 def test_entries_get(self):
128 page = self.c.get("/api/entries/")
129 self.assertEqual(page.status_code, 403)
130
131 self.user.user_permissions.add(Permission.objects.get(codename="view_entry"))
132
133 page = self.c.get("/api/entries/")
134 self.assertEqual(page.status_code, 200)
135
136 def test_entries_post(self):
137 self.user.user_permissions.add(Permission.objects.get(codename="view_project"))
138
139 projects_page = self.c.get("/api/projects/")
140 projects = projects_page.json()
141 users_page = self.c.get("/api/users/")
142 users = users_page.json()
143
144 page = self.c.post(
145 "/api/entries/",
146 {
147 "project": projects[0]["url"],
148 "user": users[0]["url"],
149 "duration": "1:30:00",
150 },
151 )
152
153 self.assertEqual(page.status_code, 403)
154
155 self.user.user_permissions.add(Permission.objects.get(codename="add_entry"))
156
157 page = self.c.post(
158 "/api/entries/",
159 {
160 "project": projects[0]["url"],
161 "user": users[0]["url"],
162 "duration": "1:30:00",
163 },
164 )
165
166 self.assertEqual(page.status_code, 201)
167
168
169class UserBrowseableApiTestCase(TestCase):
170 def setUp(self):
171 self.c, self.user = init_api_test_data()
172
173 def test_permission_get(self):
174 page = self.c.get("/api/permissions/")
175 self.assertEqual(page.status_code, 200)
176
177
178class PermissionBrowseableApiTestCase(TestCase):
179 def setUp(self):
180 self.c, self.user = init_api_test_data()
181
182 def test_users_get(self):
183 page = self.c.get("/api/users/")
184 self.assertEqual(page.status_code, 200)