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
9 class TestsSansDB(TestCase):
10 """Module tests not requiring DB setup."""
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)
19 class TestsWithDB(TestCaseWithDB):
20 """Mdule tests not requiring DB setup."""
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_)
29 p_saved.save(self.db_conn)
30 self.assertEqual(p_saved.id_,
31 Process.by_id(self.db_conn, 2, create=False).id_)
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)
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_)
57 def test_Process_all(self):
58 """Test Process.all()."""
60 p_1.save(self.db_conn)
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)))
67 class TestsWithServer(TestCaseWithServer):
68 """Module tests against our HTTP server/handler (and database)."""
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)],
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)