Changeset - 7d23f2491ce8
[Not reviewed]
default
0 1 0
Konstantin Veretennicov - 10 years ago 2016-05-01 23:29:09
kveretennicov@gmail.com
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.
1 file changed with 35 insertions and 0 deletions:
0 comments (0 inline, 0 general)
kallithea/tests/conftest.py
Show inline comments
 
import os
 
import sys
 
import logging
 

	
 
import pkg_resources
 
from paste.deploy import loadapp
 
import pylons.test
 
from pylons.i18n.translation import _get_translator
 
import pytest
 
from kallithea.model.user import UserModel
 
from kallithea.model.meta import Session
 
from kallithea.model.db import Setting
 

	
 

	
 
def pytest_configure():
 
    path = os.getcwd()
 
    sys.path.insert(0, path)
 
    pkg_resources.working_set.add_entry(path)
 

	
 
    # Disable INFO logging of test database creation, restore with NOTSET
 
    logging.disable(logging.INFO)
 
    pylons.test.pylonsapp = loadapp('config:kallithea/tests/test.ini', relative_to=path)
 
    logging.disable(logging.NOTSET)
 

	
 
@@ -40,12 +41,46 @@ def pytest_configure():
 
@pytest.yield_fixture
 
def create_test_user():
 
    """Provide users that automatically disappear after test is over."""
 
    test_users = []
 
    def _create_test_user(user_form):
 
        user = UserModel().create(user_form)
 
        test_users.append(user)
 
        return user
 
    yield _create_test_user
 
    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()
0 comments (0 inline, 0 general)