home · contact · privacy
Extend POST tests, and handling of missing form data.
[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
40     def test_Process_by_id(self) -> None:
41         """Test Process.by_id()."""
42         with self.assertRaises(NotFoundException):
43             Process.by_id(self.db_conn, None, create=False)
44         with self.assertRaises(NotFoundException):
45             Process.by_id(self.db_conn, 0, create=False)
46         with self.assertRaises(NotFoundException):
47             Process.by_id(self.db_conn, 1, create=False)
48         self.assertNotEqual(Process(1).id_,
49                             Process.by_id(self.db_conn, None, create=True).id_)
50         self.assertEqual(Process(1).id_,
51                          Process.by_id(self.db_conn, 1, create=True).id_)
52         self.assertEqual(Process(2).id_,
53                          Process.by_id(self.db_conn, 2, create=True).id_)
54
55     def test_Process_all(self) -> None:
56         """Test Process.all()."""
57         p_1 = Process(None)
58         p_1.save(self.db_conn)
59         p_2 = Process(None)
60         p_2.save(self.db_conn)
61         self.assertEqual({p_1.id_, p_2.id_},
62                          set(p.id_ for p in Process.all(self.db_conn)))
63
64
65 class TestsWithServer(TestCaseWithServer):
66     """Module tests against our HTTP server/handler (and database)."""
67
68     def test_do_POST_process(self) -> None:
69         """Test POST /process and its effect on the database."""
70         form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.0}
71         self.post_to(form_data, '/process?id=FOO')
72         self.assertEqual(self.conn.getresponse().status, 400)
73         form_data['effort'] = 'foo'
74         self.post_to(form_data, '/process?id=')
75         self.assertEqual(self.conn.getresponse().status, 400)
76         form_data['effort'] = None
77         self.post_to(form_data, '/process?id=')
78         self.assertEqual(self.conn.getresponse().status, 400)
79         form_data = {}
80         self.post_to(form_data, '/process?id=')
81         self.assertEqual(self.conn.getresponse().status, 400)
82         form_data = {'title': '', 'description': ''}
83         self.post_to(form_data, '/process?id=')
84         self.assertEqual(self.conn.getresponse().status, 400)
85         form_data = {'title': '', 'effort': 1}
86         self.post_to(form_data, '/process?id=')
87         self.assertEqual(self.conn.getresponse().status, 400)
88         form_data = {'description': '', 'effort': 1}
89         self.post_to(form_data, '/process?id=')
90         self.assertEqual(self.conn.getresponse().status, 400)
91         form_data = {'title': None, 'description': 1, 'effort': 1.0}
92         self.post_to(form_data, '/process?id=')
93         self.check_redirect('/')
94         retrieved = Process.by_id(self.db_conn, 1)
95         self.assertEqual(retrieved.title.newest, 'None')
96         self.assertEqual([p.id_ for p in Process.all(self.db_conn)],
97                          [retrieved.id_])
98         self.post_to(form_data, '/process?id=1')
99         self.check_redirect('/')
100         self.post_to(form_data, '/process')
101         self.check_redirect('/')
102
103     def test_do_GET(self) -> None:
104         """Test /process and /processes response codes."""
105         self.conn.request('GET', '/process')
106         self.assertEqual(self.conn.getresponse().status, 200)
107         self.conn.request('GET', '/process?id=')
108         self.assertEqual(self.conn.getresponse().status, 200)
109         self.conn.request('GET', '/process?id=0')
110         self.assertEqual(self.conn.getresponse().status, 400)
111         self.conn.request('GET', '/process?id=FOO')
112         self.assertEqual(self.conn.getresponse().status, 400)
113         self.conn.request('GET', '/processes')
114         self.assertEqual(self.conn.getresponse().status, 200)