44"""Tests for the logical meter."""
55
66
7+ from contextlib import AsyncExitStack
8+
79from pytest_mock import MockerFixture
810
911from 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