From 0c591b2fa0650793c5f94818d4560a4d8e01c0cc Mon Sep 17 00:00:00 2001 From: Normann Date: Sat, 12 Oct 2024 12:58:18 +0200 Subject: [PATCH] increased test coverage --- tests/test_class_inverter.py | 145 +++++++++++++++++++++++++++++++---- 1 file changed, 130 insertions(+), 15 deletions(-) diff --git a/tests/test_class_inverter.py b/tests/test_class_inverter.py index 6b73527..e4dc1f5 100644 --- a/tests/test_class_inverter.py +++ b/tests/test_class_inverter.py @@ -19,10 +19,8 @@ def inverter(mock_battery): def test_process_energy_excess_generation(inverter, mock_battery): - mock_battery.energie_laden.return_value = ( - 100.0, - 10.0, - ) # Battery charges 100 Wh with 10 Wh loss + # Battery charges 100 Wh with 10 Wh loss + mock_battery.energie_laden.return_value = (100.0, 10.0) generation = 600.0 # 600 Wh of generation consumption = 200.0 # 200 Wh of consumption hour = 12 @@ -31,11 +29,10 @@ def test_process_energy_excess_generation(inverter, mock_battery): generation, consumption, hour ) - # Use pytest.approx for floating point comparison to allow for minor rounding differences - assert grid_feed_in == pytest.approx(290.0, rel=1e-2) # Approximately 290 Wh feed-in - assert grid_draw == 0.0 - assert losses == 10.0 - assert self_consumption == 200.0 + assert grid_feed_in == pytest.approx(290.0, rel=1e-2) # 290 Wh feed-in after battery charges + assert grid_draw == 0.0 # No grid draw + assert losses == 10.0 # Battery charging losses + assert self_consumption == 200.0 # All consumption is met mock_battery.energie_laden.assert_called_once_with(400.0, hour) @@ -48,11 +45,129 @@ def test_process_energy_generation_equals_consumption(inverter, mock_battery): generation, consumption, hour ) - # Use pytest.approx for approximate comparison - assert grid_feed_in == 0.0 - assert grid_draw == 0.0 - assert losses == 0.0 - assert self_consumption == 300.0 + assert grid_feed_in == 0.0 # No feed-in as generation equals consumption + assert grid_draw == 0.0 # No grid draw + assert losses == 0.0 # No losses + assert self_consumption == 300.0 # All consumption is met with generation - # Allow for a possible call with zero energy, since the method is invoked even when no energy is available for charging mock_battery.energie_laden.assert_called_once_with(0.0, hour) + + +def test_process_energy_battery_discharges(inverter, mock_battery): + # Battery discharges 100 Wh with 10 Wh loss already accounted for in the discharge + mock_battery.energie_abgeben.return_value = (100.0, 10.0) + generation = 100.0 + consumption = 250.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == 0.0 # No feed-in as generation is insufficient + assert grid_draw == pytest.approx( + 50.0, rel=1e-2 + ) # Grid supplies remaining shortfall after battery discharge + assert losses == 10.0 # Discharge losses + assert self_consumption == 200.0 # Generation + battery discharge + mock_battery.energie_abgeben.assert_called_once_with(150.0, hour) + + +def test_process_energy_battery_empty(inverter, mock_battery): + # Battery is empty, so no energy can be discharged + mock_battery.energie_abgeben.return_value = (0.0, 0.0) + generation = 100.0 + consumption = 300.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == 0.0 # No feed-in as generation is insufficient + assert grid_draw == pytest.approx(200.0, rel=1e-2) # Grid has to cover the full shortfall + assert losses == 0.0 # No losses as the battery didn't discharge + assert self_consumption == 100.0 # Only generation is consumed + mock_battery.energie_abgeben.assert_called_once_with(200.0, hour) + + +def test_process_energy_battery_full_at_start(inverter, mock_battery): + # Battery is full, so no charging happens + mock_battery.energie_laden.return_value = (0.0, 0.0) + generation = 500.0 + consumption = 200.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == pytest.approx( + 300.0, rel=1e-2 + ) # All excess energy should be fed into the grid + assert grid_draw == 0.0 # No grid draw + assert losses == 0.0 # No losses + assert self_consumption == 200.0 # Only consumption is met + mock_battery.energie_laden.assert_called_once_with(300.0, hour) + + +def test_process_energy_insufficient_generation_no_battery(inverter, mock_battery): + # Insufficient generation and no battery discharge + mock_battery.energie_abgeben.return_value = (0.0, 0.0) + generation = 100.0 + consumption = 500.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == 0.0 # No feed-in as generation is insufficient + assert grid_draw == pytest.approx(400.0, rel=1e-2) # Grid supplies the shortfall + assert losses == 0.0 # No losses + assert self_consumption == 100.0 # Only generation is consumed + mock_battery.energie_abgeben.assert_called_once_with(400.0, hour) + + +def test_process_energy_insufficient_generation_battery_assists(inverter, mock_battery): + # Battery assists with some discharge to cover the shortfall + mock_battery.energie_abgeben.return_value = ( + 50.0, + 5.0, + ) # Battery discharges 50 Wh with 5 Wh loss + generation = 200.0 + consumption = 400.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == 0.0 # No feed-in as generation is insufficient + assert grid_draw == pytest.approx( + 150.0, rel=1e-2 + ) # Grid supplies the remaining shortfall after battery discharge + assert losses == 5.0 # Discharge losses + assert self_consumption == 250.0 # Generation + battery discharge + mock_battery.energie_abgeben.assert_called_once_with(200.0, hour) + + +def test_process_energy_zero_generation(inverter, mock_battery): + # Zero generation, full reliance on battery and grid + mock_battery.energie_abgeben.return_value = ( + 100.0, + 5.0, + ) # Battery discharges 100 Wh with 5 Wh loss + generation = 0.0 + consumption = 300.0 + hour = 12 + + grid_feed_in, grid_draw, losses, self_consumption = inverter.process_energy( + generation, consumption, hour + ) + + assert grid_feed_in == 0.0 # No feed-in as there is zero generation + assert grid_draw == pytest.approx(200.0, rel=1e-2) # Grid supplies the remaining shortfall + assert losses == 5.0 # Discharge losses + assert self_consumption == 100.0 # Only battery discharge is consumed + mock_battery.energie_abgeben.assert_called_once_with(300.0, hour)