import shutil from dataclasses import dataclass import pytest from myfasthtml.core.dbmanager import DbManager, DbObject @pytest.fixture(scope="session") def session(): return { "user_info": { "id": "test_tenant_id", "email": "test@email.com", "username": "test user", "role": [], } } @pytest.fixture def db_manager(session): shutil.rmtree("TestDb", ignore_errors=True) db_manager_instance = DbManager(session, root="TestDb", auto_register=False) yield db_manager_instance shutil.rmtree("TestDb", ignore_errors=True) def simplify(res: dict) -> dict: return {k: v for k, v in res.items() if not k.startswith("_")} def test_i_can_init(session, db_manager): @dataclass class DummyObject(DbObject): def __init__(self, sess: dict): super().__init__(sess, "DummyObject", db_manager) value: str = "hello" number: int = 42 DummyObject(session) assert simplify(db_manager.load("DummyObject")) == {"value": "hello", "number": 42} def test_i_can_init_from_db(session, db_manager): @dataclass class DummyObject(DbObject): def __init__(self, sess: dict): super().__init__(sess, "DummyObject", db_manager) value: str = "hello" number: int = 42 # insert other values in db db_manager.save("DummyObject", {"value": "other_value", "number": 34}) dummy = DummyObject(session) assert dummy.value == "other_value" assert dummy.number == 34 def test_db_is_updated_when_attribute_is_modified(session, db_manager): @dataclass class DummyObject(DbObject): def __init__(self, sess: dict): super().__init__(sess, "DummyObject", db_manager) value: str = "hello" number: int = 42 dummy = DummyObject(session) dummy.value = "other_value" assert simplify(db_manager.load("DummyObject")) == {"value": "other_value", "number": 42} def test_i_do_not_save_in_db_when_value_is_the_same(session, db_manager): @dataclass class DummyObject(DbObject): def __init__(self, sess: dict): super().__init__(sess, "DummyObject", db_manager) value: str = "hello" number: int = 42 dummy = DummyObject(session) dummy.value = "other_value" in_db_1 = db_manager.load("DummyObject") dummy.value = "other_value" in_db_2 = db_manager.load("DummyObject") assert in_db_1["__parent__"] == in_db_2["__parent__"]