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 Task
6
7from . import SeleniumTestCase
8
9
10class TasksTestCase(SeleniumTestCase):
11 def test_tasks_navigation(self):
12 nav_tasks = self.find("nav-tasks")
13 nav_tasks.click()
14
15 self.find("view-tasks")
16
17 def test_tasks_visible(self):
18 self.test_tasks_navigation()
19
20 tasks = Task.objects.all()
21 for task in tasks:
22 task_id = "task-%s" % (task.id,)
23 self.find(task_id)
24
25 def test_tasks_add(self):
26 self.test_tasks_navigation()
27
28 task_add = self.find("task-add")
29
30 task_add.click()
31
32 task_name_new = self.find("task-name-new")
33 task_hourly_rate_new = self.find("task-hourly-rate-new")
34 task_submit_new = self.find("task-submit-new")
35
36 task_name_new.send_keys("new task name")
37 task_hourly_rate_new.send_keys("3.50")
38 task_submit_new.click()
39
40 view_tasks = self.find("view-tasks")
41 self.contains("new task name", view_tasks)
42 self.contains("3.50", view_tasks)
43
44 task = Task.objects.get(name="new task name")
45 self.assertEqual(task.name, "new task name")
46 self.assertEqual(task.hourly_rate, Decimal(3.50))
47
48 def test_tasks_delete(self):
49 self.test_tasks_navigation()
50
51 task = Task.objects.first()
52 task_id = "task-%s" % (task.id,)
53 task_element = self.find(task_id)
54 task_menu = self.find("task-menu", task_element)
55 task_menu_delete = self.find("task-menu-delete", task_element)
56
57 task_menu.click()
58 task_menu_delete.click()
59
60 self.assertRaises(NoSuchElementException, self.find, task_id)
61 self.assertRaises(Task.DoesNotExist, Task.objects.get, id=task.id)
62
63 def test_tasks_change(self):
64 self.test_tasks_navigation()
65
66 task = Task.objects.first()
67 task_id = "task-%s" % (task.id,)
68 task_element = self.find(task_id)
69 task_menu = self.find("task-menu", task_element)
70 task_menu_change = self.find("task-menu-change", task_element)
71
72 task_menu.click()
73 task_menu_change.click()
74
75 task_name_edit = self.find("task-name-edit")
76 task_hourly_rate_edit = self.find("task-hourly-rate-edit")
77 task_submit_edit = self.find("task-submit-edit")
78
79 self.assertEqual(task.name, task_name_edit.get_attribute("value"))
80 self.assertEqual(
81 task.hourly_rate, Decimal(task_hourly_rate_edit.get_attribute("value"))
82 ) # noqa: E501
83
84 self.clear(task_name_edit)
85 task_name_edit.send_keys("new task name")
86 self.clear(task_hourly_rate_edit)
87 task_hourly_rate_edit.send_keys("3.50")
88 task_submit_edit.click()
89
90 self.contains("new task name", task_element)
91 self.contains("3.50", task_element)
92
93 task = Task.objects.get(id=task.id)
94 self.assertEqual(task.name, "new task name")
95 self.assertEqual(task.hourly_rate, Decimal(3.50))