forked from aws-powertools/powertools-lambda-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_cloudwatch.py
More file actions
97 lines (75 loc) · 3.79 KB
/
test_cloudwatch.py
File metadata and controls
97 lines (75 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import base64
import json
import zlib
from typing import Any
import pytest
from aws_lambda_powertools.utilities.parser import ValidationError, envelopes, parse
from aws_lambda_powertools.utilities.parser.models import (
CloudWatchLogsLogEvent,
CloudWatchLogsModel,
)
from tests.functional.utils import load_event
from tests.unit.parser.schemas import MyCloudWatchBusiness
def decode_cloudwatch_raw_event(event: dict):
payload = base64.b64decode(event)
uncompressed = zlib.decompress(payload, zlib.MAX_WBITS | 32)
return json.loads(uncompressed.decode("utf-8"))
def test_validate_event_user_model_with_envelope():
my_log_message = {"my_message": "hello", "user": "test"}
inner_event_dict = {
"messageType": "DATA_MESSAGE",
"owner": "123456789123",
"logGroup": "testLogGroup",
"logStream": "testLogStream",
"subscriptionFilters": ["testFilter"],
"logEvents": [{"id": "eventId1", "timestamp": 1440442987000, "message": json.dumps(my_log_message)}],
}
dict_str = json.dumps(inner_event_dict)
compressesd_str = zlib.compress(str.encode(dict_str), -1)
raw_event = {"awslogs": {"data": base64.b64encode(compressesd_str)}}
parsed_event: MyCloudWatchBusiness = parse(
event=raw_event,
model=MyCloudWatchBusiness,
envelope=envelopes.CloudWatchLogsEnvelope,
)
assert len(parsed_event) == 1
log: MyCloudWatchBusiness = parsed_event[0]
assert log.my_message == "hello"
assert log.user == "test"
def test_validate_event_does_not_conform_with_user_dict_model():
event_dict = load_event("cloudWatchLogEvent.json")
with pytest.raises(ValidationError):
MyCloudWatchBusiness(**event_dict)
def test_handle_cloudwatch_trigger_event_no_envelope():
raw_event = load_event("cloudWatchLogEvent.json")
parsed_event: CloudWatchLogsModel = CloudWatchLogsModel(**raw_event)
raw_event_decoded = decode_cloudwatch_raw_event(raw_event["awslogs"]["data"])
assert parsed_event.awslogs.decoded_data.owner == raw_event_decoded["owner"]
assert parsed_event.awslogs.decoded_data.logGroup == raw_event_decoded["logGroup"]
assert parsed_event.awslogs.decoded_data.logStream == raw_event_decoded["logStream"]
assert parsed_event.awslogs.decoded_data.subscriptionFilters == raw_event_decoded["subscriptionFilters"]
assert parsed_event.awslogs.decoded_data.messageType == raw_event_decoded["messageType"]
assert len(parsed_event.awslogs.decoded_data.logEvents) == 2
log_record: CloudWatchLogsLogEvent = parsed_event.awslogs.decoded_data.logEvents[0]
raw_log_record = raw_event_decoded["logEvents"][0]
assert log_record.id == raw_log_record["id"]
convert_time = int(round(log_record.timestamp.timestamp() * 1000))
assert convert_time == raw_log_record["timestamp"]
assert log_record.message == raw_log_record["message"]
log_record: CloudWatchLogsLogEvent = parsed_event.awslogs.decoded_data.logEvents[1]
raw_log_record = raw_event_decoded["logEvents"][1]
assert log_record.id == raw_log_record["id"]
convert_time = int(round(log_record.timestamp.timestamp() * 1000))
assert convert_time == raw_log_record["timestamp"]
assert log_record.message == raw_log_record["message"]
def test_handle_invalid_cloudwatch_trigger_event_no_envelope():
raw_event: Any = {"awslogs": {"data": "invalid_data"}}
with pytest.raises(ValidationError) as context:
CloudWatchLogsModel(**raw_event)
# Pydantic v2 adds "Value error," to the error string.
# So to maintain compatibility with v1 and v2, we've changed the way we test this.
assert "unable to decompress data" in context.value.errors()[0]["msg"]
def test_handle_invalid_event_with_envelope():
empty_dict = {}
with pytest.raises(ValidationError):
CloudWatchLogsModel(**empty_dict)