Files @ 4136526cce20
Branch filter:

Location: kallithea/kallithea/tests/models/test_settings.py

Søren Løvborg
db: remove superfluous Session.add calls

Don't re-add objects to the SQLAlchemy Session just because they were
modified. Session.add is only for freshly constructed objects that
SQLAlchemy doesn't know about yet.

The rules are quite simple:

When creating a database object by calling the constructor directly, it
must explicitly be added to the session.

When creating an object using a factory function (like "create_repo"),
the returned object has already (by convention) been added to the
session, and should not be added again.

When getting an object from the session (via Session.query or any of the
utility functions that look up objects in the database), it's already
added, and should not be added again. SQLAlchemy notices attribute
modifications automatically for all objects it knows about.
from kallithea.model.meta import Session
from kallithea.model.db import Setting


name = 'spam-setting-name'

def test_passing_list_setting_value_results_in_string_valued_setting():
    assert Setting.get_by_name(name) is None
    setting = Setting.create_or_update(name, ['spam', 'eggs'])
    Session().flush()
    try:
        assert Setting.get_by_name(name) is not None
        # Quirk: list value is stringified.
        assert Setting.get_by_name(name).app_settings_value \
               == "['spam', 'eggs']"
        assert Setting.get_by_name(name).app_settings_type == 'unicode'
    finally:
        Session().delete(setting)
        Session().flush()

def test_list_valued_setting_creation_requires_manual_value_formatting():
    assert Setting.get_by_name(name) is None
    # Quirk: need manual formatting of list setting value.
    setting = Setting.create_or_update(name, 'spam,eggs', type='list')
    Session().flush()
    try:
        assert setting.app_settings_value == ['spam', 'eggs']
    finally:
        Session().delete(setting)
        Session().flush()

def test_list_valued_setting_update():
    assert Setting.get_by_name(name) is None
    setting = Setting.create_or_update(name, 'spam', type='list')
    Session().flush()
    try:
        assert setting.app_settings_value == [u'spam']
        # Assign back setting value.
        setting.app_settings_value = setting.app_settings_value
        # Quirk: value is stringified on write and listified on read.
        assert setting.app_settings_value == ["[u'spam']"]
        setting.app_settings_value = setting.app_settings_value
        assert setting.app_settings_value == ["[u\"[u'spam']\"]"]
    finally:
        Session().delete(setting)
        Session().flush()