Files
MyManagingTools/tests/test_settingsmanager.py
2025-06-27 07:26:58 +02:00

322 lines
10 KiB
Python

import dataclasses
import pytest
from core.settings_management import SettingsManager, MemoryDbEngine, GenericDbManager, NestedSettingsManager
FAKE_USER_ID = "FakeUserId"
@dataclasses.dataclass
class DummyObject:
a: int
b: str
c: bool
@dataclasses.dataclass
class DummySettings:
prop1: DummyObject
prop2: str
@dataclasses.dataclass
class DummyObjectWithDefault:
a: int = 5
b: str = "default_b"
c: bool = False
@dataclasses.dataclass
class DummySettingsWithDefault:
prop1: DummyObjectWithDefault = dataclasses.field(default_factory=DummyObjectWithDefault)
prop2: str = "prop2"
@pytest.fixture()
def manager():
return SettingsManager(MemoryDbEngine())
@pytest.fixture()
def settings():
return DummySettings(
prop1=DummyObject(1, "2", True),
prop2="prop2_new",
)
@pytest.fixture()
def generic_db_manager(session, manager):
return GenericDbManager(session, manager, "TestSettings", DummySettingsWithDefault)
@pytest.fixture()
def nested_settings_manager(session, manager):
return NestedSettingsManager(session, manager, "TestSettings", DummySettingsWithDefault, "prop1")
def test_i_can_save_and_load_settings(session, manager, settings):
manager.save(session, "MyEntry", settings)
from_db = manager.load(session, "MyEntry")
assert isinstance(from_db, DummySettings)
assert from_db.prop1.a == 1
assert from_db.prop1.b == "2"
assert from_db.prop1.c == True
assert from_db.prop2 == "prop2_new"
def test_i_can_have_two_entries(session, manager, settings):
manager.save(session, "MyEntry", settings)
manager.save(session, "MyOtherEntry", settings)
from_db = manager.load(session, "MyEntry")
from_db_other = manager.load(session, "MyOtherEntry")
assert isinstance(from_db, DummySettings)
assert isinstance(from_db_other, DummySettings)
def test_i_can_put_many_items_dict(session, manager):
manager.save(session, "TestEntry", {})
items = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
}
manager.put_many(session, "TestEntry", items)
loaded = manager.load(session, "TestEntry")
assert loaded['key1'] == 'value1'
assert loaded['key2'] == 'value2'
assert loaded['key3'] == 'value3'
def test_i_can_put_many_items_list(session, manager):
manager.save(session, "TestEntry", {})
items = [
('key1', 'value1'),
('key2', 'value2'),
('key3', 'value3')
]
manager.put_many(session, "TestEntry", items)
loaded = manager.load(session, "TestEntry")
assert loaded['key1'] == 'value1'
assert loaded['key2'] == 'value2'
assert loaded['key3'] == 'value3'
# Tests for GenericDbManager
def test_generic_db_manager_get_attribute(generic_db_manager, manager, session):
# Setup initial settings
initial_settings = DummySettingsWithDefault(
prop1=DummyObjectWithDefault(1, "2", True),
prop2="initial_value"
)
manager.save(session, "TestSettings", initial_settings)
# Get attribute via GenericDbManager
assert generic_db_manager.prop2 == "initial_value"
assert generic_db_manager.prop1.a == 1
assert generic_db_manager.prop1.b == "2"
assert generic_db_manager.prop1.c is True
def test_generic_db_manager_set_attribute(generic_db_manager, manager, session):
# Setup initial settings
initial_settings = DummySettingsWithDefault(
prop1=DummyObjectWithDefault(1, "2", True),
prop2="initial_value"
)
manager.save(session, "TestSettings", initial_settings)
# Set attribute via GenericDbManager
generic_db_manager.prop2 = "updated_value"
# Verify that the change was saved to the database
loaded_settings = manager.load(session, "TestSettings")
assert loaded_settings.prop2 == "updated_value"
# Also verify direct access works
assert generic_db_manager.prop2 == "updated_value"
def test_generic_db_manager_set_nested_attribute(generic_db_manager, manager, session):
# Setup initial settings
initial_settings = DummySettingsWithDefault(
prop1=DummyObjectWithDefault(1, "2", True),
prop2="initial_value"
)
manager.save(session, "TestSettings", initial_settings)
# Set nested attribute
generic_db_manager.prop1.a = 42
generic_db_manager.prop1.b = "modified"
generic_db_manager.prop1.c = False
# Verify the changes were saved
loaded_settings = manager.load(session, "TestSettings")
assert loaded_settings.prop1.a == 42
assert loaded_settings.prop1.b == "modified"
assert loaded_settings.prop1.c is False
def test_generic_db_manager_attribute_error(generic_db_manager):
# Test that accessing a non-existent attribute raises AttributeError
with pytest.raises(AttributeError) as excinfo:
generic_db_manager.non_existent_attribute
assert "has no attribute 'non_existent_attribute'." in str(excinfo.value)
def test_generic_db_manager_set_attribute_error(generic_db_manager):
# Test that setting a non-existent attribute raises AttributeError
with pytest.raises(AttributeError) as excinfo:
generic_db_manager.non_existent_attribute = "value"
assert "has no attribute 'non_existent_attribute'." in str(excinfo.value)
def test_generic_db_manager_no_initialization(session, manager):
# Test initialization with default object
db_manager = GenericDbManager(session, manager, "TestSettings", DummySettingsWithDefault)
value = db_manager.prop2 # Accessing an attribute will create a new entry
assert value == "prop2"
def test_generic_db_manager_no_initialization_set(session, manager):
db_manager = GenericDbManager(session, manager, "TestSettings", DummySettingsWithDefault)
db_manager.prop2 = "new_value"
# Verify that a default object was created and saved
loaded_settings = manager.load(session, "TestSettings")
assert isinstance(loaded_settings, DummySettingsWithDefault)
# The attributes should have their default values
assert loaded_settings.prop1.a == 5
assert loaded_settings.prop1.b == "default_b"
assert loaded_settings.prop1.c is False
assert loaded_settings.prop2 == "new_value"
# Tests for NestedSettingsManager
def test_nested_settings_manager_get_attribute(nested_settings_manager, manager, session):
# Setup initial settings
initial_settings = DummySettingsWithDefault(
prop1=DummyObjectWithDefault(10, "test_value", True),
prop2="initial_value"
)
manager.save(session, "TestSettings", initial_settings)
# Get attributes via NestedSettingsManager
assert nested_settings_manager.a == 10
assert nested_settings_manager.b == "test_value"
assert nested_settings_manager.c is True
def test_nested_settings_manager_set_attribute(nested_settings_manager, manager, session):
# Setup initial settings
initial_settings = DummySettingsWithDefault(
prop1=DummyObjectWithDefault(10, "test_value", True),
prop2="initial_value"
)
manager.save(session, "TestSettings", initial_settings)
# Set attribute via NestedSettingsManager
nested_settings_manager.a = 99
nested_settings_manager.b = "updated_nested_value"
nested_settings_manager.c = False
# Verify that the changes were saved to the database
loaded_settings = manager.load(session, "TestSettings")
assert loaded_settings.prop1.a == 99
assert loaded_settings.prop1.b == "updated_nested_value"
assert loaded_settings.prop1.c is False
# Also verify direct access works
assert nested_settings_manager.a == 99
assert nested_settings_manager.b == "updated_nested_value"
assert nested_settings_manager.c is False
def test_nested_settings_manager_attribute_error(nested_settings_manager):
# Test that accessing a non-existent attribute raises AttributeError
with pytest.raises(AttributeError) as excinfo:
nested_settings_manager.non_existent_attribute
assert "has no attribute 'non_existent_attribute'" in str(excinfo.value)
def test_nested_settings_manager_set_attribute_error(nested_settings_manager):
# Test that setting a non-existent attribute raises AttributeError
with pytest.raises(AttributeError) as excinfo:
nested_settings_manager.non_existent_attribute = "value"
assert "has no attribute 'non_existent_attribute'" in str(excinfo.value)
def test_nested_settings_manager_no_initialization(session, manager):
# Test initialization with default object
nested_db_manager = NestedSettingsManager(session, manager, "TestSettings", DummySettingsWithDefault, "prop1")
# Accessing an attribute will create a new entry with default values
assert nested_db_manager.a == 5
assert nested_db_manager.b == "default_b"
assert nested_db_manager.c is False
def test_nested_settings_manager_no_initialization_set(session, manager):
nested_db_manager = NestedSettingsManager(session, manager, "TestSettings", DummySettingsWithDefault, "prop1")
# Set attribute will create a new entry with the modified value
nested_db_manager.a = 42
# Verify that a default object was created and saved
loaded_settings = manager.load(session, "TestSettings")
assert isinstance(loaded_settings, DummySettingsWithDefault)
# The specified attribute should be updated, while others retain default values
assert loaded_settings.prop1.a == 42
assert loaded_settings.prop1.b == "default_b"
assert loaded_settings.prop1.c is False
assert loaded_settings.prop2 == "prop2"
def test_nested_settings_manager_invalid_nested_attribute(session, manager):
# Test with an invalid nested attribute
invalid_nested_manager = NestedSettingsManager(session, manager, "TestSettings", DummySettingsWithDefault,
"non_existent")
# Accessing any attribute should raise an AttributeError
with pytest.raises(AttributeError) as excinfo:
invalid_nested_manager.a
assert "has no attribute 'non_existent'" in str(excinfo.value)
def test_i_can_update_nested_settings(nested_settings_manager, session, manager):
new_values = {
"a": 10,
"b": "new_value",
"c": True,
}
nested_settings_manager.update(new_values)
# Verify that a default object was created and saved
loaded_settings = manager.load(session, "TestSettings")
assert isinstance(loaded_settings, DummySettingsWithDefault)
# The specified attribute should be updated, while others retain default values
assert loaded_settings.prop1.a == 10
assert loaded_settings.prop1.b == "new_value"
assert loaded_settings.prop1.c is True