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
128 lines (99 loc) · 5.48 KB
/
Copy pathtest_cloudwatch.py
File metadata and controls
128 lines (99 loc) · 5.48 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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 parsed_event.awslogs.decoded_data.policyLevel is None
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_cloudwatch_trigger_event_no_envelope_with_policylevel():
raw_event = load_event("cloudWatchLogEventWithPolicyLevel.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 parsed_event.awslogs.decoded_data.policyLevel == "ACCOUNT_LEVEL_POLICY"
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)