diff test/test_config.py @ 5774:765f8c0e99ef

Sanity checking improvements. All IntegerNumberOption really have to be positive integers or zero. Replace type with new IntegerNumberGeqZeroOption class definition to enforce this range. Use update_option to test now unused IntegerNumberOption and never used FloatNumberOption. Test save function, make sure it creates .bak file. Test a few more configuration option classes.
author John Rouillard <rouilj@ieee.org>
date Fri, 07 Jun 2019 21:53:55 -0400
parents 8dbe307bdb57
children 95a366d46065
line wrap: on
line diff
--- a/test/test_config.py	Fri Jun 07 17:28:12 2019 -0400
+++ b/test/test_config.py	Fri Jun 07 21:53:55 2019 -0400
@@ -18,6 +18,8 @@
 import unittest
 import logging
 
+import os, shutil, errno
+
 import pytest
 from roundup import configuration
 
@@ -68,7 +70,10 @@
         self.assertRaises(configuration.OptionValueError,
              config._get_option('TRACKER_WEB').set, "htt://foo.example/bar")
 
-    def testLoginRateLimit(self):
+        self.assertRaises(configuration.OptionValueError,
+             config._get_option('TRACKER_WEB').set, "")
+
+    def testLoginAttemptsMin(self):
         config = configuration.CoreConfig()
 
         self.assertEqual(None,
@@ -82,3 +87,143 @@
         self.assertRaises(configuration.OptionValueError,
                    config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set, "-1")
 
+        self.assertRaises(configuration.OptionValueError,
+                   config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set, "")
+
+    def testTimeZone(self):
+        config = configuration.CoreConfig()
+
+        self.assertEqual(None,
+                config._get_option('TIMEZONE').set("0"))
+
+        # not a valid timezone
+        self.assertRaises(configuration.OptionValueError,
+                config._get_option('TIMEZONE').set, "Zot")
+
+        # 25 is not a valid UTC offset: -12 - +14 is range
+        # possibly +/- 1 for DST. But roundup.date doesn't
+        # constrain to this range.
+        #self.assertRaises(configuration.OptionValueError,
+        #        config._get_option('TIMEZONE').set, "25")
+
+        try:
+            import pytz
+            self.assertEqual(None,
+                    config._get_option('TIMEZONE').set("UTC"))
+            self.assertEqual(None,
+                    config._get_option('TIMEZONE').set("America/New_York"))
+
+        except ImportError:
+            self.assertRaises(configuration.OptionValueError,
+                    config._get_option('TIMEZONE').set, "UTC")
+            self.assertRaises(configuration.OptionValueError,
+                    config._get_option('TIMEZONE').set, "America/New_York")
+
+    def testWebSecretKey(self):
+        config = configuration.CoreConfig()
+
+        self.assertEqual(None,
+                config._get_option('WEB_SECRET_KEY').set("skskskd"))
+
+        self.assertRaises(configuration.OptionValueError,
+                config._get_option('WEB_SECRET_KEY').set, "")
+
+
+    def testStaticFiles(self):
+        config = configuration.CoreConfig()
+
+        self.assertEqual(None,
+                config._get_option('STATIC_FILES').set("foo /tmp/bar"))
+
+        self.assertEqual(config.STATIC_FILES,
+                         ["./foo", "/tmp/bar"])
+
+        self.assertEqual(config['STATIC_FILES'],
+                         ["./foo", "/tmp/bar"])
+
+    def testIsolationLevel(self):
+        config = configuration.CoreConfig()
+
+        self.assertEqual(None,
+            config._get_option('RDBMS_ISOLATION_LEVEL').set("read uncommitted"))
+        self.assertEqual(None,
+            config._get_option('RDBMS_ISOLATION_LEVEL').set("read committed"))
+        self.assertEqual(None,
+            config._get_option('RDBMS_ISOLATION_LEVEL').set("repeatable read"))
+
+
+        self.assertRaises(configuration.OptionValueError,
+            config._get_option('RDBMS_ISOLATION_LEVEL').set, "not a level")
+
+    def testConfigSave(self):
+
+        config = configuration.CoreConfig()
+        # make scratch directory to create files in
+
+        self.startdir = os.getcwd()
+
+        self.dirname = os.getcwd() + '_test_config'
+        os.mkdir(self.dirname)
+
+        try:
+            os.chdir(self.dirname)
+            self.assertFalse(os.access("config.ini", os.F_OK))
+            self.assertFalse(os.access("config.bak", os.F_OK))
+            config.save()
+            config.save() # creates .bak file
+            self.assertTrue(os.access("config.ini", os.F_OK))
+            self.assertTrue(os.access("config.bak", os.F_OK))
+
+            self.assertFalse(os.access("foo.bar", os.F_OK))
+            self.assertFalse(os.access("foo.bak", os.F_OK))
+            config.save("foo.bar")
+            config.save("foo.bar") # creates .bak file
+            self.assertTrue(os.access("foo.bar", os.F_OK))
+            self.assertTrue(os.access("foo.bak", os.F_OK))
+
+        finally:
+            # cleanup scratch directory and files
+            try:
+                os.chdir(self.startdir)
+                shutil.rmtree(self.dirname)
+            except OSError as error:
+                if error.errno not in (errno.ENOENT, errno.ESRCH): raise
+
+    def testFloatAndInt_with_update_option(self):
+
+       config = configuration.CoreConfig()
+
+       # Update existing IntegerNumberGeqZeroOption to IntegerNumberOption
+       config.update_option('WEB_LOGIN_ATTEMPTS_MIN',
+                            configuration.IntegerNumberOption,
+                            "0", description="new desc")
+
+       # -1 is allowed now that it is an int.
+       self.assertEqual(None,
+                    config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set("-1"))
+
+       # but can't float this
+       self.assertRaises(configuration.OptionValueError,
+                    config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set, "2.4")
+
+       # but fred is still an issue
+       self.assertRaises(configuration.OptionValueError,
+                    config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set, "fred")
+       
+       # Update existing IntegerNumberOption to FloatNumberOption
+       config.update_option('WEB_LOGIN_ATTEMPTS_MIN',
+                            configuration.FloatNumberOption,
+                            "0.0")
+
+       self.assertEqual(config['WEB_LOGIN_ATTEMPTS_MIN'], -1)
+
+       # can float this
+       self.assertEqual(None,
+                config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set("3.1415926"))
+
+       # but fred is still an issue
+       self.assertRaises(configuration.OptionValueError,
+                    config._get_option('WEB_LOGIN_ATTEMPTS_MIN').set, "fred")
+
+       self.assertAlmostEqual(config['WEB_LOGIN_ATTEMPTS_MIN'], 3.1415926,
+                              places=6)

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