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
8 class TestsSansDB(TestCase):
9 """Module tests not requiring DB setup."""
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)
18 class TestsWithDB(TestCaseWithDB):
19 """Mdule tests not requiring DB setup."""
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):
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)
41 with self.assertRaises(NotFoundException):
42 p_9.save(self.db_conn)
44 p_9.save(self.db_conn)
45 p_5 = Process.by_id(self.db_conn, 5)
47 p_5.save(self.db_conn)
48 p_1 = Process.by_id(self.db_conn, 1)
50 with self.assertRaises(BadFormatException):
51 p_1.save(self.db_conn)
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_)
68 def test_Process_all(self) -> None:
69 """Test Process.all()."""
71 p_1.save(self.db_conn)
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)))
78 class TestsWithServer(TestCaseWithServer):
79 """Module tests against our HTTP server/handler (and database)."""
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_])
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)