Added Application HolidayViewer
This commit is contained in:
@@ -2,7 +2,7 @@ import dataclasses
|
||||
|
||||
import pytest
|
||||
|
||||
from core.settings_management import SettingsManager, MemoryDbEngine
|
||||
from core.settings_management import SettingsManager, MemoryDbEngine, GenericDbManager, NestedSettingsManager
|
||||
|
||||
FAKE_USER_ID = "FakeUserId"
|
||||
|
||||
@@ -20,6 +20,19 @@ class DummySettings:
|
||||
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())
|
||||
@@ -33,6 +46,16 @@ def settings():
|
||||
)
|
||||
|
||||
|
||||
@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)
|
||||
|
||||
@@ -86,3 +109,213 @@ def test_i_can_put_many_items_list(session, manager):
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user