home · contact · privacy
Change variable name to avoid confusion between DB and HTTP connections.
[plomtask] / tests / test_days.py
index d3a7bba656d19d39f35b93535564e4e3d17b0a2c..cc0f80db857b2fdf4ad83124d117b39c2cdb5135 100644 (file)
@@ -1,7 +1,11 @@
 """Test days module."""
 from unittest import TestCase
 """Test days module."""
 from unittest import TestCase
+from threading import Thread
+from http.client import HTTPConnection
+from urllib.parse import urlencode
 from datetime import datetime
 from os import remove as remove_file
 from datetime import datetime
 from os import remove as remove_file
+from plomtask.http import TaskHandler, TaskServer
 from plomtask.days import Day
 from plomtask.misc import HandledException
 from plomtask.db import DatabaseFile, DatabaseConnection
 from plomtask.days import Day
 from plomtask.misc import HandledException
 from plomtask.db import DatabaseFile, DatabaseConnection
@@ -56,6 +60,10 @@ class TestsWithDB(TestCase):
         Day('2024-01-01').save(self.db_conn)
         self.assertEqual(Day('2024-01-01'),
                          Day.by_date(self.db_conn, '2024-01-01'))
         Day('2024-01-01').save(self.db_conn)
         self.assertEqual(Day('2024-01-01'),
                          Day.by_date(self.db_conn, '2024-01-01'))
+        self.assertEqual(None,
+                         Day.by_date(self.db_conn, '2024-01-02'))
+        self.assertEqual(Day('2024-01-02'),
+                         Day.by_date(self.db_conn, '2024-01-02', create=True))
 
     def test_Day_all(self):
         """Test Day.all(), especially in regards to date range filtering."""
 
     def test_Day_all(self):
         """Test Day.all(), especially in regards to date range filtering."""
@@ -81,3 +89,62 @@ class TestsWithDB(TestCase):
                          [day1, day2])
         self.assertEqual(Day.all(self.db_conn, ('2024-01-03, 2024-01-01')),
                          [])
                          [day1, day2])
         self.assertEqual(Day.all(self.db_conn, ('2024-01-03, 2024-01-01')),
                          [])
+
+    def test_Day_comment(self):
+        """Test Day.by_date()."""
+        self.assertEqual(None, Day.by_date(self.db_conn, '2024-01-01'))
+        d1 = Day('2024-01-01')
+        d1.save(self.db_conn)
+        day_retrieved = Day.by_date(self.db_conn, d1.date)
+        self.assertEqual(day_retrieved.comment, '')
+        d2 = Day('2024-01-02', 'foo')
+        d2.save(self.db_conn)
+        day_retrieved = Day.by_date(self.db_conn, d2.date)
+        self.assertEqual(day_retrieved.comment, 'foo')
+
+
+class TestsWithServer(TestsWithDB):
+    """Tests against our HTTP server/handler (and database)."""
+
+    def setUp(self):
+        super().setUp()
+        self.httpd = TaskServer(self.db_file, ('localhost', 0), TaskHandler)
+        self.server_thread = Thread(target=self.httpd.serve_forever)
+        self.server_thread.daemon = True
+        self.server_thread.start()
+
+    def test_do_POST_day(self):
+        """Test POST /day and its effect on the database."""
+        http_conn = HTTPConnection(*self.httpd.server_address)
+        form_data = {'comment': 'foo'}
+        encoded_form_data = urlencode(form_data).encode('utf-8')
+        headers = {'Content-Type': 'application/x-www-form-urlencoded',
+                   'Content-Length': str(len(encoded_form_data))}
+        http_conn.request('POST', '/day?date=FOO',
+                          body=encoded_form_data, headers=headers)
+        self.assertEqual(http_conn.getresponse().status, 400)
+        self.assertEqual(Day.all(self.db_conn), [])
+        http_conn.request('POST', '/day?date=2024-01-01',
+                          body=encoded_form_data, headers=headers)
+        self.assertEqual(http_conn.getresponse().status, 302)
+        retrieved = Day.by_date(self.db_conn, '2024-01-01')
+        self.assertEqual(retrieved.comment, 'foo')
+        self.assertEqual(Day.all(self.db_conn), [retrieved])
+
+    def test_do_GET(self):
+        """Test /day and /calendar response codes."""
+        http_conn = HTTPConnection(*self.httpd.server_address)
+        http_conn.request('GET', '/day')
+        self.assertEqual(http_conn.getresponse().status, 200)
+        http_conn.request('GET', '/day?date=3000-01-01')
+        self.assertEqual(http_conn.getresponse().status, 200)
+        http_conn.request('GET', '/day?date=FOO')
+        self.assertEqual(http_conn.getresponse().status, 400)
+        http_conn.request('GET', '/calendar')
+        self.assertEqual(http_conn.getresponse().status, 200)
+
+    def tearDown(self):
+        self.httpd.shutdown()
+        self.httpd.server_close()
+        self.server_thread.join()
+        super().tearDown()