Skip to content

Commit b302a67

Browse files
authored
fix ResponseMetaDataTransformer (#13)
1 parent 1fd8000 commit b302a67

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

localstack_snapshot/snapshots/transformer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,14 @@ def transform(self, input_data: dict, *, ctx: TransformContext) -> dict:
102102
if k == "ResponseMetadata":
103103
metadata = v
104104
http_headers = metadata.get("HTTPHeaders")
105+
if not isinstance(http_headers, dict):
106+
continue
107+
105108
# TODO "x-amz-bucket-region"
106109
# TestS3.test_region_header_exists -> verifies bucket-region
110+
111+
# FIXME: proper value is `content-type` with no underscore in lowercase, but this will necessitate a
112+
# refresh of all snapshots
107113
headers_to_collect = ["content_type"]
108114
simplified_headers = {}
109115
for h in headers_to_collect:

tests/test_transformer.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from localstack_snapshot.snapshots.transformer import (
77
JsonStringTransformer,
8+
ResponseMetaDataTransformer,
89
SortingTransformer,
910
TimestampTransformer,
1011
TransformContext,
@@ -405,3 +406,81 @@ def test_generic_timestamp_transformer(self):
405406
ctx = TransformContext()
406407
output = transformer.transform(input, ctx=ctx)
407408
assert output == expected
409+
410+
411+
class TestResponseMetaDataTransformer:
412+
def test_with_headers(self):
413+
input_data = {"ResponseMetadata": {"HTTPHeaders": {"header1": "value1"}}}
414+
415+
metadata_transformer = ResponseMetaDataTransformer()
416+
417+
expected_key_value = {"ResponseMetadata": {"HTTPHeaders": {}}}
418+
419+
copied = copy.deepcopy(input_data)
420+
ctx = TransformContext()
421+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
422+
assert ctx.serialized_replacements == []
423+
424+
def test_with_headers_and_status_code(self):
425+
input_data = {
426+
"ResponseMetadata": {"HTTPHeaders": {"header1": "value1"}, "HTTPStatusCode": 500}
427+
}
428+
429+
metadata_transformer = ResponseMetaDataTransformer()
430+
431+
expected_key_value = {"ResponseMetadata": {"HTTPHeaders": {}, "HTTPStatusCode": 500}}
432+
433+
copied = copy.deepcopy(input_data)
434+
ctx = TransformContext()
435+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
436+
assert ctx.serialized_replacements == []
437+
438+
def test_with_status_code_only(self):
439+
input_data = {"ResponseMetadata": {"HTTPStatusCode": 500, "RandomData": "random"}}
440+
441+
metadata_transformer = ResponseMetaDataTransformer()
442+
443+
expected_key_value = {"ResponseMetadata": {"HTTPStatusCode": 500, "RandomData": "random"}}
444+
445+
copied = copy.deepcopy(input_data)
446+
ctx = TransformContext()
447+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
448+
assert ctx.serialized_replacements == []
449+
450+
def test_with_empty_response_metadata(self):
451+
input_data = {"ResponseMetadata": {"NotHeaders": "data"}}
452+
453+
metadata_transformer = ResponseMetaDataTransformer()
454+
455+
expected_key_value = {"ResponseMetadata": {"NotHeaders": "data"}}
456+
457+
copied = copy.deepcopy(input_data)
458+
ctx = TransformContext()
459+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
460+
assert ctx.serialized_replacements == []
461+
462+
def test_with_headers_wrong_type(self):
463+
input_data = {"ResponseMetadata": {"HTTPHeaders": "data"}}
464+
465+
metadata_transformer = ResponseMetaDataTransformer()
466+
467+
expected_key_value = {"ResponseMetadata": {"HTTPHeaders": "data"}}
468+
469+
copied = copy.deepcopy(input_data)
470+
ctx = TransformContext()
471+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
472+
assert ctx.serialized_replacements == []
473+
474+
def test_headers_filtering(self):
475+
input_data = {
476+
"ResponseMetadata": {"HTTPHeaders": {"content_type": "value1", "header1": "value1"}}
477+
}
478+
479+
metadata_transformer = ResponseMetaDataTransformer()
480+
481+
expected_key_value = {"ResponseMetadata": {"HTTPHeaders": {"content_type": "value1"}}}
482+
483+
copied = copy.deepcopy(input_data)
484+
ctx = TransformContext()
485+
assert metadata_transformer.transform(copied, ctx=ctx) == expected_key_value
486+
assert ctx.serialized_replacements == []

0 commit comments

Comments
 (0)