I can add tables

Refactoring DbEngine

Fixing unit tests

Fixing unit tests

Fixing unit tests

Refactored DbManager for datagrid

Improving front end performance

I can add new table

Fixed sidebar closing when clicking on it

Fix drag event rebinding, improve listener options, and add debug

Prevent duplicate drag event bindings with a dataset flag and ensure consistent scrollbar functionality. Change wheel event listener to passive mode for better performance. Refactor function naming for consistency, and add debug logs for event handling.

Refactor Datagrid bindings and default state handling.

Updated Javascript to conditionally rebind Datagrid on specific events. Improved Python components by handling empty DataFrame cases and removing redundant code. Revised default state initialization in settings for better handling of mutable fields.

Added Rowindex visualisation support

Working on Debugger with own implementation of JsonViewer

Working on JsonViewer.py

Fixed unit tests

Adding unit tests

I can fold and unfold

fixed unit tests

Adding css for debugger

Added tooltip management

Adding debugger functionalities

Refactor serializers and improve error handling in DB engine

Fixed error where tables were overwritten

I can display footer menu

Working on footer. Refactoring how heights are managed

Refactored scrollbars management

Working on footer menu

I can display footer menu + fixed unit tests

Fixed unit tests

Updated click management

I can display aggregations in footers

Added docker management

Refactor input handling and improve config defaults

Fixed scrollbars colors

Refactored tooltip management

Improved tooltip management

Improving FilterAll
This commit is contained in:
2025-05-11 18:27:32 +02:00
parent e1c10183eb
commit 66ea45f501
70 changed files with 2884 additions and 1258 deletions

View File

@@ -1,116 +1,88 @@
from unittest.mock import MagicMock
import dataclasses
import pytest
from core.settings_management import SettingsManager, DummyDbEngine
from core.settings_objects import BudgetTrackerSettings, BudgetTrackerMappings, BUDGET_TRACKER_MAPPINGS_ENTRY
from core.settings_management import SettingsManager, MemoryDbEngine
FAKE_USER_ID = "FakeUserId"
@dataclasses.dataclass
class DummyObject:
a: int
b: str
c: bool
@dataclasses.dataclass
class DummySettings:
prop1: DummyObject
prop2: str
@pytest.fixture()
def manager():
return SettingsManager(DummyDbEngine("settings_from_unit_testing.json"))
return SettingsManager(MemoryDbEngine())
def test_i_can_save_and_load_settings(manager):
settings = BudgetTrackerSettings()
manager.save(FAKE_USER_ID, "MyEntry", settings)
from_db = manager.load(FAKE_USER_ID, "MyEntry")
assert isinstance(from_db, BudgetTrackerSettings)
assert from_db.spread_sheet == settings.spread_sheet
assert from_db.col_row_num == settings.col_row_num
assert from_db.col_project == settings.col_project
assert from_db.col_owner == settings.col_owner
assert from_db.col_capex == settings.col_capex
assert from_db.col_details == settings.col_details
assert from_db.col_supplier == settings.col_supplier
assert from_db.col_budget_amt == settings.col_budget_amt
assert from_db.col_actual_amt == settings.col_actual_amt
assert from_db.col_forecast5_7_amt == settings.col_forecast5_7_amt
@pytest.fixture()
def settings():
return DummySettings(
prop1=DummyObject(1, "2", True),
prop2="prop2_new",
)
@pytest.fixture
def mock_db_engine():
"""Fixture to mock the _db_engine instance."""
return MagicMock()
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"
@pytest.fixture
def settings_manager(mock_db_engine):
"""Fixture to provide an instance of SettingsManager with a mocked db engine."""
return SettingsManager(engine=mock_db_engine)
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_get_successful(settings_manager, mock_db_engine):
"""Test successful retrieval of a value."""
# Arrange
session = {"user_id": "user123", "user_email": "user@example.com"}
mock_db_engine.get.return_value = "mock_value"
# Act
result = settings_manager.get(session=session, key="theme")
# Assert
assert result == "mock_value"
mock_db_engine.get.assert_called_once_with("user@example.com", "user123", "theme")
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_get_key_error_no_default(settings_manager, mock_db_engine):
"""Test KeyError is raised if key doesn't exist and default is NoDefault."""
# Arrange
session = {"user_id": "user123", "user_email": "user@example.com"}
mock_db_engine.get.side_effect = KeyError # Simulate missing key
# Act & Assert
with pytest.raises(KeyError):
settings_manager.get(session=session, key="theme")
def test_get_key_error_with_default(settings_manager, mock_db_engine):
"""Test default value is returned if key doesn't exist and default is provided."""
# Arrange
session = {"user_id": "user123", "user_email": "user@example.com"}
mock_db_engine.get.side_effect = KeyError # Simulate missing key
# Act
result = settings_manager.get(session=session, key="theme", default="default_value")
# Assert
assert result == "default_value"
mock_db_engine.get.assert_called_once_with("user@example.com", "user123", "theme")
def test_get_key_none(settings_manager, mock_db_engine):
"""Test behavior when key is None."""
# Arrange
session = {"user_id": "user123", "user_email": "user@example.com"}
mock_db_engine.get.return_value = {"example_key": "example_value"}
# Act
result = settings_manager.get(session=session, key=None)
# Assert
assert result == {"example_key": "example_value"}
mock_db_engine.get.assert_called_once_with("user@example.com", "user123", None)
#
# def test_i_can_save_and_load_mapping_settings(manager):
# """
# I test 'BudgetTrackerMappings' because there is an object inside an object
# :param manager:
# :return:
# """
# settings = BudgetTrackerMappings(mappings=[
# BudgetTrackerMappings.Mapping(1, "p1", "o1", "d1", "s1", "l1_1", "l2_1", "l3_1", 0),
# BudgetTrackerMappings.Mapping(1, "p2", "o2", "d2", "s2", "l1_2", "l2_2", "l3_2", 10)])
#
# manager.save(FAKE_USER_ID, BUDGET_TRACKER_MAPPINGS_ENTRY, settings)
# from_db = manager.load(FAKE_USER_ID, BUDGET_TRACKER_MAPPINGS_ENTRY)
#
# assert isinstance(from_db, BudgetTrackerMappings)
# assert len(from_db.mappings) == 2
# assert isinstance(from_db.mappings[0], BudgetTrackerMappings.Mapping)
# assert from_db.mappings[0].col_project == "p1"
# assert from_db.mappings[1].col_project == "p2"
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'