home · contact · privacy
Add Processes module tests, re-organize/re-factor unit tests.
[plomtask] / tests / processes.py
1 """Test Processes module."""
2 from unittest import TestCase
3 from http.client import HTTPConnection
4 from urllib.parse import urlencode
5 from tests.utils import TestCaseWithDB, TestCaseWithServer
6 from plomtask.processes import Process
7
8
9 class TestsSansDB(TestCase):
10     """Module tests not requiring DB setup."""
11
12     def test_Process_versioned_defaults(self):
13         """Test defaults of Process' VersionedAttributes."""
14         self.assertEqual(Process(None).title.newest, 'UNNAMED')
15         self.assertEqual(Process(None).description.newest, '')
16         self.assertEqual(Process(None).effort.newest, 1.0)
17
18
19 class TestsWithDB(TestCaseWithDB):
20     """Mdule tests not requiring DB setup."""
21
22     def test_Process_save(self):
23         """Test Process.save()."""
24         p_saved = Process(None)
25         p_saved.save(self.db_conn)
26         self.assertEqual(p_saved.id_,
27                          Process.by_id(self.db_conn, 1, create=False).id_)
28         p_saved = Process(0)
29         p_saved.save(self.db_conn)
30         self.assertEqual(p_saved.id_,
31                          Process.by_id(self.db_conn, 2, create=False).id_)
32         p_saved = Process(5)
33         p_saved.save(self.db_conn)
34         self.assertEqual(p_saved.id_,
35                          Process.by_id(self.db_conn, 5, create=False).id_)
36         p_saved.title.set('named')
37         p_loaded = Process.by_id(self.db_conn, p_saved.id_)
38         self.assertNotEqual(p_saved.title.history, p_loaded.title.history)
39         p_saved.save(self.db_conn)
40         p_loaded = Process.by_id(self.db_conn, p_saved.id_)
41         self.assertEqual(p_saved.title.history, p_loaded.title.history)
42
43     def test_Process_by_id(self):
44         """Test Process.by_id()."""
45         self.assertEqual(None, Process.by_id(self.db_conn, None, create=False))
46         self.assertEqual(None, Process.by_id(self.db_conn, 0, create=False))
47         self.assertEqual(None, 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.assertNotEqual(Process(1).id_,
51                             Process.by_id(self.db_conn, 0, create=True).id_)
52         self.assertEqual(Process(1).id_,
53                          Process.by_id(self.db_conn, 1, create=True).id_)
54         self.assertEqual(Process(2).id_,
55                          Process.by_id(self.db_conn, 2, create=True).id_)
56
57     def test_Process_all(self):
58         """Test Process.all()."""
59         p_1 = Process(None)
60         p_1.save(self.db_conn)
61         p_2 = Process(None)
62         p_2.save(self.db_conn)
63         self.assertEqual({p_1.id_, p_2.id_},
64                          set(p.id_ for p in Process.all(self.db_conn)))
65
66
67 class TestsWithServer(TestCaseWithServer):
68     """Module tests against our HTTP server/handler (and database)."""
69
70     def test_do_POST_process(self):
71         """Test POST /process and its effect on the database."""
72         def post_data_to_expect(form_data: dict, to_: str, expect: int):
73             encoded_form_data = urlencode(form_data).encode('utf-8')
74             headers = {'Content-Type': 'application/x-www-form-urlencoded',
75                        'Content-Length': str(len(encoded_form_data))}
76             http_conn.request('POST', to_,
77                               body=encoded_form_data, headers=headers)
78             self.assertEqual(http_conn.getresponse().status, expect)
79         http_conn = HTTPConnection(*self.httpd.server_address)
80         form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.0}
81         post_data_to_expect(form_data, '/process?id=FOO', 400)
82         form_data['effort'] = 'foo'
83         post_data_to_expect(form_data, '/process?id=', 400)
84         form_data['effort'] = None
85         post_data_to_expect(form_data, '/process?id=', 400)
86         form_data = {'title': None, 'description': 1, 'effort': 1.0}
87         post_data_to_expect(form_data, '/process?id=', 302)
88         retrieved = Process.by_id(self.db_conn, 1)
89         self.assertEqual(retrieved.title.newest, 'None')
90         self.assertEqual([p.id_ for p in Process.all(self.db_conn)],
91                          [retrieved.id_])
92
93     def test_do_GET(self):
94         """Test /process and /processes response codes."""
95         http_conn = HTTPConnection(*self.httpd.server_address)
96         http_conn.request('GET', '/process')
97         self.assertEqual(http_conn.getresponse().status, 200)
98         http_conn.request('GET', '/process?id=')
99         self.assertEqual(http_conn.getresponse().status, 200)
100         http_conn.request('GET', '/process?id=0')
101         self.assertEqual(http_conn.getresponse().status, 200)
102         http_conn.request('GET', '/process?id=FOO')
103         self.assertEqual(http_conn.getresponse().status, 400)
104         http_conn.request('GET', '/processes')
105         self.assertEqual(http_conn.getresponse().status, 200)