home · contact · privacy
Extend GET /day?date= test.
[plomtask] / tests / test_days.py
index 8f5f2678c002034f02a1f036c28b976dd1b589b6..d0accbc0d778a429ba2e741061b0fc35c50712c6 100644 (file)
@@ -1,14 +1,17 @@
 """Test days module."""
 from unittest import TestCase
 """Test days module."""
 from unittest import TestCase
+from threading import Thread
+from http.client import HTTPConnection
 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
 
 
-class DayTests(TestCase):
-    """Tests for testing the days module."""
+class TestsSansDB(TestCase):
+    """Days module tests not requiring DB setup."""
 
     def test_Day_dates(self):
         """Test Day's date format."""
 
     def test_Day_dates(self):
         """Test Day's date format."""
@@ -36,26 +39,91 @@ class DayTests(TestCase):
         """Test Day.weekday."""
         self.assertEqual(Day('2024-03-17').weekday, 'Sunday')
 
         """Test Day.weekday."""
         self.assertEqual(Day('2024-03-17').weekday, 'Sunday')
 
+
+class TestsWithDB(TestCase):
+    """Days module tests not requiring DB setup."""
+
+    def setUp(self):
+        timestamp = datetime.now().timestamp()
+        self.db_file = DatabaseFile(f'test_db:{timestamp}')
+        self.db_file.remake()
+        self.db_conn = DatabaseConnection(self.db_file)
+
+    def tearDown(self):
+        self.db_conn.close()
+        remove_file(self.db_file.path)
+
+    def test_Day_by_date(self):
+        """Test Day.by_date()."""
+        self.assertEqual(None, 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."""
-        timestamp = datetime.now().timestamp()
-        db_file = DatabaseFile(f'test_db:{timestamp}')
-        db_file.remake()
-        conn = DatabaseConnection(db_file)
         day1 = Day('2024-01-01')
         day2 = Day('2024-01-02')
         day3 = Day('2024-01-03')
         day1 = Day('2024-01-01')
         day2 = Day('2024-01-02')
         day3 = Day('2024-01-03')
-        day1.save(conn)
-        day2.save(conn)
-        day3.save(conn)
-        self.assertEqual(Day.all(conn), [day1, day2, day3])
-        self.assertEqual(Day.all(conn, ('2024-01-01', '2024-01-03')),
+        day1.save(self.db_conn)
+        day2.save(self.db_conn)
+        day3.save(self.db_conn)
+        self.assertEqual(Day.all(self.db_conn),
+                         [day1, day2, day3])
+        self.assertEqual(Day.all(self.db_conn, ('', '')),
                          [day1, day2, day3])
                          [day1, day2, day3])
-        self.assertEqual(Day.all(conn, ('2024-01-02', '2024-01-03')),
+        self.assertEqual(Day.all(self.db_conn, ('2024-01-01', '2024-01-03')),
+                         [day1, day2, day3])
+        self.assertEqual(Day.all(self.db_conn, ('2024-01-02', '2024-01-03')),
                          [day2, day3])
                          [day2, day3])
-        self.assertEqual(Day.all(conn, ('2024-01-03', '')), [day3])
-        self.assertEqual(Day.all(conn, ('2024-01-01', '')), [day1, day2, day3])
-        self.assertEqual(Day.all(conn, ('', '2024-01-02')), [day1, day2])
-        self.assertEqual(Day.all(conn, ('2024-01-03, 2024-01-01')), [])
-        conn.close()
-        remove_file(db_file.path)
+        self.assertEqual(Day.all(self.db_conn, ('2024-01-03', '')),
+                         [day3])
+        self.assertEqual(Day.all(self.db_conn, ('2024-01-01', '')),
+                         [day1, day2, day3])
+        self.assertEqual(Day.all(self.db_conn, ('', '2024-01-02')),
+                         [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_GET_day(self):
+        """Test /day response."""
+        conn = HTTPConnection(*self.httpd.server_address)
+        conn.request('GET', '/day')
+        self.assertEqual(conn.getresponse().status, 200)
+        conn.request('GET', '/day?date=3000-01-01')
+        self.assertEqual(conn.getresponse().status, 200)
+        conn.request('GET', '/day?date=FOO')
+        self.assertEqual(conn.getresponse().status, 400)
+
+    def tearDown(self):
+        self.httpd.shutdown()
+        self.httpd.server_close()
+        self.server_thread.join()
+        super().tearDown()