diff test/session_common.py @ 6823:fe0091279f50

Refactor session db logging and key generation for sessions/otks While I was working on the redis sessiondb stuff, I noticed that log_wanrning, get_logger ... was duplicated. Also there was code to generate a unique key for otks that was duplicated. Changes: creating new sessions_common.py and SessionsCommon class to provide methods: log_warning, log_info, log_debug, get_logger, getUniqueKey getUniqueKey method is closer to the method used to make session keys in client.py. sessions_common.py now report when random_.py chooses a weak random number generator. Removed same from rest.py. get_logger reconciles all logging under roundup.hyperdb.backends.<name of BasicDatabase class> some backends used to log to root logger. have BasicDatabase in other sessions_*.py modules inherit from SessionCommon. change logging to use log_* methods. In addition: remove unused imports reported by flake8 and other formatting changes modify actions.py, rest.py, templating.py to use getUniqueKey method. add tests for new methods test_redis_session.py swap out ModuleNotFoundError for ImportError to prevent crash in python2 when redis is not present. allow injection of username:password or just password into redis connection URL. set pytest_redis_pw envirnment variable to password or user:password when running test.
author John Rouillard <rouilj@ieee.org>
date Sun, 07 Aug 2022 01:51:11 -0400
parents 3f60a71b0812
children 39c482e6a246
line wrap: on
line diff
--- a/test/session_common.py	Sun Aug 07 01:26:30 2022 -0400
+++ b/test/session_common.py	Sun Aug 07 01:51:11 2022 -0400
@@ -24,6 +24,18 @@
 sessions_dbm.py.
 
 """
+
+import pytest, sys
+
+_py3 = sys.version_info[0] > 2
+if _py3:
+    skip_py2 = lambda func, *args, **kwargs: func
+else:
+    from .pytest_patcher import mark_class
+    skip_py2 = mark_class(pytest.mark.skip(
+        reason="Skipping log test, test doesn't work on python2"))
+
+
 class SessionTest(object):
     def setUp(self):
         # remove previous test, ignore errors
@@ -185,3 +197,75 @@
         week_ago =  time.time() - 60*60*24*7
         self.assertGreater(week_ago + 302, ts)
         self.assertLess(week_ago + 298, ts)
+
+    def testGetUniqueKey(self):
+        # 40 bytes of randomness gets larger when encoded
+        key = self.sessions.getUniqueKey()
+        self.assertEqual(len(key), 54)
+
+        # length is bytes of randomness
+        key = self.sessions.getUniqueKey(length=23)
+        self.assertEqual(len(key), 31)
+
+        key = self.sessions.getUniqueKey(length=200)
+        self.assertEqual(len(key), 267)
+
+    def testget_logger(self):
+        logger = self.sessions.get_logger()
+        # why do rdbms session use session/otk as the table name
+        # while dbm uses sessions/otks? In any case check both.
+        self.assertIn(logger.name, ["roundup.hyperdb.backends.sessions",
+                                    "roundup.hyperdb.backends.session"])
+
+        logger = self.otks.get_logger()
+        self.assertIn(logger.name, ["roundup.hyperdb.backends.otks",
+                                    "roundup.hyperdb.backends.otk"])
+
+    def testget_logger_name_test(self):
+        self.sessions.name="otks"
+        logger = self.sessions.get_logger()
+        self.assertEqual(logger.name, "roundup.hyperdb.backends.otks")
+
+    @skip_py2
+    def test_log_warning(self):
+        """Only python3 pytest has the right context handler for this,
+           so skip this on python2.
+        """
+
+        self.sessions.name = "newdb"
+
+        with self.assertLogs(logger="roundup.hyperdb.backends.newdb") as logs:
+            self.sessions.log_warning("hello world")
+
+        self.assertEqual(len(logs.records), 1)
+        self.assertEqual(logs.records[0].levelname, "WARNING")
+
+    @skip_py2
+    def test_log_info(self):
+        """Only python3 pytest has the right context handler for this,
+           so skip this on python2.
+        """
+
+        self.sessions.name = "newdb"
+
+        with self.assertLogs(logger="roundup.hyperdb.backends.newdb") as logs:
+            self.sessions.log_info("hello world")
+
+        self.assertEqual(len(logs.records), 1)
+        self.assertEqual(logs.records[0].levelname, "INFO")
+
+    @skip_py2
+    def test_log_debug(self):
+        """Only python3 pytest has the right context handler for this,
+           so skip this on python2.
+        """
+
+        self.sessions.name = "newdb"
+
+        with self.assertLogs(logger="roundup.hyperdb.backends.newdb",
+                             level='DEBUG') as logs:
+            self.sessions.log_debug("hello world")
+
+        self.assertEqual(len(logs.records), 1)
+        self.assertEqual(logs.records[0].levelname, "DEBUG")
+        

Roundup Issue Tracker: http://roundup-tracker.org/