Skip to content

Commit 01f72a2

Browse files
Refactoring tests
1 parent f7ac013 commit 01f72a2

File tree

7 files changed

+80
-12
lines changed

7 files changed

+80
-12
lines changed

aws_lambda_powertools/utilities/data_classes/kafka_event.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from collections.abc import Iterator
1111

1212

13-
class ConsumerRecordSchemaMetadata(DictWrapper):
13+
class KafkaEventRecordSchemaMetadata(DictWrapper):
1414
@property
1515
def data_format(self) -> str | None:
1616
"""The data format of the Kafka record."""
@@ -49,19 +49,19 @@ def timestamp_type(self) -> str:
4949
return self["timestampType"]
5050

5151
@property
52-
def key_schema_metadata(self) -> ConsumerRecordSchemaMetadata | None:
52+
def key_schema_metadata(self) -> KafkaEventRecordSchemaMetadata | None:
5353
"""The metadata of the Key Kafka record."""
5454
return (
55-
None if self.get("keySchemaMetadata") is None else ConsumerRecordSchemaMetadata(self["keySchemaMetadata"])
55+
None if self.get("keySchemaMetadata") is None else KafkaEventRecordSchemaMetadata(self["keySchemaMetadata"])
5656
)
5757

5858
@property
59-
def value_schema_metadata(self) -> ConsumerRecordSchemaMetadata | None:
59+
def value_schema_metadata(self) -> KafkaEventRecordSchemaMetadata | None:
6060
"""The metadata of the Value Kafka record."""
6161
return (
6262
None
6363
if self.get("valueSchemaMetadata") is None
64-
else ConsumerRecordSchemaMetadata(self["valueSchemaMetadata"])
64+
else KafkaEventRecordSchemaMetadata(self["valueSchemaMetadata"])
6565
)
6666

6767

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
from dataclasses import is_dataclass
43
from typing import TYPE_CHECKING, Any, cast
54

65
from aws_lambda_powertools.utilities.kafka.serialization.base import OutputSerializerBase
@@ -12,7 +11,4 @@
1211

1312
class DataclassOutputSerializer(OutputSerializerBase):
1413
def serialize(self, data: dict[str, Any], output: type[T] | Callable | None = None) -> T | dict[str, Any]:
15-
if not is_dataclass(output):
16-
raise ValueError("Output class must be a dataclass")
17-
1814
return cast(T, output(**data))

aws_lambda_powertools/utilities/parser/models/kafka.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
SERVERS_DELIMITER = ","
99

1010

11+
class KafkaRecordSchemaMetadata(BaseModel):
12+
dataFormat: str
13+
schemaId: str
14+
15+
1116
class KafkaRecordModel(BaseModel):
1217
topic: str
1318
partition: int
@@ -17,6 +22,8 @@ class KafkaRecordModel(BaseModel):
1722
key: Optional[bytes] = None
1823
value: Union[str, Type[BaseModel]]
1924
headers: List[Dict[str, bytes]]
25+
keySchemaMetadata: Optional[KafkaRecordSchemaMetadata] = None
26+
valueSchemaMetadata: Optional[KafkaRecordSchemaMetadata] = None
2027

2128
# key is optional; only decode if not None
2229
@field_validator("key", mode="before")

noxfile.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def test_with_only_required_packages(session: nox.Session):
6767
f"{PREFIX_TESTS_UNIT}/data_classes/required_dependencies/",
6868
f"{PREFIX_TESTS_FUNCTIONAL}/event_handler/required_dependencies/",
6969
f"{PREFIX_TESTS_FUNCTIONAL}/batch/required_dependencies/",
70+
f"{PREFIX_TESTS_FUNCTIONAL}/kafka_consumer/required_dependencies/",
7071
],
7172
)
7273

@@ -155,11 +156,13 @@ def test_with_pydantic_required_package(session: nox.Session):
155156
# Event Handler OpenAPI
156157
# Parser
157158
# Batch Processor with pydantic integration
159+
# Kafka Consumer with Output to Pydantic
158160
build_and_run_test(
159161
session,
160162
folders=[
161163
f"{PREFIX_TESTS_FUNCTIONAL}/event_handler/_pydantic/",
162164
f"{PREFIX_TESTS_FUNCTIONAL}/batch/_pydantic/",
165+
f"{PREFIX_TESTS_FUNCTIONAL}/kafka_consumer/_pydantic/",
163166
f"{PREFIX_TESTS_UNIT}/parser/_pydantic/",
164167
f"{PREFIX_TESTS_UNIT}/event_handler/_pydantic/",
165168
],
@@ -196,3 +199,29 @@ def test_with_redis_and_boto3_sdk_as_required_package(session: nox.Session):
196199
],
197200
extras="redis,aws-sdk",
198201
)
202+
203+
204+
@nox.session()
205+
def test_with_avro_required_package(session: nox.Session):
206+
"""Tests that only depends the Avro dependency"""
207+
# Kafka Consumer with AVRO
208+
build_and_run_test(
209+
session,
210+
folders=[
211+
f"{PREFIX_TESTS_FUNCTIONAL}/kafka_consumer/_avro/",
212+
],
213+
extras="kafka-consumer-avro",
214+
)
215+
216+
217+
@nox.session()
218+
def test_with_protobuf_required_package(session: nox.Session):
219+
"""Tests that only depends the Protobuf dependency"""
220+
# Kafka Consumer with PROTOBUF
221+
build_and_run_test(
222+
session,
223+
folders=[
224+
f"{PREFIX_TESTS_FUNCTIONAL}/kafka_consumer/_protobuf/",
225+
],
226+
extras="kafka-consumer-protobuf",
227+
)

tests/events/kafkaEventMsk.json

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,15 @@
2828
101
2929
]
3030
}
31-
]
31+
],
32+
"valueSchemaMetadata": {
33+
"dataFormat": "AVRO",
34+
"schemaId": "1234"
35+
},
36+
"keySchemaMetadata": {
37+
"dataFormat": "AVRO",
38+
"schemaId": "1234"
39+
}
3240
},
3341
{
3442
"topic":"mytopic",
@@ -53,7 +61,15 @@
5361
101
5462
]
5563
}
56-
]
64+
],
65+
"valueSchemaMetadata": {
66+
"dataFormat": "AVRO",
67+
"schemaId": "1234"
68+
},
69+
"keySchemaMetadata": {
70+
"dataFormat": "AVRO",
71+
"schemaId": "1234"
72+
}
5773
},
5874
{
5975
"topic":"mytopic",
@@ -79,7 +95,15 @@
7995
101
8096
]
8197
}
82-
]
98+
],
99+
"valueSchemaMetadata": {
100+
"dataFormat": "AVRO",
101+
"schemaId": "1234"
102+
},
103+
"keySchemaMetadata": {
104+
"dataFormat": "AVRO",
105+
"schemaId": "1234"
106+
}
83107
}
84108
]
85109
}

tests/unit/data_classes/required_dependencies/test_kafka_event.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ def test_kafka_msk_event():
3434
assert record.json_value == {"key": "value"}
3535
assert record.decoded_headers == {"headerKey": b"headerValue"}
3636
assert record.decoded_headers["HeaderKey"] == b"headerValue"
37+
assert record.key_schema_metadata.data_format == raw_record["keySchemaMetadata"]["dataFormat"]
38+
assert record.key_schema_metadata.schema_id == raw_record["keySchemaMetadata"]["schemaId"]
39+
assert record.value_schema_metadata.data_format == raw_record["valueSchemaMetadata"]["dataFormat"]
40+
assert record.value_schema_metadata.schema_id == raw_record["valueSchemaMetadata"]["schemaId"]
3741

3842
assert parsed_event.record == records[0]
3943
for i in range(1, 3):
@@ -68,6 +72,8 @@ def test_kafka_self_managed_event():
6872
assert record.json_value == {"key": "value"}
6973
assert record.decoded_headers == {"headerKey": b"headerValue"}
7074
assert record.decoded_headers["HeaderKey"] == b"headerValue"
75+
assert record.key_schema_metadata is None
76+
assert record.value_schema_metadata is None
7177

7278
assert parsed_event.record == records[0]
7379

tests/unit/parser/_pydantic/test_kafka.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ def test_self_managed_kafka_event():
5555
assert record.value == '{"key":"value"}'
5656
assert len(record.headers) == 1
5757
assert record.headers[0]["headerKey"] == b"headerValue"
58+
assert record.keySchemaMetadata is None
59+
assert record.valueSchemaMetadata is None
5860
record: KafkaRecordModel = records[1]
5961
assert record.key is None
6062

@@ -82,6 +84,10 @@ def test_kafka_msk_event():
8284
assert record.value == '{"key":"value"}'
8385
assert len(record.headers) == 1
8486
assert record.headers[0]["headerKey"] == b"headerValue"
87+
assert record.keySchemaMetadata.dataFormat == "AVRO"
88+
assert record.keySchemaMetadata.schemaId == "1234"
89+
assert record.valueSchemaMetadata.dataFormat == "AVRO"
90+
assert record.valueSchemaMetadata.schemaId == "1234"
8591
for i in range(1, 3):
8692
record: KafkaRecordModel = records[i]
8793
assert record.key is None

0 commit comments

Comments
 (0)