home · contact · privacy
Draw Process descendant trees, and guard against recursion within them.
[plomtask] / tests / processes.py
1 """Test Processes module."""
2 from unittest import TestCase
3 from tests.utils import TestCaseWithDB, TestCaseWithServer
4 from plomtask.processes import Process
5 from plomtask.exceptions import NotFoundException, BadFormatException
6
7
8 class TestsSansDB(TestCase):
9     """Module tests not requiring DB setup."""
10
11     def test_Process_versioned_defaults(self) -> None:
12         """Test defaults of Process' VersionedAttributes."""
13         self.assertEqual(Process(None).title.newest, 'UNNAMED')
14         self.assertEqual(Process(None).description.newest, '')
15         self.assertEqual(Process(None).effort.newest, 1.0)
16
17
18 class TestsWithDB(TestCaseWithDB):
19     """Mdule tests not requiring DB setup."""
20
21     def test_Process_save(self) -> None:
22         """Test Process.save()."""
23         p_saved = Process(None)
24         p_saved.save(self.db_conn)
25         self.assertEqual(p_saved.id_,
26                          Process.by_id(self.db_conn, 1, create=False).id_)
27         with self.assertRaises(BadFormatException):
28             p_saved = Process(0)
29         p_saved = Process(5)
30         p_saved.save(self.db_conn)
31         self.assertEqual(p_saved.id_,
32                          Process.by_id(self.db_conn, 5, create=False).id_)
33         p_saved.title.set('named')
34         p_loaded = Process.by_id(self.db_conn, p_saved.id_)
35         self.assertNotEqual(p_saved.title.history, p_loaded.title.history)
36         p_saved.save(self.db_conn)
37         p_loaded = Process.by_id(self.db_conn, p_saved.id_)
38         self.assertEqual(p_saved.title.history, p_loaded.title.history)
39         p_9 = Process(9)
40         p_9.child_ids = [4]
41         with self.assertRaises(NotFoundException):
42             p_9.save(self.db_conn)
43         p_9.child_ids = [5]
44         p_9.save(self.db_conn)
45         p_5 = Process.by_id(self.db_conn, 5)
46         p_5.child_ids = [1]
47         p_5.save(self.db_conn)
48         p_1 = Process.by_id(self.db_conn, 1)
49         p_1.child_ids = [9]
50         with self.assertRaises(BadFormatException):
51             p_1.save(self.db_conn)
52
53     def test_Process_by_id(self) -> None:
54         """Test Process.by_id()."""
55         with self.assertRaises(NotFoundException):
56             Process.by_id(self.db_conn, None, create=False)
57         with self.assertRaises(NotFoundException):
58             Process.by_id(self.db_conn, 0, create=False)
59         with self.assertRaises(NotFoundException):
60             Process.by_id(self.db_conn, 1, create=False)
61         self.assertNotEqual(Process(1).id_,
62                             Process.by_id(self.db_conn, None, create=True).id_)
63         self.assertEqual(Process(1).id_,
64                          Process.by_id(self.db_conn, 1, create=True).id_)
65         self.assertEqual(Process(2).id_,
66                          Process.by_id(self.db_conn, 2, create=True).id_)
67
68     def test_Process_all(self) -> None:
69         """Test Process.all()."""
70         p_1 = Process(None)
71         p_1.save(self.db_conn)
72         p_2 = Process(None)
73         p_2.save(self.db_conn)
74         self.assertEqual({p_1.id_, p_2.id_},
75                          set(p.id_ for p in Process.all(self.db_conn)))
76
77
78 class TestsWithServer(TestCaseWithServer):
79     """Module tests against our HTTP server/handler (and database)."""
80
81     def test_do_POST_process(self) -> None:
82         """Test POST /process and its effect on the database."""
83         form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.1}
84         self.check_post(form_data, '/process?id=', 302, '/')
85         self.check_post(form_data, '/process?id=FOO', 400)
86         form_data['effort'] = 'foo'
87         self.check_post(form_data, '/process?id=', 400)
88         self.check_post({}, '/process?id=', 400)
89         form_data = {'title': '', 'description': ''}
90         self.check_post(form_data, '/process?id=', 400)
91         form_data = {'title': '', 'effort': 1.1}
92         self.check_post(form_data, '/process?id=', 400)
93         form_data = {'description': '', 'effort': 1.0}
94         self.check_post(form_data, '/process?id=', 400)
95         form_data = {'title': '', 'description': '',
96                      'effort': 1.1, 'children': [1]}
97         self.check_post(form_data, '/process?id=', 302, '/')
98         form_data['children'] = 1.1
99         self.check_post(form_data, '/process?id=', 400)
100         form_data['children'] = 'a'
101         self.check_post(form_data, '/process?id=', 400)
102         form_data['children'] = [1.2]
103         self.check_post(form_data, '/process?id=', 400)
104         form_data['children'] = ['b']
105         self.check_post(form_data, '/process?id=', 400)
106         form_data['children'] = [2]
107         self.check_post(form_data, '/process?id=1', 400)
108         retrieved_1 = Process.by_id(self.db_conn, 1)
109         self.assertEqual(retrieved_1.title.newest, 'foo')
110         self.assertEqual(retrieved_1.child_ids, [])
111         retrieved_2 = Process.by_id(self.db_conn, 2)
112         self.assertEqual(retrieved_2.child_ids, [1])
113         form_data = {'title': 'bar', 'description': 'bar', 'effort': 1.1}
114         self.check_post(form_data, '/process?id=1', 302, '/')
115         retrieved_1 = Process.by_id(self.db_conn, 1)
116         self.assertEqual(retrieved_1.title.newest, 'bar')
117         self.assertEqual([p.id_ for p in Process.all(self.db_conn)],
118                          [retrieved_1.id_, retrieved_2.id_])
119
120     def test_do_GET(self) -> None:
121         """Test /process and /processes response codes."""
122         self.check_get('/process', 200)
123         self.check_get('/process?id=', 200)
124         self.check_get('/process?id=0', 400)
125         self.check_get('/process?id=FOO', 400)
126         self.check_get('/processes', 200)