Skip to content

Commit 24d835c

Browse files
committed
Refactor Assets API client tests and improve utility functions
This commit includes several updates to the Assets API client tests and utility functions: - Refactored test structure for better organization and clarity, including renaming test files and updating docstrings. - Introduced new test cases for retrieving microgrid details and electrical components, enhancing coverage for the Assets API client. - Added utility functions to streamline test case management and improve readability. - Updated the JSON encoder logic in the AssetsJSONEncoder class for better handling of container types. These changes enhance the maintainability and robustness of the testing framework for the Assets API client. Signed-off-by: eduardiazf <[email protected]>
1 parent da75b8f commit 24d835c

File tree

9 files changed

+961
-160
lines changed

9 files changed

+961
-160
lines changed

src/frequenz/client/assets/_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def _encode_containers_recursively(self, o: Any) -> Any:
5353
): self._encode_containers_recursively(value)
5454
for key, value in o.items()
5555
}
56-
elif isinstance(o, (list, tuple, set, frozenset)):
56+
if isinstance(o, (list, tuple, set, frozenset)):
5757
items = [self._encode_containers_recursively(item) for item in o]
5858
return items if isinstance(o, (list, tuple)) else items
5959
return o

tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# License: MIT
22
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
33

4-
"""Tests package."""
4+
"""Tests for the Assets API Client."""
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# License: MIT
2+
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Test data for successful microgrid retrieval."""
5+
6+
from datetime import datetime, timezone
7+
from typing import Any
8+
from unittest.mock import AsyncMock
9+
10+
from frequenz.api.assets.v1 import assets_pb2
11+
from frequenz.api.common.v1alpha8.microgrid import microgrid_pb2
12+
from frequenz.client.common.microgrid import EnterpriseId, MicrogridId
13+
14+
from frequenz.client.assets import Microgrid, MicrogridStatus
15+
16+
17+
def assert_stub_method_call(stub_method: AsyncMock) -> None:
18+
"""Assert that the gRPC request matches the expected request."""
19+
stub_method.assert_called_once_with(
20+
assets_pb2.GetMicrogridRequest(microgrid_id=1), timeout=60.0
21+
)
22+
23+
24+
client_args = (1,)
25+
create_timestamp = datetime(2023, 1, 1, tzinfo=timezone.utc)
26+
grpc_response = assets_pb2.GetMicrogridResponse(microgrid=microgrid_pb2.Microgrid())
27+
28+
29+
def assert_client_result(result: Any) -> None:
30+
"""Assert that the client result matches the expected Microgrid."""
31+
assert result == Microgrid(
32+
id=MicrogridId(0),
33+
enterprise_id=EnterpriseId(0),
34+
name=None,
35+
status=MicrogridStatus.UNSPECIFIED,
36+
location=None,
37+
delivery_area=None,
38+
create_timestamp=datetime(1970, 1, 1, 0, 0, tzinfo=timezone.utc),
39+
)
40+
assert result.is_active
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# License: MIT
2+
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Test data for microgrid info retrieval with error."""
5+
6+
from typing import Any
7+
8+
from frequenz.api.assets.v1 import assets_pb2
9+
from grpc import StatusCode
10+
11+
from frequenz.client.assets.exceptions import PermissionDenied
12+
from tests.util import make_grpc_error
13+
14+
15+
def assert_stub_method_call(stub_method: Any) -> None:
16+
"""Assert that the gRPC request matches the expected request."""
17+
stub_method.assert_called_once_with(
18+
assets_pb2.GetMicrogridRequest(microgrid_id=1), timeout=60.0
19+
)
20+
21+
22+
client_args = (1,)
23+
grpc_response = make_grpc_error(StatusCode.PERMISSION_DENIED)
24+
25+
26+
def assert_client_exception(exception: Exception) -> None:
27+
"""Assert that the client exception matches the expected error."""
28+
assert isinstance(exception, PermissionDenied)
29+
assert exception.grpc_error == grpc_response
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# License: MIT
2+
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Test data for successful microgrid info retrieval."""
5+
6+
from datetime import datetime, timezone
7+
from typing import Any
8+
from unittest.mock import AsyncMock
9+
10+
import pytest
11+
from frequenz.api.assets.v1 import assets_pb2
12+
from frequenz.api.common.v1alpha8.grid import delivery_area_pb2
13+
from frequenz.api.common.v1alpha8.microgrid import microgrid_pb2
14+
from frequenz.api.common.v1alpha8.types import location_pb2
15+
from frequenz.client.base.conversion import to_timestamp
16+
from frequenz.client.common.microgrid import EnterpriseId, MicrogridId
17+
18+
from frequenz.client.assets import (
19+
DeliveryArea,
20+
EnergyMarketCodeType,
21+
Location,
22+
Microgrid,
23+
MicrogridStatus,
24+
)
25+
26+
27+
def assert_stub_method_call(stub_method: AsyncMock) -> None:
28+
"""Assert that the gRPC request matches the expected request."""
29+
stub_method.assert_called_once_with(
30+
assets_pb2.GetMicrogridRequest(microgrid_id=1234), timeout=60.0
31+
)
32+
33+
34+
client_args = (1234,)
35+
create_timestamp = datetime(2023, 1, 1, tzinfo=timezone.utc)
36+
grpc_response = assets_pb2.GetMicrogridResponse(
37+
microgrid=microgrid_pb2.Microgrid(
38+
id=1234,
39+
enterprise_id=5678,
40+
name="Test Microgrid",
41+
delivery_area=delivery_area_pb2.DeliveryArea(
42+
code="Test Delivery Area",
43+
code_type=delivery_area_pb2.EnergyMarketCodeType.ENERGY_MARKET_CODE_TYPE_EUROPE_EIC,
44+
),
45+
location=location_pb2.Location(
46+
latitude=37.7749, longitude=-122.4194, country_code="DE"
47+
),
48+
status=microgrid_pb2.MICROGRID_STATUS_INACTIVE,
49+
create_timestamp=to_timestamp(create_timestamp),
50+
)
51+
)
52+
53+
54+
def assert_client_result(result: Any) -> None:
55+
"""Assert that the client result matches the expected Microgrid."""
56+
assert result == Microgrid(
57+
id=MicrogridId(1234),
58+
enterprise_id=EnterpriseId(5678),
59+
name="Test Microgrid",
60+
delivery_area=DeliveryArea(
61+
code="Test Delivery Area", code_type=EnergyMarketCodeType.EUROPE_EIC
62+
),
63+
location=Location(
64+
latitude=pytest.approx(37.7749), # type: ignore[arg-type]
65+
longitude=pytest.approx(-122.4194), # type: ignore[arg-type]
66+
country_code="DE",
67+
),
68+
status=MicrogridStatus.INACTIVE,
69+
create_timestamp=datetime(2023, 1, 1, tzinfo=timezone.utc),
70+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# License: MIT
2+
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Empty case for list electrical components."""
5+
6+
from typing import Any
7+
8+
from frequenz.api.assets.v1 import assets_pb2
9+
10+
11+
def assert_stub_method_call(stub_method: Any) -> None:
12+
"""Assert that the gRPC request matches the expected request."""
13+
stub_method.assert_called_once_with(
14+
assets_pb2.ListMicrogridElectricalComponentsRequest(microgrid_id=1234),
15+
timeout=60.0,
16+
)
17+
18+
19+
client_args = (1234,)
20+
grpc_response = assets_pb2.ListMicrogridElectricalComponentsResponse(components=[])
21+
22+
23+
def assert_client_result(result: Any) -> None: # noqa: D103
24+
assert not list(result)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# License: MIT
2+
# Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Test list_electrical_components with error."""
5+
6+
from typing import Any
7+
8+
from frequenz.api.assets.v1 import assets_pb2
9+
from grpc import StatusCode
10+
11+
from frequenz.client.assets.exceptions import PermissionDenied
12+
from tests.util import make_grpc_error
13+
14+
15+
def assert_stub_method_call(stub_method: Any) -> None:
16+
"""Assert that the gRPC request matches the expected request."""
17+
stub_method.assert_called_once_with(
18+
assets_pb2.ListMicrogridElectricalComponentsRequest(microgrid_id=1234),
19+
timeout=60.0,
20+
)
21+
22+
23+
client_args = (1234,)
24+
grpc_response = make_grpc_error(StatusCode.PERMISSION_DENIED)
25+
26+
27+
def assert_client_exception(exception: Exception) -> None:
28+
"""Assert that the client exception matches the expected error."""
29+
assert isinstance(exception, PermissionDenied)
30+
assert exception.grpc_error == grpc_response

0 commit comments

Comments
 (0)