Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1from decimal import Decimal
2
3from selenium.common.exceptions import NoSuchElementException
4
5from core.models import Client, Project
6
7from . import SeleniumTestCase
8
9
10class ClientsTestCase(SeleniumTestCase):
11 def test_clients_navigation(self):
12 nav_clients = self.find("nav-clients")
13 nav_clients.click()
14
15 self.find("view-clients")
16
17 def test_clients_visible(self):
18 self.test_clients_navigation()
19
20 clients = Client.objects.all()
21 for client in clients:
22 client_id = "client-%s" % (client.id,)
23 self.find(client_id)
24
25 def test_projects_visible(self):
26 self.test_clients_navigation()
27
28 projects = Project.objects.all()
29 for project in projects:
30 project_id = "project-%s" % (project.id,)
31 self.find(project_id)
32
33 def test_clients_add(self):
34 self.test_clients_navigation()
35
36 client_add = self.find("client-add")
37
38 client_add.click()
39
40 client_modal_name = self.find("client-modal-name")
41 client_modal_submit = self.find("client-modal-submit")
42
43 client_modal_name.send_keys("new client name")
44 client_modal_submit.click()
45
46 view_clients = self.find("view-clients")
47 self.contains("new client name", view_clients)
48
49 client = Client.objects.get(name="new client name")
50 self.assertEqual(client.name, "new client name")
51
52 def test_projects_add(self):
53 self.test_clients_navigation()
54
55 project_add = self.find("project-add")
56
57 project_add.click()
58
59 project_modal_client = self.find("project-modal-client")
60 project_modal_name = self.find("project-modal-name")
61 project_modal_estimate = self.find("project-modal-estimate")
62 project_modal_submit = self.find("project-modal-submit")
63
64 client = Client.objects.first()
65
66 self.select(client.name, project_modal_client)
67 project_modal_name.send_keys("new project name")
68 project_modal_estimate.send_keys("350")
69 project_modal_submit.click()
70
71 view_clients = self.find("view-clients")
72 self.contains("new project name", view_clients)
73 self.contains("0%", view_clients)
74
75 project = Project.objects.get(name="new project name")
76 self.assertEqual(project.name, "new project name")
77 self.assertEqual(project.estimate, Decimal(350))
78
79 def test_clients_delete(self):
80 self.test_clients_navigation()
81
82 client = Client.objects.first()
83 client_id = "client-%s" % (client.id,)
84 client_element = self.find(client_id)
85 client_menu = self.find("client-menu", client_element)
86 client_menu_delete = self.find("client-menu-delete", client_element)
87
88 client_menu.click()
89 client_menu_delete.click()
90
91 self.assertRaises(NoSuchElementException, self.find, client_id)
92 self.assertRaises(
93 Client.DoesNotExist, Client.objects.get, id=client.id
94 ) # noqa: E501
95
96 def test_projects_delete(self):
97 self.test_clients_navigation()
98
99 project = Project.objects.first()
100 project_id = "project-%s" % (project.id,)
101 project_element = self.find(project_id)
102 project_menu = self.find("project-menu", project_element)
103 project_menu_delete = self.find("project-menu-delete", project_element)
104
105 project_menu.click()
106 project_menu_delete.click()
107
108 self.assertRaises(NoSuchElementException, self.find, project_id)
109 self.assertRaises(
110 Project.DoesNotExist, Project.objects.get, id=project.id
111 ) # noqa: E501
112
113 def test_clients_archive(self):
114 self.test_clients_navigation()
115
116 client = Client.objects.first()
117 client_id = "client-%s" % (client.id,)
118 client_element = self.find(client_id)
119 client_menu = self.find("client-menu", client_element)
120 client_menu_archive = self.find("client-menu-archive", client_element)
121
122 client_menu.click()
123 client_menu_archive.click()
124
125 self.assertRaises(NoSuchElementException, self.find, client_id)
126 self.assertEqual(Client.objects.get(id=client.id).archive, True)
127
128 def test_projects_archive(self):
129 self.test_clients_navigation()
130
131 project = Project.objects.first()
132 project_id = "project-%s" % (project.id,)
133 project_element = self.find(project_id)
134 project_menu = self.find("project-menu", project_element)
135 project_menu_archive = self.find(
136 "project-menu-archive", project_element
137 ) # noqa: E501
138
139 project_menu.click()
140 project_menu_archive.click()
141
142 self.assertRaises(NoSuchElementException, self.find, project_id)
143 self.assertEqual(Project.objects.get(id=project.id).archive, True)
144
145 def test_clients_change(self):
146 self.test_clients_navigation()
147
148 client = Client.objects.first()
149 client_id = "client-%s" % (client.id,)
150 client_element = self.find(client_id)
151 client_menu = self.find("client-menu", client_element)
152 client_menu_change = self.find("client-menu-change", client_element)
153
154 client_menu.click()
155 client_menu_change.click()
156
157 client_modal_name = self.find("client-modal-name")
158 client_modal_submit = self.find("client-modal-submit")
159
160 self.assertEqual(client.name, client_modal_name.get_attribute("value"))
161
162 self.clear(client_modal_name)
163 client_modal_name.send_keys("new client name")
164 client_modal_submit.click()
165
166 self.contains("new client name", client_element)
167
168 client = Client.objects.get(id=client.id)
169 self.assertEqual(client.name, "new client name")
170
171 def test_projects_change(self):
172 # TODO: Test changing the projects client
173 self.test_clients_navigation()
174
175 project = Project.objects.first()
176 project_id = "project-%s" % (project.id,)
177 project_element = self.find(project_id)
178 project_menu = self.find("project-menu", project_element)
179 project_menu_change = self.find("project-menu-change", project_element)
180
181 project_menu.click()
182 project_menu_change.click()
183
184 project_modal_name = self.find("project-modal-name")
185 project_modal_estimate = self.find("project-modal-estimate")
186 project_modal_submit = self.find("project-modal-submit")
187
188 self.assertEqual(
189 project.name, project_modal_name.get_attribute("value")
190 ) # noqa: E501
191 self.assertEqual(
192 project.estimate or Decimal(0),
193 Decimal(project_modal_estimate.get_attribute("value") or 0),
194 ) # noqa: E501
195
196 self.clear(project_modal_name)
197 project_modal_name.send_keys("new project name")
198 self.clear(project_modal_estimate)
199 project_modal_estimate.send_keys("350")
200 project_modal_submit.click()
201
202 self.contains("new project name", project_element)
203 # Can't check if the page contains the new estimate since we don't have
204 # that on the front-end, we display a percent. Work around?
205
206 project = Project.objects.get(id=project.id)
207 self.assertEqual(project.name, "new project name")
208 self.assertEqual(project.estimate, Decimal(350))