Raise exception on unknown pgwui setting
authorKarl O. Pinc <kop@meme.com>
Sat, 17 Nov 2018 06:22:39 +0000 (00:22 -0600)
committerKarl O. Pinc <kop@meme.com>
Sat, 17 Nov 2018 06:22:50 +0000 (00:22 -0600)
src/pgwui_server/__init__.py
tests/test___init__.py

index 121e6f0528713c2e91b24ad9a66ae25c3a7aa1af..a0758e9e97a51a0924a1f4ebfe7770f96be3efe0 100644 (file)
 
 from pyramid.config import Configurator
 
+# Constants
+
+# All the settings recognized by PGWUI
+SETTINGS = set(
+    ['pg_host',
+     'pg_port',
+     'default_db',
+     'dry_run',
+     'route_prefix',
+     'routes',
+     ])
+
+
+# Exceptions
+class Error(Exception):
+    '''Base error class for module
+    '''
+    pass
+
+
+class UnknownSettingKeyError(Error):
+    def __init__(self, key):
+        super().__init__('Unknown PGWUI setting: {}'.format(key))
+
+
+# Functions
+
+def abort_on_bad_setting(key):
+    '''Abort on a bad pgwui setting
+    '''
+    if key[:6] == 'pgwui.':
+        if key[6:] not in SETTINGS:
+            raise UnknownSettingKeyError(key)
+
+
+def validate_settings(settings):
+    '''Be sure all settings validate
+    '''
+    for key in settings.keys():
+        abort_on_bad_setting(key)
+
 
 def parse_assignments(lines):
     '''Return a list of key/value tuples from the lines of a setting
@@ -53,6 +94,8 @@ def add_routes(config, settings):
 def pgwui_server_config(settings):
     '''Configure pyramid
     '''
+    validate_settings(settings)
+
     rp = settings.get('pgwui.route_prefix')
     with Configurator(settings=settings, route_prefix=rp) as config:
         config.include('pgwui_common')
index 2cbfbc221d46f50141e116d5340959147b9b47bc..6bc9aa1722f4cac1125e28dea5e0551102c60506 100644 (file)
@@ -19,6 +19,7 @@
 
 # Karl O. Pinc <kop@meme.com>
 
+import pytest
 import pgwui_server.__init__ as pgwui_server_init
 
 
@@ -50,6 +51,44 @@ class MockConfig():
 
 # Unit tests
 
+# abort_on_bad_setting()
+
+def test_abort_on_bad_setting_unknown():
+    '''Nothing bad happens when there's a non-pgwui setting'''
+    pgwui_server_init.abort_on_bad_setting('foo')
+
+
+def test_abort_on_bad_setting_bad():
+    '''Raises an error on a bad pgwui setting'''
+    with pytest.raises(pgwui_server_init.UnknownSettingKeyError):
+        pgwui_server_init.abort_on_bad_setting('pgwui.foo')
+
+
+def test_abort_on_bad_setting_good():
+    '''Does nothing when a known pgwui setting is supplied'''
+    pgwui_server_init.abort_on_bad_setting('pgwui.pg_host')
+
+
+# validate_settings()
+
+def test_validate_settings(monkeypatch):
+    '''Calls abort_on_bad_setting() for each key in setting
+    '''
+    count = 0
+
+    def mock_abort_on_bad_setting(key):
+        nonlocal count
+        count += 1
+
+    monkeypatch.setattr(pgwui_server_init, 'abort_on_bad_setting',
+                        mock_abort_on_bad_setting)
+    settings = {'key1': 'value1',
+                'key2': 'value2'}
+
+    pgwui_server_init.validate_settings(settings)
+    assert count == len(settings)
+
+
 # parse_assignments()
 
 def test_parse_assignments_str():
@@ -61,9 +100,9 @@ def test_parse_assignments_str():
              'key3= value3=withequals\n'
              )
     result = pgwui_server_init.parse_assignments(lines)
-    assert result == [('key1', 'value1'),
-                      ('key2', 'value2'),
-                      ('key3', 'value3=withequals')]
+    assert set(result) == set([('key1', 'value1'),
+                               ('key2', 'value2'),
+                               ('key3', 'value3=withequals')])
 
 
 def test_parse_assignments_dict():
@@ -73,9 +112,9 @@ def test_parse_assignments_dict():
              'key2': 'value2',
              }
     result = pgwui_server_init.parse_assignments(lines)
-    assert result == [('key1', 'value1'),
-                      ('key2', 'value2'),
-                      ]
+    assert set(result) == set([('key1', 'value1'),
+                               ('key2', 'value2'),
+                               ])
 
 
 # add_routes()
@@ -102,7 +141,10 @@ def test_add_routes_notempty(monkeypatch):
 
 def test_pgwui_server_config(monkeypatch):
     '''Returns a configuration'''
-    monkeypatch.setattr(pgwui_server_init, 'Configurator', MockConfigurator)
+    monkeypatch.setattr(pgwui_server_init, 'validate_settings',
+                        lambda *args: True)
+    monkeypatch.setattr(pgwui_server_init, 'Configurator',
+                        MockConfigurator)
     monkeypatch.setattr(pgwui_server_init, 'add_routes',
                         lambda *args: None)
 
@@ -124,3 +166,10 @@ def test_main(monkeypatch):
 def test_main_integrated():
     '''Does not raise errors or warnings'''
     pgwui_server_init.main({})
+
+
+# Functional tests
+def test_unknownsettingkeyerror():
+    '''Takes an argument'''
+    assert isinstance(pgwui_server_init.UnknownSettingKeyError('key'),
+                      Exception)