Simplify and reorganize configfile tests
Also make save/load of sys.path a little more robust
This commit is contained in:
parent
4e22b4666d
commit
43ce10efc3
@ -247,7 +247,7 @@ def read_config_py(filename=None):
|
|||||||
raise configexc.ConfigFileErrors(basename, [desc])
|
raise configexc.ConfigFileErrors(basename, [desc])
|
||||||
except SyntaxError as e:
|
except SyntaxError as e:
|
||||||
desc = configexc.ConfigErrorDesc("Syntax Error", e,
|
desc = configexc.ConfigErrorDesc("Syntax Error", e,
|
||||||
traceback=traceback.format_exc())
|
traceback=traceback.format_exc())
|
||||||
raise configexc.ConfigFileErrors(basename, [desc])
|
raise configexc.ConfigFileErrors(basename, [desc])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -257,13 +257,14 @@ def read_config_py(filename=None):
|
|||||||
# other files in logical places
|
# other files in logical places
|
||||||
config_dir = os.path.dirname(filename)
|
config_dir = os.path.dirname(filename)
|
||||||
if config_dir not in sys.path:
|
if config_dir not in sys.path:
|
||||||
sys.path = [config_dir] + sys.path
|
sys.path.insert(0, config_dir)
|
||||||
|
|
||||||
exec(code, module.__dict__)
|
exec(code, module.__dict__)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
api.errors.append(configexc.ConfigErrorDesc(
|
api.errors.append(configexc.ConfigErrorDesc(
|
||||||
"Unhandled exception",
|
"Unhandled exception",
|
||||||
exception=e, traceback=traceback.format_exc()))
|
exception=e, traceback=traceback.format_exc()))
|
||||||
|
|
||||||
api.finalize()
|
api.finalize()
|
||||||
return api
|
return api
|
||||||
|
|
||||||
@ -271,13 +272,11 @@ def read_config_py(filename=None):
|
|||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def saved_sys_properties():
|
def saved_sys_properties():
|
||||||
"""Save various sys properties such as sys.path and sys.modules."""
|
"""Save various sys properties such as sys.path and sys.modules."""
|
||||||
old_path = sys.path
|
old_path = sys.path.copy()
|
||||||
old_modules = sys.modules.copy()
|
old_modules = sys.modules.copy()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
yield
|
yield
|
||||||
except:
|
|
||||||
raise
|
|
||||||
finally:
|
finally:
|
||||||
sys.path = old_path
|
sys.path = old_path
|
||||||
for module in set(sys.modules).difference(old_modules):
|
for module in set(sys.modules).difference(old_modules):
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
"""Tests for qutebrowser.config.configfiles."""
|
"""Tests for qutebrowser.config.configfiles."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@ -207,17 +208,39 @@ class TestYaml:
|
|||||||
assert error.traceback is None
|
assert error.traceback is None
|
||||||
|
|
||||||
|
|
||||||
|
class ConfPy:
|
||||||
|
|
||||||
|
"""Helper class to get a confpy fixture."""
|
||||||
|
|
||||||
|
def __init__(self, tmpdir, filename: str = "config.py"):
|
||||||
|
self._file = tmpdir / filename
|
||||||
|
self.filename = str(self._file)
|
||||||
|
|
||||||
|
def write(self, *lines):
|
||||||
|
text = '\n'.join(lines)
|
||||||
|
self._file.write_text(text, 'utf-8', ensure=True)
|
||||||
|
|
||||||
|
def read(self):
|
||||||
|
"""Read the config.py via configfiles and check for errors."""
|
||||||
|
api = configfiles.read_config_py(self.filename)
|
||||||
|
assert not api.errors
|
||||||
|
|
||||||
|
def write_qbmodule(self):
|
||||||
|
self.write('import qbmodule',
|
||||||
|
'qbmodule.run(config)')
|
||||||
|
|
||||||
|
|
||||||
class TestConfigPyModules:
|
class TestConfigPyModules:
|
||||||
|
|
||||||
pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
|
pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def confpy(self, tmpdir):
|
def confpy(self, tmpdir):
|
||||||
return TestConfigPy.ConfPy(tmpdir)
|
return ConfPy(tmpdir)
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def qbmodulepy(self, tmpdir):
|
def qbmodulepy(self, tmpdir):
|
||||||
return TestConfigPy.ConfPy(tmpdir, filename="qbmodule.py")
|
return ConfPy(tmpdir, filename="qbmodule.py")
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def restore_sys_path(self):
|
def restore_sys_path(self):
|
||||||
@ -279,30 +302,9 @@ class TestConfigPy:
|
|||||||
|
|
||||||
pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
|
pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
|
||||||
|
|
||||||
class ConfPy:
|
|
||||||
|
|
||||||
"""Helper class to get a confpy fixture."""
|
|
||||||
|
|
||||||
def __init__(self, tmpdir, filename: str = "config.py"):
|
|
||||||
self._confpy = tmpdir / filename
|
|
||||||
self.filename = str(self._confpy)
|
|
||||||
|
|
||||||
def write(self, *lines):
|
|
||||||
text = '\n'.join(lines)
|
|
||||||
self._confpy.write_text(text, 'utf-8', ensure=True)
|
|
||||||
|
|
||||||
def read(self):
|
|
||||||
"""Read the config.py via configfiles and check for errors."""
|
|
||||||
api = configfiles.read_config_py(self.filename)
|
|
||||||
assert not api.errors
|
|
||||||
|
|
||||||
def write_qbmodule(self):
|
|
||||||
self.write('import qbmodule',
|
|
||||||
'qbmodule.run(config)')
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def confpy(self, tmpdir):
|
def confpy(self, tmpdir):
|
||||||
return self.ConfPy(tmpdir)
|
return ConfPy(tmpdir)
|
||||||
|
|
||||||
@pytest.mark.parametrize('line', [
|
@pytest.mark.parametrize('line', [
|
||||||
'c.colors.hints.bg = "red"',
|
'c.colors.hints.bg = "red"',
|
||||||
|
Loading…
Reference in New Issue
Block a user