Skip to content

Commit 1c8f58b

Browse files
committed
Update PowerDistributingActor tests to use MockMicrogrid
MockMicrogrid makes it easy to dynamically create component graph configurations to test with, rather than having to use manually written component graphs with the lower level MockMicrogridClient. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 691d6a5 commit 1c8f58b

File tree

3 files changed

+171
-110
lines changed

3 files changed

+171
-110
lines changed

tests/actor/test_battery_pool_status.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
BatteryStatus,
1515
)
1616
from frequenz.sdk.microgrid.component import ComponentCategory
17+
from tests.timeseries.mock_microgrid import MockMicrogrid
1718

1819
from ..utils.mock_microgrid_client import MockMicrogridClient
1920
from .test_battery_status import battery_data, component_graph, inverter_data
@@ -38,17 +39,21 @@ async def mock_microgrid(self, mocker: MockerFixture) -> MockMicrogridClient:
3839
microgrid.initialize(mocker)
3940
return microgrid
4041

41-
async def test_batteries_status(self, mock_microgrid: MockMicrogridClient) -> None:
42+
async def test_batteries_status(self, mocker: MockerFixture) -> None:
4243
"""Basic tests for BatteryPoolStatus.
4344
4445
BatteryStatusTracker is more tested in its own unit tests.
4546
4647
Args:
4748
mock_microgrid: mock microgrid client
4849
"""
50+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
51+
mock_microgrid.add_batteries(3)
52+
await mock_microgrid.start(mocker)
53+
4954
batteries = {
5055
battery.component_id
51-
for battery in mock_microgrid.component_graph.components(
56+
for battery in mock_microgrid.mock_client.component_graph.components(
5257
component_category={ComponentCategory.BATTERY}
5358
)
5459
}
@@ -67,22 +72,34 @@ async def test_batteries_status(self, mock_microgrid: MockMicrogridClient) -> No
6772

6873
batteries_list = list(batteries)
6974

70-
await mock_microgrid.send(battery_data(component_id=batteries_list[0]))
75+
await mock_microgrid.mock_client.send(
76+
battery_data(component_id=batteries_list[0])
77+
)
7178
await asyncio.sleep(0.1)
7279
assert batteries_status.get_working_batteries(batteries) == expected_working
7380

7481
expected_working.add(batteries_list[0])
75-
await mock_microgrid.send(inverter_data(component_id=batteries_list[0] - 1))
82+
await mock_microgrid.mock_client.send(
83+
inverter_data(component_id=batteries_list[0] - 1)
84+
)
7685
await asyncio.sleep(0.1)
7786
assert batteries_status.get_working_batteries(batteries) == expected_working
7887
msg = await asyncio.wait_for(battery_status_recv.receive(), timeout=0.2)
7988
assert msg == batteries_status._current_status
8089

81-
await mock_microgrid.send(inverter_data(component_id=batteries_list[1] - 1))
82-
await mock_microgrid.send(battery_data(component_id=batteries_list[1]))
90+
await mock_microgrid.mock_client.send(
91+
inverter_data(component_id=batteries_list[1] - 1)
92+
)
93+
await mock_microgrid.mock_client.send(
94+
battery_data(component_id=batteries_list[1])
95+
)
8396

84-
await mock_microgrid.send(inverter_data(component_id=batteries_list[2] - 1))
85-
await mock_microgrid.send(battery_data(component_id=batteries_list[2]))
97+
await mock_microgrid.mock_client.send(
98+
inverter_data(component_id=batteries_list[2] - 1)
99+
)
100+
await mock_microgrid.mock_client.send(
101+
battery_data(component_id=batteries_list[2])
102+
)
86103

87104
expected_working = set(batteries_list)
88105
await asyncio.sleep(0.1)
@@ -91,15 +108,15 @@ async def test_batteries_status(self, mock_microgrid: MockMicrogridClient) -> No
91108
assert msg == batteries_status._current_status
92109

93110
await batteries_status.update_status(
94-
succeed_batteries={106}, failed_batteries={206, 306}
111+
succeed_batteries={9}, failed_batteries={19, 29}
95112
)
96113
await asyncio.sleep(0.1)
97-
assert batteries_status.get_working_batteries(batteries) == {106}
114+
assert batteries_status.get_working_batteries(batteries) == {9}
98115

99116
await batteries_status.update_status(
100-
succeed_batteries={106, 206}, failed_batteries=set()
117+
succeed_batteries={9, 19}, failed_batteries=set()
101118
)
102119
await asyncio.sleep(0.1)
103-
assert batteries_status.get_working_batteries(batteries) == {106, 206}
120+
assert batteries_status.get_working_batteries(batteries) == {9, 19}
104121

105122
await batteries_status.stop()

tests/actor/test_battery_status.py

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
ComponentCategory,
3434
InverterData,
3535
)
36+
from tests.timeseries.mock_microgrid import MockMicrogrid
3637

3738
from ..utils.component_data_wrapper import BatteryDataWrapper, InverterDataWrapper
3839
from ..utils.mock_microgrid_client import MockMicrogridClient
@@ -154,8 +155,8 @@ class Message(Generic[T]):
154155
inner: T
155156

156157

157-
BATTERY_ID = 106
158-
INVERTER_ID = 105
158+
BATTERY_ID = 9
159+
INVERTER_ID = 8
159160

160161

161162
# pylint: disable=protected-access, unused-argument
@@ -179,7 +180,7 @@ async def mock_microgrid(self, mocker: MockerFixture) -> MockMicrogridClient:
179180

180181
@time_machine.travel("2022-01-01 00:00 UTC", tick=False)
181182
async def test_sync_update_status_with_messages(
182-
self, mock_microgrid: MockMicrogridClient
183+
self, mocker: MockerFixture
183184
) -> None:
184185
"""Test if messages changes battery status/
185186
@@ -189,6 +190,10 @@ async def test_sync_update_status_with_messages(
189190
Args:
190191
mock_microgrid: mock_microgrid fixture
191192
"""
193+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
194+
mock_microgrid.add_batteries(3)
195+
await mock_microgrid.start(mocker)
196+
192197
status_channel = Broadcast[Status]("battery_status")
193198
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
194199

@@ -336,10 +341,9 @@ async def test_sync_update_status_with_messages(
336341
assert tracker._get_new_status_if_changed() is Status.NOT_WORKING
337342

338343
await tracker.stop()
344+
await mock_microgrid.cleanup()
339345

340-
async def test_sync_blocking_feature(
341-
self, mock_microgrid: MockMicrogridClient
342-
) -> None:
346+
async def test_sync_blocking_feature(self, mocker: MockerFixture) -> None:
343347
"""Test if status changes when SetPowerResult message is received.
344348
345349
Tests uses FakeSelect to test status in sync way.
@@ -348,6 +352,9 @@ async def test_sync_blocking_feature(
348352
Args:
349353
mock_microgrid: mock_microgrid fixture
350354
"""
355+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
356+
mock_microgrid.add_batteries(3)
357+
await mock_microgrid.start(mocker)
351358

352359
status_channel = Broadcast[Status]("battery_status")
353360
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
@@ -444,14 +451,15 @@ async def test_sync_blocking_feature(
444451

445452
# If battery succeed, then it should unblock.
446453
tracker._handle_status_set_power_result(
447-
SetPowerResult(succeed={BATTERY_ID}, failed={206})
454+
SetPowerResult(succeed={BATTERY_ID}, failed={19})
448455
)
449456
assert tracker._get_new_status_if_changed() is Status.WORKING
450457

451458
await tracker.stop()
459+
await mock_microgrid.cleanup()
452460

453461
async def test_sync_blocking_interrupted_with_with_max_data(
454-
self, mock_microgrid: MockMicrogridClient
462+
self, mocker: MockerFixture
455463
) -> None:
456464
"""Test if status changes when SetPowerResult message is received.
457465
@@ -461,6 +469,9 @@ async def test_sync_blocking_interrupted_with_with_max_data(
461469
Args:
462470
mock_microgrid: mock_microgrid fixture
463471
"""
472+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
473+
mock_microgrid.add_batteries(3)
474+
await mock_microgrid.start(mocker)
464475

465476
status_channel = Broadcast[Status]("battery_status")
466477
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
@@ -498,7 +509,7 @@ async def test_sync_blocking_interrupted_with_with_max_data(
498509

499510
@time_machine.travel("2022-01-01 00:00 UTC", tick=False)
500511
async def test_sync_blocking_interrupted_with_invalid_message(
501-
self, mock_microgrid: MockMicrogridClient
512+
self, mocker: MockerFixture
502513
) -> None:
503514
"""Test if status changes when SetPowerResult message is received.
504515
@@ -508,6 +519,9 @@ async def test_sync_blocking_interrupted_with_invalid_message(
508519
Args:
509520
mock_microgrid: mock_microgrid fixture
510521
"""
522+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
523+
mock_microgrid.add_batteries(3)
524+
await mock_microgrid.start(mocker)
511525

512526
status_channel = Broadcast[Status]("battery_status")
513527
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
@@ -555,9 +569,7 @@ async def test_sync_blocking_interrupted_with_invalid_message(
555569
await tracker.stop()
556570

557571
@time_machine.travel("2022-01-01 00:00 UTC", tick=False)
558-
async def test_timers(
559-
self, mock_microgrid: MockMicrogridClient, mocker: MockerFixture
560-
) -> None:
572+
async def test_timers(self, mocker: MockerFixture) -> None:
561573
"""Test if messages changes battery status/
562574
563575
Tests uses FakeSelect to test status in sync way.
@@ -567,6 +579,10 @@ async def test_timers(
567579
mock_microgrid: mock_microgrid fixture
568580
mocker: pytest mocker instance
569581
"""
582+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
583+
mock_microgrid.add_batteries(3)
584+
await mock_microgrid.start(mocker)
585+
570586
status_channel = Broadcast[Status]("battery_status")
571587
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
572588

@@ -616,16 +632,18 @@ async def test_timers(
616632

617633
assert inverter_timer_spy.call_count == 2
618634
await tracker.stop()
635+
await mock_microgrid.cleanup()
619636

620637
@time_machine.travel("2022-01-01 00:00 UTC", tick=False)
621-
async def test_async_battery_status(
622-
self, mock_microgrid: MockMicrogridClient
623-
) -> None:
638+
async def test_async_battery_status(self, mocker: MockerFixture) -> None:
624639
"""Test if status changes.
625640
626641
Args:
627642
mock_microgrid: mock_microgrid fixture
628643
"""
644+
mock_microgrid = MockMicrogrid(grid_side_meter=True)
645+
mock_microgrid.add_batteries(3)
646+
await mock_microgrid.start(mocker)
629647

630648
status_channel = Broadcast[Status]("battery_status")
631649
set_power_result_channel = Broadcast[SetPowerResult]("set_power_result")
@@ -643,8 +661,10 @@ async def test_async_battery_status(
643661
await asyncio.sleep(0.01)
644662

645663
with time_machine.travel("2022-01-01 00:00 UTC", tick=False) as time:
646-
await mock_microgrid.send(inverter_data(component_id=INVERTER_ID))
647-
await mock_microgrid.send(battery_data(component_id=BATTERY_ID))
664+
await mock_microgrid.mock_client.send(
665+
inverter_data(component_id=INVERTER_ID)
666+
)
667+
await mock_microgrid.mock_client.send(battery_data(component_id=BATTERY_ID))
648668
status = await asyncio.wait_for(status_receiver.receive(), timeout=0.1)
649669
assert status is Status.WORKING
650670

@@ -656,11 +676,11 @@ async def test_async_battery_status(
656676

657677
time.shift(2)
658678

659-
await mock_microgrid.send(battery_data(component_id=BATTERY_ID))
679+
await mock_microgrid.mock_client.send(battery_data(component_id=BATTERY_ID))
660680
status = await asyncio.wait_for(status_receiver.receive(), timeout=0.1)
661681
assert status is Status.WORKING
662682

663-
await mock_microgrid.send(
683+
await mock_microgrid.mock_client.send(
664684
inverter_data(
665685
component_id=INVERTER_ID,
666686
timestamp=datetime.now(tz=timezone.utc) - timedelta(seconds=7),
@@ -675,8 +695,11 @@ async def test_async_battery_status(
675695
await asyncio.sleep(0.3)
676696
assert len(status_receiver) == 0
677697

678-
await mock_microgrid.send(inverter_data(component_id=INVERTER_ID))
698+
await mock_microgrid.mock_client.send(
699+
inverter_data(component_id=INVERTER_ID)
700+
)
679701
status = await asyncio.wait_for(status_receiver.receive(), timeout=0.1)
680702
assert status is Status.WORKING
681703

682704
await tracker.stop()
705+
await mock_microgrid.cleanup()

0 commit comments

Comments
 (0)