Skip to content

Commit b9d88c8

Browse files
committed
Improve finalization of grid tests
Use an async exit stack to properly finalize the `Grid` object automatically. The finalization was missing in some tests. Also uses `time_machine` as a `pytest` fixture when possible to simplify the tests and avoid having too indent too deep, as the previous approach used a context manager too, but not an async one, so it can be combined in the same `with` statement. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 102567b commit b9d88c8

File tree

1 file changed

+29
-27
lines changed

1 file changed

+29
-27
lines changed

tests/microgrid/test_grid.py

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
"""Tests for the `Grid` module."""
55

6+
from contextlib import AsyncExitStack
7+
68
from pytest_mock import MockerFixture
79

810
import frequenz.sdk.microgrid.component_graph as gr
@@ -37,8 +39,10 @@ async def test_grid_1(mocker: MockerFixture) -> None:
3739
# pylint: disable=protected-access
3840
graph = gr._MicrogridComponentGraph(components=components, connections=connections)
3941

40-
async with MockMicrogrid(graph=graph, mocker=mocker):
42+
async with MockMicrogrid(graph=graph, mocker=mocker), AsyncExitStack() as stack:
4143
grid = microgrid.grid()
44+
assert grid is not None
45+
stack.push_async_callback(grid.stop)
4246

4347
assert grid
4448
assert grid.fuse
@@ -69,17 +73,17 @@ async def test_grid_2(mocker: MockerFixture) -> None:
6973
# pylint: disable=protected-access
7074
graph = gr._MicrogridComponentGraph(components=components, connections=connections)
7175

72-
async with MockMicrogrid(graph=graph, mocker=mocker):
76+
async with MockMicrogrid(graph=graph, mocker=mocker), AsyncExitStack() as stack:
7377
grid = microgrid.grid()
7478
assert grid is not None
79+
stack.push_async_callback(grid.stop)
7580

7681
expected_fuse_current = Current.from_amperes(123.0)
7782
expected_fuse = Fuse(expected_fuse_current)
7883

7984
assert grid.fuse == expected_fuse
8085

8186

82-
8387
async def test_grid_3(mocker: MockerFixture) -> None:
8488
"""Validate that microgrids with a grid connection without a fuse are instantiated."""
8589
components = {
@@ -93,22 +97,25 @@ async def test_grid_3(mocker: MockerFixture) -> None:
9397
# pylint: disable=protected-access
9498
graph = gr._MicrogridComponentGraph(components=components, connections=connections)
9599

96-
async with MockMicrogrid(graph=graph, mocker=mocker):
100+
async with MockMicrogrid(graph=graph, mocker=mocker), AsyncExitStack() as stack:
97101
grid = microgrid.grid()
98102
assert grid is not None
103+
stack.push_async_callback(grid.stop)
99104
assert grid.fuse is None
100105

101106

102-
103107
async def test_grid_power_1(mocker: MockerFixture) -> None:
104108
"""Test the grid power formula with a grid side meter."""
105109
mockgrid = MockMicrogrid(grid_meter=True, mocker=mocker)
106110
mockgrid.add_batteries(2)
107111
mockgrid.add_solar_inverters(1)
108112

109-
async with mockgrid:
113+
results = []
114+
grid_meter_data = []
115+
async with mockgrid, AsyncExitStack() as stack:
110116
grid = microgrid.grid()
111117
assert grid, "Grid is not initialized"
118+
stack.push_async_callback(grid.stop)
112119

113120
grid_power_recv = grid.power.new_receiver()
114121

@@ -119,8 +126,6 @@ async def test_grid_power_1(mocker: MockerFixture) -> None:
119126
Power.from_watts,
120127
)
121128

122-
results = []
123-
grid_meter_data = []
124129
for count in range(10):
125130
await mockgrid.mock_resampler.send_meter_power(
126131
[20.0 + count, 12.0, -13.0, -5.0]
@@ -137,9 +142,7 @@ async def test_grid_power_1(mocker: MockerFixture) -> None:
137142
assert val is not None and val.value is not None
138143
results.append(val.value)
139144

140-
await grid.stop()
141-
142-
assert equal_float_lists(results, grid_meter_data)
145+
assert equal_float_lists(results, grid_meter_data)
143146

144147

145148
async def test_grid_power_2(mocker: MockerFixture) -> None:
@@ -150,9 +153,12 @@ async def test_grid_power_2(mocker: MockerFixture) -> None:
150153
mockgrid.add_batteries(1, no_meter=True)
151154
mockgrid.add_solar_inverters(1)
152155

153-
async with mockgrid:
156+
results: list[Quantity] = []
157+
meter_sums: list[Quantity] = []
158+
async with mockgrid, AsyncExitStack() as stack:
154159
grid = microgrid.grid()
155160
assert grid, "Grid is not initialized"
161+
stack.push_async_callback(grid.stop)
156162

157163
grid_power_recv = grid.power.new_receiver()
158164

@@ -170,8 +176,6 @@ async def test_grid_power_2(mocker: MockerFixture) -> None:
170176
]
171177
]
172178

173-
results: list[Quantity] = []
174-
meter_sums: list[Quantity] = []
175179
for count in range(10):
176180
await mockgrid.mock_resampler.send_meter_power([20.0 + count, 12.0, -13.0])
177181
await mockgrid.mock_resampler.send_bat_inverter_power([0.0, -5.0])
@@ -190,10 +194,8 @@ async def test_grid_power_2(mocker: MockerFixture) -> None:
190194
results.append(val.value)
191195
meter_sums.append(Quantity(meter_sum))
192196

193-
await grid.stop()
194-
195-
assert len(results) == 10
196-
assert equal_float_lists(results, meter_sums)
197+
assert len(results) == 10
198+
assert equal_float_lists(results, meter_sums)
197199

198200

199201
async def test_grid_production_consumption_power_consumer_meter(
@@ -205,9 +207,11 @@ async def test_grid_production_consumption_power_consumer_meter(
205207
mockgrid.add_batteries(2)
206208
mockgrid.add_solar_inverters(1)
207209

208-
async with mockgrid:
210+
async with mockgrid, AsyncExitStack() as stack:
209211
grid = microgrid.grid()
210212
assert grid, "Grid is not initialized"
213+
stack.push_async_callback(grid.stop)
214+
211215
grid_recv = grid.power.new_receiver()
212216

213217
await mockgrid.mock_resampler.send_meter_power([1.0, 2.0, 3.0, 4.0])
@@ -216,8 +220,6 @@ async def test_grid_production_consumption_power_consumer_meter(
216220
await mockgrid.mock_resampler.send_meter_power([1.0, 2.0, -3.0, -4.0])
217221
assert (await grid_recv.receive()).value == Power.from_watts(-4.0)
218222

219-
await grid.stop()
220-
221223

222224
async def test_grid_production_consumption_power_no_grid_meter(
223225
mocker: MockerFixture,
@@ -227,9 +229,11 @@ async def test_grid_production_consumption_power_no_grid_meter(
227229
mockgrid.add_batteries(2)
228230
mockgrid.add_solar_inverters(1)
229231

230-
async with mockgrid:
232+
async with mockgrid, AsyncExitStack() as stack:
231233
grid = microgrid.grid()
232234
assert grid, "Grid is not initialized"
235+
stack.push_async_callback(grid.stop)
236+
233237
grid_recv = grid.power.new_receiver()
234238

235239
await mockgrid.mock_resampler.send_meter_power([2.5, 3.5, 4.0])
@@ -238,21 +242,19 @@ async def test_grid_production_consumption_power_no_grid_meter(
238242
await mockgrid.mock_resampler.send_meter_power([3.0, -3.0, -4.0])
239243
assert (await grid_recv.receive()).value == Power.from_watts(-4.0)
240244

241-
await grid.stop()
242-
243245

244246
async def test_consumer_power_2_grid_meters(mocker: MockerFixture) -> None:
245247
"""Test the grid power formula with two grid meters."""
246248
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
247249
# with no further successor these will be detected as grid meters
248250
mockgrid.add_consumer_meters(2)
249251

250-
async with mockgrid:
252+
async with mockgrid, AsyncExitStack() as stack:
251253
grid = microgrid.grid()
252254
assert grid, "Grid is not initialized"
255+
stack.push_async_callback(grid.stop)
256+
253257
grid_recv = grid.power.new_receiver()
254258

255259
await mockgrid.mock_resampler.send_meter_power([1.0, 2.0])
256260
assert (await grid_recv.receive()).value == Power.from_watts(3.0)
257-
258-
await grid.stop()

0 commit comments

Comments
 (0)