Add initial tests for config.py error handling

This commit is contained in:
Florian Bruhin 2017-09-15 11:31:55 +02:00
parent 4da9b8c495
commit 5efce10c2c
3 changed files with 60 additions and 2 deletions

View File

@ -659,16 +659,18 @@ def init(parent=None):
config_commands = ConfigCommands(instance, key_instance)
objreg.register('config-commands', config_commands)
global _errbox
try:
config_api = configfiles.read_config_py()
except configexc.ConfigFileErrors as e:
global _errbox
_errbox = msgbox.msgbox(parent=None,
title="Error while reading config",
text=e.to_html(),
icon=QMessageBox.Warning,
plain_text=False)
config_api = None
else:
_errbox = None
if getattr(config_api, 'load_autoconfig', True):
instance.read_yaml()

View File

@ -19,6 +19,7 @@
"""Tests for qutebrowser.config.config."""
import copy
import types
import unittest.mock
import pytest
@ -795,6 +796,16 @@ class TestContainer:
container.content.cookies.store = False
assert config_stub._values['content.cookies.store'] is False
def test_confapi_errors(self, container):
configapi = types.SimpleNamespace(errors=[])
container._configapi = configapi
container.tabs.foobar # pylint: disable=pointless-statement
assert len(configapi.errors) == 1
error = configapi.errors[0]
assert error.text == "While getting 'tabs.foobar'"
assert str(error.exception) == "No option 'tabs.foobar'"
class StyleObj(QObject):
@ -866,7 +877,9 @@ def init_patch(qapp, fake_save_manager, monkeypatch, config_tmpdir,
@pytest.mark.parametrize('load_autoconfig', [True, False])
def test_init(init_patch, fake_save_manager, config_tmpdir, load_autoconfig):
@pytest.mark.parametrize('config_py_errors', [True, False])
def test_init(qtbot, init_patch, fake_save_manager, config_tmpdir,
load_autoconfig, config_py_errors):
autoconfig_file = config_tmpdir / 'autoconfig.yml'
config_py_file = config_tmpdir / 'config.py'
@ -875,10 +888,20 @@ def test_init(init_patch, fake_save_manager, config_tmpdir, load_autoconfig):
config_py_lines = ['c.colors.hints.bg = "red"']
if not load_autoconfig:
config_py_lines.append('config.load_autoconfig = False')
if config_py_errors:
config_py_lines.append('c.foo = 42')
config_py_file.write_text('\n'.join(config_py_lines), 'utf-8', ensure=True)
config.init()
if config_py_errors:
qtbot.add_widget(config._errbox)
expected = "Errors occurred while reading config.py:"
assert config._errbox.text().strip().startswith(expected)
else:
assert config._errbox is None
objreg.get('config-commands')
assert isinstance(config.instance, config.Config)
assert isinstance(config.key_instance, config.KeyConfig)

View File

@ -18,6 +18,8 @@
"""Tests for qutebrowser.config.configexc."""
import textwrap
from qutebrowser.config import configexc
from qutebrowser.utils import usertypes
@ -43,3 +45,34 @@ def test_duplicate_key_error():
e = configexc.DuplicateKeyError('asdf')
assert isinstance(e, configexc.KeybindingError)
assert str(e) == "Duplicate key asdf"
def test_config_file_errors():
err1 = configexc.ConfigErrorDesc("Error text 1", Exception("Exception 1"))
err2 = configexc.ConfigErrorDesc("Error text 2", Exception("Exception 2"),
"Fake traceback")
errors = configexc.ConfigFileErrors("config.py", [err1, err2])
html = errors.to_html()
assert textwrap.dedent(html) == textwrap.dedent("""
Errors occurred while reading config.py:
<ul>
<li>
<b>Error text 1</b>: Exception 1
</li>
<li>
<b>Error text 2</b>: Exception 2
<pre>
Fake traceback
</pre>
</li>
</ul>
""")
# Make sure the traceback is not indented
assert '<pre>\nFake traceback\n' in html