Skip to content

Commit cca3ca7

Browse files
authored
Merge pull request #131 from NHSDigital/em-1209-add-enum-to-deserialise-value
EM-1209 Add support for deserialising Enums
2 parents eab7a01 + ab383fa commit cca3ca7

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

nhs_aws_helpers/dynamodb_model_store/base_model_store.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import itertools
44
from dataclasses import dataclass, fields, is_dataclass
55
from datetime import date, datetime
6+
from enum import Enum
67
from time import time
78
from typing import (
89
Any,
@@ -174,6 +175,9 @@ def deserialise_value(cls, value_type: type, value: Any, **kwargs) -> Any: # no
174175
if origin_type is set:
175176
return set(value)
176177

178+
if issubclass(value_type, Enum):
179+
return value_type(value)
180+
177181
return value
178182

179183
@classmethod

tests/base_model_store_tests.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import sys
44
from dataclasses import dataclass, field
55
from datetime import date, datetime
6+
from enum import Enum
67
from typing import Any, Dict, Generator, List, Mapping, Optional, Type, TypedDict, Union, cast
78
from uuid import uuid4
89

@@ -102,6 +103,17 @@ class NestedItem:
102103
timestamp: datetime = field(default_factory=datetime.utcnow)
103104

104105

106+
class SomeEnum(str, Enum):
107+
FIELD_ONE = "one"
108+
FIELD_TWO = "two"
109+
110+
111+
@dataclass
112+
class NestedModelWithEnum:
113+
some_enum: SomeEnum
114+
some_str: str
115+
116+
105117
@dataclass
106118
class MyDerivedModel(MyBaseModel):
107119
id: str
@@ -121,6 +133,10 @@ class MyDerivedModel(MyBaseModel):
121133
union_date: Union[datetime, None] = field(default_factory=datetime.utcnow)
122134
bytes_type: Union[bytes, None] = None
123135
bytearray_type: Union[bytearray, None] = None
136+
some_enum: SomeEnum = SomeEnum.FIELD_ONE
137+
nested_enum: NestedModelWithEnum = field(
138+
default_factory=lambda: NestedModelWithEnum(some_str="string", some_enum=SomeEnum.FIELD_TWO)
139+
)
124140

125141
def get_key(self) -> _MyModelKey:
126142
return _MyModelKey(my_pk=f"AA#{self.id}", my_sk=self.sk_field or "#")
@@ -489,6 +505,11 @@ async def test_serialize_deserialize_model(store: MyModelStore):
489505
assert isinstance(serialized["nested_item"], dict)
490506
assert serialized["nested_item"]["event"] == "created"
491507

508+
assert isinstance(serialized["some_enum"], str)
509+
assert serialized["some_enum"] == "one"
510+
assert isinstance(serialized["nested_enum"], dict)
511+
assert serialized["nested_enum"]["some_enum"] == "two"
512+
492513
assert model.none_string is None
493514
assert "none_thing" not in serialized
494515
assert model.none_list is None
@@ -505,6 +526,25 @@ async def test_serialize_deserialize_model(store: MyModelStore):
505526
assert deserialized.nested_item.event == "created"
506527
assert deserialized.last_modified == model.last_modified
507528
assert deserialized.today == model.today
529+
assert isinstance(deserialized.some_enum, SomeEnum)
530+
assert deserialized.some_enum == SomeEnum.FIELD_ONE
531+
assert isinstance(deserialized.nested_enum, NestedModelWithEnum)
532+
assert isinstance(deserialized.nested_enum.some_enum, SomeEnum)
533+
assert deserialized.nested_enum.some_enum == SomeEnum.FIELD_TWO
534+
535+
536+
async def test_nested_enum_using_deserialise_model_function():
537+
enum_test_dict = {
538+
"some_str": "test string",
539+
"some_enum": "two",
540+
}
541+
542+
deserialised_model = BaseModelStore.deserialise_model(enum_test_dict, NestedModelWithEnum) # type: ignore[type-var]
543+
544+
assert isinstance(deserialised_model, NestedModelWithEnum)
545+
assert isinstance(deserialised_model.some_enum, SomeEnum)
546+
assert deserialised_model.some_enum == SomeEnum.FIELD_TWO
547+
assert deserialised_model.some_str == "test string"
508548

509549

510550
async def test_transact_get_put_model(store: MyModelStore):

0 commit comments

Comments
 (0)