322 lines
10 KiB
Python
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
|