7
7
from dataclasses import dataclass , replace
8
8
from datetime import datetime , timedelta , timezone
9
9
from random import randint
10
- from typing import AsyncIterator , Iterator , TypeVar
10
+ from typing import AsyncIterator , Iterator
11
11
from unittest .mock import MagicMock
12
12
13
13
import async_solipsism
14
14
import time_machine
15
15
from frequenz .channels import Broadcast , Receiver
16
- from frequenz .channels ._broadcast import Sender
17
16
from frequenz .client .dispatch .test .client import FakeClient , to_create_params
18
17
from frequenz .client .dispatch .test .generator import DispatchGenerator
19
18
from frequenz .client .dispatch .types import Dispatch , Frequency
@@ -63,32 +62,16 @@ class ActorTestEnv:
63
62
@fixture
64
63
async def actor_env () -> AsyncIterator [ActorTestEnv ]:
65
64
"""Return an actor test environment."""
66
- T = TypeVar ("T" )
67
-
68
- class YieldingSender (Sender [T ]):
69
- """A sender that yields after sending.
70
-
71
- For testing we want to manipulate the time after a call to send.
72
-
73
- The normal sender normally doesn't yield/await, robbing us of the
74
- opportunity to manipulate the time.
75
- """
76
-
77
- async def send (self , msg : T ) -> None :
78
- """Send the value and yield."""
79
- await super ().send (msg )
80
- await asyncio .sleep (1 )
81
-
82
- updated_dispatches = Broadcast [DispatchEvent ]("updated_dispatches" )
83
- ready_dispatches = Broadcast [Dispatch ]("ready_dispatches" )
65
+ updated_dispatches = Broadcast [DispatchEvent ](name = "updated_dispatches" )
66
+ ready_dispatches = Broadcast [Dispatch ](name = "ready_dispatches" )
84
67
microgrid_id = randint (1 , 100 )
85
68
86
69
actor = DispatchingActor (
87
70
microgrid_id = microgrid_id ,
88
71
grpc_channel = MagicMock (),
89
72
svc_addr = "localhost" ,
90
- updated_dispatch_sender = YieldingSender ( updated_dispatches ),
91
- ready_dispatch_sender = YieldingSender ( ready_dispatches ),
73
+ updated_dispatch_sender = updated_dispatches . new_sender ( ),
74
+ ready_dispatch_sender = ready_dispatches . new_sender ( ),
92
75
)
93
76
94
77
client = FakeClient ()
@@ -144,9 +127,12 @@ async def _test_new_dispatch_created(
144
127
case Deleted (dispatch ) | Updated (dispatch ):
145
128
assert False , "Expected a created event"
146
129
case Created (dispatch ):
147
- sample .update_time = dispatch .update_time
148
- sample .create_time = dispatch .create_time
149
- sample .id = dispatch .id
130
+ sample = replace (
131
+ sample ,
132
+ update_time = dispatch .update_time ,
133
+ create_time = dispatch .create_time ,
134
+ id = dispatch .id ,
135
+ )
150
136
assert dispatch == sample
151
137
152
138
return sample
@@ -159,16 +145,19 @@ async def test_existing_dispatch_updated(
159
145
) -> None :
160
146
"""Test that an existing dispatch is updated."""
161
147
sample = generator .generate_dispatch (actor_env .microgrid_id )
162
- sample .active = False
163
- sample .recurrence .frequency = Frequency .DAILY
148
+ sample = replace (
149
+ sample ,
150
+ active = False ,
151
+ recurrence = replace (sample .recurrence , frequency = Frequency .DAILY ),
152
+ )
164
153
165
154
fake_time .shift (timedelta (seconds = 1 ))
166
155
167
- await _test_new_dispatch_created (actor_env , sample )
156
+ sample = await _test_new_dispatch_created (actor_env , sample )
168
157
fake_time .shift (timedelta (seconds = 1 ))
169
158
170
159
await actor_env .client .update (
171
- sample .id ,
160
+ dispatch_id = sample .id ,
172
161
new_fields = {
173
162
"active" : True ,
174
163
"recurrence.frequency" : Frequency .UNSPECIFIED ,
@@ -181,11 +170,13 @@ async def test_existing_dispatch_updated(
181
170
case Created (dispatch ) | Deleted (dispatch ):
182
171
assert False , "Expected an updated event"
183
172
case Updated (dispatch ):
184
- sample .update_time = dispatch .update_time
185
- sample .active = True
186
- sample .recurrence = replace (
187
- sample .recurrence , frequency = Frequency .UNSPECIFIED
173
+ sample = replace (
174
+ sample ,
175
+ active = True ,
176
+ recurrence = replace (sample .recurrence , frequency = Frequency .UNSPECIFIED ),
177
+ update_time = dispatch .update_time ,
188
178
)
179
+
189
180
assert dispatch == sample
190
181
191
182
@@ -197,7 +188,7 @@ async def test_existing_dispatch_deleted(
197
188
"""Test that an existing dispatch is deleted."""
198
189
sample = generator .generate_dispatch (actor_env .microgrid_id )
199
190
200
- await _test_new_dispatch_created (actor_env , sample )
191
+ sample = await _test_new_dispatch_created (actor_env , sample )
201
192
202
193
await actor_env .client .delete (sample .id )
203
194
fake_time .shift (timedelta (seconds = 1 ))
@@ -207,7 +198,7 @@ async def test_existing_dispatch_deleted(
207
198
case Created (dispatch ) | Updated (dispatch ):
208
199
assert False , "Expected a deleted event"
209
200
case Deleted (dispatch ):
210
- sample . create_time = dispatch .create_time
201
+ sample = replace ( sample , update_time = dispatch .update_time )
211
202
assert dispatch == sample
212
203
213
204
0 commit comments