From 4518d2bf256ac4d93a4e69e33af96ee68ef9b3ee Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc" Date: Sat, 17 Nov 2018 00:22:39 -0600 Subject: [PATCH] Raise exception on unknown pgwui setting --- src/pgwui_server/__init__.py | 43 ++++++++++++++++++++++++ tests/test___init__.py | 63 ++++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/pgwui_server/__init__.py b/src/pgwui_server/__init__.py index 121e6f0..a0758e9 100644 --- a/src/pgwui_server/__init__.py +++ b/src/pgwui_server/__init__.py @@ -24,6 +24,47 @@ 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') diff --git a/tests/test___init__.py b/tests/test___init__.py index 2cbfbc2..6bc9aa1 100644 --- a/tests/test___init__.py +++ b/tests/test___init__.py @@ -19,6 +19,7 @@ # Karl O. Pinc +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) -- 2.34.1