Skip to content

Commit ace425a

Browse files
committed
Use time-machine to mock passage of time in EV control tests
The PowerDistributor increases EV power only after a certain interval has passed. This change allows us to mock the passage of time, rather than waiting for the clock to move in real time. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 1a670a8 commit ace425a

File tree

1 file changed

+9
-27
lines changed

1 file changed

+9
-27
lines changed

tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,14 @@
1010

1111
import async_solipsism
1212
import pytest
13+
import time_machine
1314
from frequenz.channels import Receiver
1415
from frequenz.client.microgrid import EVChargerCableState, EVChargerComponentState
1516
from pytest_mock import MockerFixture
1617

1718
from frequenz.sdk import microgrid
1819
from frequenz.sdk.actor import ResamplerConfig, power_distributing
19-
from frequenz.sdk.actor.power_distributing import (
20-
ComponentPoolStatus,
21-
PowerDistributingActor,
22-
)
23-
from frequenz.sdk.actor.power_distributing._component_managers import EVChargerManager
24-
from frequenz.sdk.actor.power_distributing._component_managers._ev_charger_manager._config import (
25-
EVDistributionConfig,
26-
)
20+
from frequenz.sdk.actor.power_distributing import ComponentPoolStatus
2721
from frequenz.sdk.actor.power_distributing._component_pool_status_tracker import (
2822
ComponentPoolStatusTracker,
2923
)
@@ -107,24 +101,6 @@ async def _patch_power_distributing_actor(
107101
self,
108102
mocker: MockerFixture,
109103
) -> None:
110-
dp = typing.cast(_DataPipeline, microgrid._data_pipeline._DATA_PIPELINE)
111-
pda = typing.cast(
112-
PowerDistributingActor, dp._ev_power_wrapper._power_distributing_actor
113-
)
114-
cm = typing.cast(
115-
EVChargerManager,
116-
pda._component_manager,
117-
)
118-
mocker.patch(
119-
"frequenz.sdk.microgrid._data_pipeline._DATA_PIPELINE._ev_power_wrapper"
120-
"._power_distributing_actor._component_manager._config",
121-
EVDistributionConfig(
122-
component_ids=cm._config.component_ids,
123-
initial_current=cm._config.initial_current,
124-
min_current=cm._config.min_current,
125-
increase_power_interval=timedelta(seconds=0.12),
126-
),
127-
)
128104
mocker.patch(
129105
"frequenz.sdk.microgrid._data_pipeline._DATA_PIPELINE._ev_power_wrapper"
130106
"._power_distributing_actor._component_manager._voltage_cache.get",
@@ -209,10 +185,12 @@ async def test_setting_power(
209185
mocker: MockerFixture,
210186
) -> None:
211187
"""Test setting power."""
188+
traveller = time_machine.travel(datetime(2012, 12, 12))
189+
mock_time = traveller.start()
190+
212191
set_power = typing.cast(
213192
AsyncMock, microgrid.connection_manager.get().api_client.set_power
214193
)
215-
216194
await self._init_ev_chargers(mocks)
217195
ev_charger_pool = microgrid.new_ev_charger_pool(priority=5)
218196
await self._patch_ev_pool_status(mocks, mocker)
@@ -235,6 +213,7 @@ async def test_setting_power(
235213
self._assert_report(
236214
await bounds_rx.receive(), power=40000.0, lower=0.0, upper=44160.0
237215
)
216+
mock_time.shift(timedelta(seconds=60))
238217
await asyncio.sleep(0.15)
239218

240219
# Components are set initial power
@@ -244,6 +223,7 @@ async def test_setting_power(
244223
# All available power is allocated. 3 chargers are set to 11040.0
245224
# and the last one is set to 6880.0
246225
set_power.reset_mock()
226+
mock_time.shift(timedelta(seconds=60))
247227
await asyncio.sleep(0.15)
248228
assert set_power.call_count == 4
249229

@@ -262,3 +242,5 @@ async def test_setting_power(
262242
stopped_evs = [x.args for x in set_power.call_args_list if x.args[1] == 0.0]
263243
assert 1 == len(stopped_evs)
264244
assert stopped_evs[0][0] in [evc[0] for evc in evs_11040]
245+
246+
traveller.stop()

0 commit comments

Comments
 (0)