Skip to content

Commit 0927931

Browse files
committed
Improve finalization of logical meter tests
Use the `MockMicrogrid` as a context manager and an async exit stack so all used components get automatically finalized. Before no finalization was done in the tests. This commit can be reviewed much more easily hiding differences in spaces (with `diff -w`, or appending `?w=1` to the GitHub URL). Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 60fd837 commit 0927931

File tree

1 file changed

+108
-78
lines changed

1 file changed

+108
-78
lines changed

tests/timeseries/test_logical_meter.py

Lines changed: 108 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
"""Tests for the logical meter."""
55

66

7+
from contextlib import AsyncExitStack
8+
79
from pytest_mock import MockerFixture
810

911
from frequenz.sdk import microgrid
@@ -20,157 +22,185 @@ class TestLogicalMeter: # pylint: disable=too-many-public-methods
2022

2123
async def test_chp_power(self, mocker: MockerFixture) -> None:
2224
"""Test the chp power formula."""
23-
mockgrid = MockMicrogrid(grid_meter=False)
25+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
2426
mockgrid.add_chps(1)
2527
mockgrid.add_batteries(2)
26-
await mockgrid.start(mocker)
2728

28-
logical_meter = microgrid.logical_meter()
29-
chp_power_receiver = logical_meter.chp_power.new_receiver()
29+
async with mockgrid, AsyncExitStack() as stack:
30+
logical_meter = microgrid.logical_meter()
31+
stack.push_async_callback(logical_meter.stop)
32+
33+
chp_power_receiver = logical_meter.chp_power.new_receiver()
3034

31-
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0, 4.0])
32-
assert (await chp_power_receiver.receive()).value == Power.from_watts(2.0)
35+
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0, 4.0])
36+
assert (await chp_power_receiver.receive()).value == Power.from_watts(2.0)
3337

34-
await mockgrid.mock_resampler.send_meter_power([-12.0, None, 10.2])
35-
assert (await chp_power_receiver.receive()).value == Power.from_watts(-12.0)
38+
await mockgrid.mock_resampler.send_meter_power([-12.0, None, 10.2])
39+
assert (await chp_power_receiver.receive()).value == Power.from_watts(-12.0)
3640

3741
async def test_pv_power(self, mocker: MockerFixture) -> None:
3842
"""Test the pv power formula."""
39-
mockgrid = MockMicrogrid(grid_meter=False)
43+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
4044
mockgrid.add_solar_inverters(2)
41-
await mockgrid.start(mocker)
4245

43-
logical_meter = microgrid.logical_meter()
44-
pv_power_receiver = logical_meter.pv_power.new_receiver()
46+
async with mockgrid, AsyncExitStack() as stack:
47+
logical_meter = microgrid.logical_meter()
48+
stack.push_async_callback(logical_meter.stop)
49+
pv_power_receiver = logical_meter.pv_power.new_receiver()
4550

46-
await mockgrid.mock_resampler.send_meter_power([-1.0, -2.0])
47-
assert (await pv_power_receiver.receive()).value == Power.from_watts(-3.0)
51+
await mockgrid.mock_resampler.send_meter_power([-1.0, -2.0])
52+
assert (await pv_power_receiver.receive()).value == Power.from_watts(-3.0)
4853

4954
async def test_pv_power_no_meter(self, mocker: MockerFixture) -> None:
5055
"""Test the pv power formula."""
51-
mockgrid = MockMicrogrid(grid_meter=False)
56+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
5257
mockgrid.add_solar_inverters(2, no_meter=True)
53-
await mockgrid.start(mocker)
5458

55-
logical_meter = microgrid.logical_meter()
56-
pv_power_receiver = logical_meter.pv_power.new_receiver()
59+
async with mockgrid, AsyncExitStack() as stack:
60+
logical_meter = microgrid.logical_meter()
61+
stack.push_async_callback(logical_meter.stop)
62+
pv_power_receiver = logical_meter.pv_power.new_receiver()
5763

58-
await mockgrid.mock_resampler.send_pv_inverter_power([-1.0, -2.0])
59-
assert (await pv_power_receiver.receive()).value == Power.from_watts(-3.0)
64+
await mockgrid.mock_resampler.send_pv_inverter_power([-1.0, -2.0])
65+
assert (await pv_power_receiver.receive()).value == Power.from_watts(-3.0)
6066

6167
async def test_pv_power_no_pv_components(self, mocker: MockerFixture) -> None:
6268
"""Test the pv power formula without having any pv components."""
63-
mockgrid = MockMicrogrid(grid_meter=True)
64-
await mockgrid.start(mocker)
65-
66-
logical_meter = microgrid.logical_meter()
67-
pv_power_receiver = logical_meter.pv_power.new_receiver()
69+
async with MockMicrogrid(
70+
grid_meter=True, mocker=mocker
71+
) as mockgrid, AsyncExitStack() as stack:
72+
logical_meter = microgrid.logical_meter()
73+
stack.push_async_callback(logical_meter.stop)
74+
pv_power_receiver = logical_meter.pv_power.new_receiver()
6875

69-
await mockgrid.mock_resampler.send_non_existing_component_value()
70-
assert (await pv_power_receiver.receive()).value == Power.zero()
76+
await mockgrid.mock_resampler.send_non_existing_component_value()
77+
assert (await pv_power_receiver.receive()).value == Power.zero()
7178

7279
async def test_consumer_power_grid_meter(self, mocker: MockerFixture) -> None:
7380
"""Test the consumer power formula with a grid meter."""
74-
mockgrid = MockMicrogrid(grid_meter=True)
81+
mockgrid = MockMicrogrid(grid_meter=True, mocker=mocker)
7582
mockgrid.add_batteries(2)
7683
mockgrid.add_solar_inverters(2)
77-
await mockgrid.start(mocker)
7884

79-
logical_meter = microgrid.logical_meter()
80-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
85+
async with mockgrid, AsyncExitStack() as stack:
86+
logical_meter = microgrid.logical_meter()
87+
stack.push_async_callback(logical_meter.stop)
88+
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
8189

82-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
83-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(6.0)
90+
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
91+
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
92+
6.0
93+
)
8494

8595
async def test_consumer_power_no_grid_meter(self, mocker: MockerFixture) -> None:
8696
"""Test the consumer power formula without a grid meter."""
87-
mockgrid = MockMicrogrid(grid_meter=False)
97+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
8898
mockgrid.add_consumer_meters()
8999
mockgrid.add_batteries(2)
90100
mockgrid.add_solar_inverters(2)
91-
await mockgrid.start(mocker)
92101

93-
logical_meter = microgrid.logical_meter()
94-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
102+
async with mockgrid, AsyncExitStack() as stack:
103+
logical_meter = microgrid.logical_meter()
104+
stack.push_async_callback(logical_meter.stop)
105+
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
95106

96-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
97-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(20.0)
107+
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
108+
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
109+
20.0
110+
)
98111

99112
async def test_consumer_power_no_grid_meter_no_consumer_meter(
100113
self, mocker: MockerFixture
101114
) -> None:
102115
"""Test the consumer power formula without a grid meter."""
103-
mockgrid = MockMicrogrid(grid_meter=False)
116+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
104117
mockgrid.add_batteries(2)
105118
mockgrid.add_solar_inverters(2)
106-
await mockgrid.start(mocker)
107119

108-
logical_meter = microgrid.logical_meter()
109-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
120+
async with mockgrid, AsyncExitStack() as stack:
121+
logical_meter = microgrid.logical_meter()
122+
stack.push_async_callback(logical_meter.stop)
123+
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
110124

111-
await mockgrid.mock_resampler.send_non_existing_component_value()
112-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(0.0)
125+
await mockgrid.mock_resampler.send_non_existing_component_value()
126+
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
127+
0.0
128+
)
113129

114130
async def test_producer_power(self, mocker: MockerFixture) -> None:
115131
"""Test the producer power formula."""
116-
mockgrid = MockMicrogrid(grid_meter=False)
132+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
117133
mockgrid.add_solar_inverters(2)
118134
mockgrid.add_chps(2)
119-
await mockgrid.start(mocker)
120135

121-
logical_meter = microgrid.logical_meter()
122-
producer_power_receiver = logical_meter.producer_power.new_receiver()
136+
async with mockgrid, AsyncExitStack() as stack:
137+
logical_meter = microgrid.logical_meter()
138+
stack.push_async_callback(logical_meter.stop)
139+
producer_power_receiver = logical_meter.producer_power.new_receiver()
123140

124-
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0, 4.0, 5.0])
125-
assert (await producer_power_receiver.receive()).value == Power.from_watts(14.0)
141+
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0, 4.0, 5.0])
142+
assert (await producer_power_receiver.receive()).value == Power.from_watts(
143+
14.0
144+
)
126145

127146
async def test_producer_power_no_chp(self, mocker: MockerFixture) -> None:
128147
"""Test the producer power formula without a chp."""
129-
mockgrid = MockMicrogrid(grid_meter=False)
148+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
130149
mockgrid.add_solar_inverters(2)
131150

132-
await mockgrid.start(mocker)
151+
async with mockgrid, AsyncExitStack() as stack:
152+
logical_meter = microgrid.logical_meter()
153+
stack.push_async_callback(logical_meter.stop)
154+
producer_power_receiver = logical_meter.producer_power.new_receiver()
133155

134-
logical_meter = microgrid.logical_meter()
135-
producer_power_receiver = logical_meter.producer_power.new_receiver()
136-
137-
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0])
138-
assert (await producer_power_receiver.receive()).value == Power.from_watts(5.0)
156+
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0])
157+
assert (await producer_power_receiver.receive()).value == Power.from_watts(
158+
5.0
159+
)
139160

140161
async def test_producer_power_no_pv_no_consumer_meter(
141162
self, mocker: MockerFixture
142163
) -> None:
143164
"""Test the producer power formula without pv and without consumer meter."""
144-
mockgrid = MockMicrogrid(grid_meter=False)
165+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
145166
mockgrid.add_chps(1, True)
146-
await mockgrid.start(mocker)
147167

148-
logical_meter = microgrid.logical_meter()
149-
producer_power_receiver = logical_meter.producer_power.new_receiver()
168+
async with mockgrid, AsyncExitStack() as stack:
169+
logical_meter = microgrid.logical_meter()
170+
stack.push_async_callback(logical_meter.stop)
171+
producer_power_receiver = logical_meter.producer_power.new_receiver()
150172

151-
await mockgrid.mock_resampler.send_chp_power([2.0])
152-
assert (await producer_power_receiver.receive()).value == Power.from_watts(2.0)
173+
await mockgrid.mock_resampler.send_chp_power([2.0])
174+
assert (await producer_power_receiver.receive()).value == Power.from_watts(
175+
2.0
176+
)
153177

154178
async def test_producer_power_no_pv(self, mocker: MockerFixture) -> None:
155179
"""Test the producer power formula without pv."""
156-
mockgrid = MockMicrogrid(grid_meter=False)
180+
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
157181
mockgrid.add_consumer_meters()
158182
mockgrid.add_chps(1)
159-
await mockgrid.start(mocker)
160183

161-
logical_meter = microgrid.logical_meter()
162-
producer_power_receiver = logical_meter.producer_power.new_receiver()
184+
async with mockgrid, AsyncExitStack() as stack:
185+
logical_meter = microgrid.logical_meter()
186+
stack.push_async_callback(logical_meter.stop)
187+
producer_power_receiver = logical_meter.producer_power.new_receiver()
163188

164-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0])
165-
assert (await producer_power_receiver.receive()).value == Power.from_watts(2.0)
189+
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0])
190+
assert (await producer_power_receiver.receive()).value == Power.from_watts(
191+
2.0
192+
)
166193

167194
async def test_no_producer_power(self, mocker: MockerFixture) -> None:
168195
"""Test the producer power formula without producers."""
169-
mockgrid = MockMicrogrid(grid_meter=True)
170-
await mockgrid.start(mocker)
171-
172-
logical_meter = microgrid.logical_meter()
173-
producer_power_receiver = logical_meter.producer_power.new_receiver()
174-
175-
await mockgrid.mock_resampler.send_non_existing_component_value()
176-
assert (await producer_power_receiver.receive()).value == Power.from_watts(0.0)
196+
async with MockMicrogrid(
197+
grid_meter=True, mocker=mocker
198+
) as mockgrid, AsyncExitStack() as stack:
199+
logical_meter = microgrid.logical_meter()
200+
stack.push_async_callback(logical_meter.stop)
201+
producer_power_receiver = logical_meter.producer_power.new_receiver()
202+
203+
await mockgrid.mock_resampler.send_non_existing_component_value()
204+
assert (await producer_power_receiver.receive()).value == Power.from_watts(
205+
0.0
206+
)

0 commit comments

Comments
 (0)