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()