Skip to content

Commit 00dcb3c

Browse files
authored
Merge pull request #26 from Marenz/enhanceme
Useful additions for testing
2 parents bfbe12a + e8764b4 commit 00dcb3c

File tree

7 files changed

+27
-24
lines changed

7 files changed

+27
-24
lines changed

RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
## New Features
1212

1313
- A new module `frequenz.client.dispatch.test` has been added, providing a fake Service and Client as well as a `DispatchGenerator` to generate `Dispatch` instances filled with random data.
14+
- The `DispatchGenerator.generate_dispatch` method now accepts a `microgrid_id` parameter to generate `Dispatch` instances with a specific microgrid ID.
1415

1516
## Bug Fixes
1617

src/frequenz/client/dispatch/_internal_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# pylint: enable=no-name-in-module
1717
from google.protobuf.json_format import MessageToDict
1818

19-
from frequenz.client.dispatch.types import (
19+
from .types import (
2020
ComponentSelector,
2121
RecurrenceRule,
2222
component_selector_from_protobuf,

src/frequenz/client/dispatch/test/_service.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
66
Useful for testing.
77
"""
8-
98
import dataclasses
109
from dataclasses import dataclass
1110
from datetime import datetime, timezone
@@ -29,11 +28,11 @@
2928
from frequenz.api.dispatch.v1.dispatch_pb2 import DispatchUpdateRequest
3029
from google.protobuf.empty_pb2 import Empty
3130

31+
# pylint: enable=no-name-in-module
3232
from frequenz.client.base.conversion import to_datetime as _to_dt
3333

34-
# pylint: enable=no-name-in-module
35-
from frequenz.client.dispatch._internal_types import DispatchCreateRequest
36-
from frequenz.client.dispatch.types import Dispatch
34+
from .._internal_types import DispatchCreateRequest
35+
from ..types import Dispatch
3736

3837

3938
@dataclass
@@ -124,12 +123,15 @@ async def UpdateMicrogridDispatch(
124123
request: DispatchUpdateRequest,
125124
) -> Empty:
126125
"""Update a dispatch."""
127-
dispatch = next((d for d in self.dispatches if d.id == request.id), None)
126+
index = next(
127+
(i for i, d in enumerate(self.dispatches) if d.id == request.id),
128+
None,
129+
)
128130

129-
if dispatch is None:
131+
if index is None:
130132
return Empty()
131133

132-
pb_dispatch = dispatch.to_protobuf()
134+
pb_dispatch = self.dispatches[index].to_protobuf()
133135

134136
# Go through the paths in the update mask and update the dispatch
135137
for path in request.update_mask.paths:
@@ -175,6 +177,8 @@ async def UpdateMicrogridDispatch(
175177
dispatch = Dispatch.from_protobuf(pb_dispatch)
176178
dispatch.update_time = datetime.now(tz=timezone.utc)
177179

180+
self.dispatches[index] = dispatch
181+
178182
return Empty()
179183

180184
async def GetMicrogridDispatch(

src/frequenz/client/dispatch/test/client.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
"""Fake client for testing."""
55

66
from typing import Any, cast
7+
from unittest.mock import MagicMock
78

8-
import grpc.aio
9-
10-
from frequenz.client.dispatch import Client
11-
from frequenz.client.dispatch.test._service import FakeService
12-
from frequenz.client.dispatch.types import Dispatch
9+
from .. import Client
10+
from ..types import Dispatch
11+
from ._service import FakeService
1312

1413

1514
class FakeClient(Client):
@@ -20,7 +19,7 @@ class FakeClient(Client):
2019

2120
def __init__(self) -> None:
2221
"""Initialize the mock client."""
23-
super().__init__(grpc.aio.insecure_channel("mock"), "mock")
22+
super().__init__(MagicMock(), "mock")
2423
self._stub = FakeService() # type: ignore
2524

2625
@property

src/frequenz/client/dispatch/test/generator.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@
77
from datetime import datetime, timedelta, timezone
88

99
from frequenz.client.common.microgrid.components import ComponentCategory
10-
from frequenz.client.dispatch.types import (
11-
Dispatch,
12-
EndCriteria,
13-
Frequency,
14-
RecurrenceRule,
15-
Weekday,
16-
)
10+
11+
from ..types import Dispatch, EndCriteria, Frequency, RecurrenceRule, Weekday
1712

1813

1914
class DispatchGenerator:
@@ -69,9 +64,12 @@ def generate_recurrence_rule(self) -> RecurrenceRule:
6964
],
7065
)
7166

72-
def generate_dispatch(self) -> Dispatch:
67+
def generate_dispatch(self, microgrid_id: int | None = None) -> Dispatch:
7368
"""Generate a random dispatch instance.
7469
70+
Args:
71+
microgrid_id: The microgrid_id to set on the dispatch.
72+
7573
Returns:
7674
a random dispatch instance
7775
"""
@@ -84,7 +82,7 @@ def generate_dispatch(self) -> Dispatch:
8482
id=self._last_id,
8583
create_time=create_time,
8684
update_time=create_time + timedelta(seconds=self._rng.randint(0, 1000000)),
87-
microgrid_id=self._rng.randint(0, 100),
85+
microgrid_id=microgrid_id or self._rng.randint(0, 100),
8886
type=str(self._rng.randint(0, 100_000)),
8987
start_time=datetime.now().astimezone(timezone.utc)
9088
+ timedelta(seconds=self._rng.randint(0, 1000000)),

src/frequenz/client/dispatch/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def to_protobuf(self) -> PBRecurrenceRule.EndCriteria:
148148

149149

150150
# pylint: disable=too-many-instance-attributes
151-
@dataclass(frozen=True, kw_only=True)
151+
@dataclass(kw_only=True)
152152
class RecurrenceRule:
153153
"""Ruleset governing when and how a dispatch should re-occur.
154154

tests/test_dispatch_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ async def test_update_dispatch() -> None:
8181
assert dispatch == sample
8282

8383
await client.update(dispatch.id, {"recurrence.interval": 4})
84+
assert client.dispatches[0].recurrence.interval == 4
8485

8586

8687
async def test_get_dispatch() -> None:

0 commit comments

Comments
 (0)