Skip to content

Commit

Permalink
Fix serialization of payloads that contain collection of multiple ele…
Browse files Browse the repository at this point in the history
…ments (#637)

Serialization of a payload that contains a collection of items fails.
Only the last item of the collection appears in the
serialized output. All other collections are not available.

Fixes #635
  • Loading branch information
OrangeTux authored May 21, 2024
1 parent 52e33d2 commit 0b3db4e
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
6 changes: 4 additions & 2 deletions ocpp/charge_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,18 @@ class StatusInfoType:
serialized = asdict(dataclass)

for field in dataclass.__dataclass_fields__.values():

value = getattr(dataclass, field.name)
if _is_dataclass_instance(value):
serialized[field.name] = serialize_as_dict(value)
continue

if isinstance(value, list):
serialized[field.name] = []
for item in value:
if _is_dataclass_instance(item):
serialized[field.name] = [serialize_as_dict(item)]
serialized[field.name].append(serialize_as_dict(item))
else:
serialized[field.name].append(item)

return serialized

Expand Down
62 changes: 62 additions & 0 deletions tests/test_charge_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from ocpp.v16.datatypes import MeterValue, SampledValue
from ocpp.v16.enums import Action, RegistrationStatus
from ocpp.v201 import ChargePoint as cp_201
from ocpp.v201 import call_result, datatypes, enums
from ocpp.v201.call import GetVariables as v201GetVariables
from ocpp.v201.call import SetNetworkProfile as v201SetNetworkProfile
from ocpp.v201.datatypes import (
Expand Down Expand Up @@ -312,6 +313,67 @@ def test_serialize_as_dict():
assert serialize_as_dict(payload) == expected


def test_serialization_of_collection_of_multiple_elements():
"""This test validates that bug #635 is fixed.
That bug incorrectly serialized payloads that contain a collection
of elements.
This test serializes a call_result.SetVariables that contains 2
SetVariableResultTypes.
https://github.com/mobilityhouse/ocpp/issues/635
"""
payload = call_result.SetVariables(
set_variable_result=[
datatypes.SetVariableResultType(
attribute_status=enums.SetVariableStatusType.accepted,
component={
"name": "TemperatureSensor",
"instance": "First",
"evse": {"id": 1, "connector_id": 1},
},
variable={"name": "DisplayUnit", "instance": "Main"},
attribute_type="Actual",
attribute_status_info=None,
),
datatypes.SetVariableResultType(
attribute_status="Accepted",
component={"name": "TxCtrlr"},
variable={"name": "TxStopPoint"},
attribute_type="Actual",
attribute_status_info=None,
),
],
custom_data=None,
)

expected = {
"custom_data": None,
"set_variable_result": [
{
"attribute_status": "Accepted",
"attribute_status_info": None,
"attribute_type": "Actual",
"component": {
"evse": {"connector_id": 1, "id": 1},
"instance": "First",
"name": "TemperatureSensor",
},
"variable": {"instance": "Main", "name": "DisplayUnit"},
},
{
"attribute_status": "Accepted",
"attribute_status_info": None,
"attribute_type": "Actual",
"component": {"name": "TxCtrlr"},
"variable": {"name": "TxStopPoint"},
},
],
}
# Execute / Assert
assert serialize_as_dict(payload) == expected


@pytest.mark.asyncio
async def test_call_unique_id_added_to_handler_args_correctly(connection):
"""
Expand Down

0 comments on commit 0b3db4e

Please sign in to comment.