Mercurial > kallithea
changeset 5902:7d23f2491ce8
tests: add set_test_settings fixture
Uses https://pytest.org/latest/yieldfixture.html#yieldfixture to restore
settings after tests. Takes into account current specifics of list-valued
settings.
author | Konstantin Veretennicov <kveretennicov@gmail.com> |
---|---|
date | Sun, 01 May 2016 23:29:09 +0200 |
parents | ef1187159860 |
children | a384ac02f8ac |
files | kallithea/tests/conftest.py |
diffstat | 1 files changed, 35 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/kallithea/tests/conftest.py Sun May 01 23:29:09 2016 +0200 +++ b/kallithea/tests/conftest.py Sun May 01 23:29:09 2016 +0200 @@ -9,6 +9,7 @@ import pytest from kallithea.model.user import UserModel from kallithea.model.meta import Session +from kallithea.model.db import Setting def pytest_configure(): @@ -49,3 +50,37 @@ for user in test_users: UserModel().delete(user) Session().commit() + + +def _set_settings(*kvtseq): + session = Session() + for kvt in kvtseq: + assert len(kvt) in (2, 3) + k = kvt[0] + v = kvt[1] + t = kvt[2] if len(kvt) == 3 else 'unicode' + setting = Setting.create_or_update(k, v, t) + session.add(setting) + session.flush() + + +@pytest.yield_fixture +def set_test_settings(): + """Restore settings after test is over.""" + # Save settings. + settings_snapshot = [ + (s.app_settings_name, s.app_settings_value, s.app_settings_type) + for s in Setting.query().all()] + yield _set_settings + # Restore settings. + session = Session() + keys = frozenset(k for (k, v, t) in settings_snapshot) + for s in Setting.query().all(): + if s.app_settings_name not in keys: + session.delete(s) + for k, v, t in settings_snapshot: + if t == 'list' and hasattr(v, '__iter__'): + v = ','.join(v) # Quirk: must format list value manually. + s = Setting.create_or_update(k, v, t) + session.add(s) + session.commit()