From d00935e6974c83f266ebfed9363376c8a6e52984 Mon Sep 17 00:00:00 2001 From: Julian Pawlowski <75446+jpawlowski@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:07:16 +0000 Subject: [PATCH] fix(tests): remove unused mock_config_entry and update price_avg to base currency in percentage calculations --- tests/test_midnight_turnover.py | 2 -- tests/test_percentage_calculations.py | 52 ++++++++++----------------- tests/test_user_data_validation.py | 27 ++++++++++++-- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/tests/test_midnight_turnover.py b/tests/test_midnight_turnover.py index c978e8d..c43b8b3 100644 --- a/tests/test_midnight_turnover.py +++ b/tests/test_midnight_turnover.py @@ -104,7 +104,6 @@ def test_midnight_crossing_period_consistency(period_config: TibberPricesPeriodC all_prices_before, config=period_config, time=time_service_before, - config_entry=mock_config_entry, ) periods_before = result_before["periods"] @@ -131,7 +130,6 @@ def test_midnight_crossing_period_consistency(period_config: TibberPricesPeriodC all_prices_after, config=period_config, time=time_service_after, - config_entry=mock_config_entry, ) periods_after = result_after["periods"] diff --git a/tests/test_percentage_calculations.py b/tests/test_percentage_calculations.py index 5cbb685..f512382 100644 --- a/tests/test_percentage_calculations.py +++ b/tests/test_percentage_calculations.py @@ -1,7 +1,6 @@ """Test Bug #9, #10, #11: Percentage calculations with negative prices use abs() correctly.""" from datetime import UTC, datetime -from unittest.mock import Mock import pytest @@ -39,19 +38,14 @@ def test_bug9_period_price_diff_negative_reference(price_context_negative: dict) Now: Uses abs(ref_price) → correct percentage direction """ start_time = datetime(2025, 11, 22, 12, 0, tzinfo=UTC) - price_avg = -10.0 # Period average in minor units (ct) + price_avg = -0.10 # Period average in base currency (EUR) = -10 ct - mock_config_entry = Mock() - mock_config_entry.options.get.return_value = "minor" # Default display mode + period_diff, period_diff_pct = calculate_period_price_diff(price_avg, start_time, price_context_negative) - period_diff, period_diff_pct = calculate_period_price_diff( - price_avg, start_time, price_context_negative, mock_config_entry - ) - - # Reference price: -20 ct - # Difference: -10 - (-20) = 10 ct (period is 10 ct MORE EXPENSIVE than reference) - # Percentage: 10 / abs(-20) * 100 = +50% (correctly shows increase) - assert period_diff == 10.0, "Difference should be +10 ct" + # Reference price: -0.20 EUR (-20 ct) + # Difference: -0.10 - (-0.20) = 0.10 EUR (period is 10 ct MORE EXPENSIVE than reference) + # Percentage: 0.10 / abs(-0.20) * 100 = +50% (correctly shows increase) + assert period_diff == 0.10, "Difference should be +0.10 EUR (+10 ct)" assert period_diff_pct == 50.0, "Percentage should be +50% (more expensive than ref)" @@ -63,19 +57,14 @@ def test_bug9_period_price_diff_more_negative_than_reference(price_context_negat the percentage correctly shows negative (cheaper). """ start_time = datetime(2025, 11, 22, 12, 0, tzinfo=UTC) - price_avg = -25.0 # More negative (cheaper) than reference -20 ct + price_avg = -0.25 # More negative (cheaper) than reference: -0.25 EUR = -25 ct - mock_config_entry = Mock() - mock_config_entry.options.get.return_value = "minor" # Default display mode + period_diff, period_diff_pct = calculate_period_price_diff(price_avg, start_time, price_context_negative) - period_diff, period_diff_pct = calculate_period_price_diff( - price_avg, start_time, price_context_negative, mock_config_entry - ) - - # Reference: -20 ct - # Difference: -25 - (-20) = -5 ct (period is 5 ct CHEAPER) - # Percentage: -5 / abs(-20) * 100 = -25% (correctly shows decrease) - assert period_diff == -5.0, "Difference should be -5 ct" + # Reference: -0.20 EUR (-20 ct) + # Difference: -0.25 - (-0.20) = -0.05 EUR (period is 5 ct CHEAPER) + # Percentage: -0.05 / abs(-0.20) * 100 = -25% (correctly shows decrease) + assert period_diff == -0.05, "Difference should be -0.05 EUR (-5 ct)" assert period_diff_pct == -25.0, "Percentage should be -25% (cheaper than ref)" @@ -86,19 +75,14 @@ def test_bug9_period_price_diff_positive_reference(price_context_positive: dict) Verifies that abs() doesn't break normal positive price calculations. """ start_time = datetime(2025, 11, 22, 12, 0, tzinfo=UTC) - price_avg = 30.0 # ct + price_avg = 0.30 # Period average in base currency (EUR) = 30 ct - mock_config_entry = Mock() - mock_config_entry.options.get.return_value = "minor" # Default display mode + period_diff, period_diff_pct = calculate_period_price_diff(price_avg, start_time, price_context_positive) - period_diff, period_diff_pct = calculate_period_price_diff( - price_avg, start_time, price_context_positive, mock_config_entry - ) - - # Reference: 20 ct - # Difference: 30 - 20 = 10 ct - # Percentage: 10 / 20 * 100 = +50% - assert period_diff == 10.0, "Difference should be +10 ct" + # Reference: 0.20 EUR (20 ct) + # Difference: 0.30 - 0.20 = 0.10 EUR (10 ct) + # Percentage: 0.10 / 0.20 * 100 = +50% + assert period_diff == 0.10, "Difference should be +0.10 EUR (+10 ct)" assert period_diff_pct == 50.0, "Percentage should be +50%" diff --git a/tests/test_user_data_validation.py b/tests/test_user_data_validation.py index ce0363d..439f08e 100644 --- a/tests/test_user_data_validation.py +++ b/tests/test_user_data_validation.py @@ -18,7 +18,9 @@ The fix implements data validation that: - Raises exception if currency cannot be determined (no silent EUR fallback) """ -from datetime import timedelta +from datetime import datetime, timedelta +from unittest.mock import Mock +from zoneinfo import ZoneInfo import pytest @@ -29,6 +31,27 @@ from custom_components.tibber_prices.coordinator.data_fetching import ( ) +@pytest.fixture +def mock_api_client() -> Mock: + """Create a mock API client.""" + return Mock() + + +@pytest.fixture +def mock_time_service() -> Mock: + """Create a mock time service.""" + time_service = Mock() + time_service.now.return_value = datetime(2025, 11, 22, 12, 0, 0, tzinfo=ZoneInfo("Europe/Berlin")) + time_service.as_local.side_effect = lambda dt: dt + return time_service + + +@pytest.fixture +def mock_store() -> Mock: + """Create a mock store.""" + return Mock() + + @pytest.mark.unit def test_validate_user_data_complete(mock_api_client, mock_time_service, mock_store) -> None: # noqa: ANN001 """Test that complete user data passes validation.""" @@ -143,7 +166,7 @@ def test_validate_user_data_subscription_without_currency(mock_api_client, mock_ "timeZone": "Europe/Berlin", "currentSubscription": { "priceInfo": { - "current": {} # Currency missing! + "current": {"currency": None} # Currency explicitly None } }, }