from unittest.mock import MagicMock import pytest from core.settings_management import SettingsManager, DummyDbEngine from core.settings_objects import BudgetTrackerSettings, BudgetTrackerMappings, BUDGET_TRACKER_MAPPINGS_ENTRY FAKE_USER_ID = "FakeUserId" @pytest.fixture() def manager(): return SettingsManager(DummyDbEngine("settings_from_unit_testing.json")) 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 mock_db_engine(): """Fixture to mock the _db_engine instance.""" return MagicMock() @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_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_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"