Skip to content

Commit d1fce6c

Browse files
committed
Added some basic unit tests
1 parent e2d39f0 commit d1fce6c

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed

tests/test_sentry_logs.py

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import random
2+
from unittest import mock
3+
4+
from sentry_sdk import _experimental_logger as sentry_logger
5+
6+
7+
def test_logs_disabled_by_default(sentry_init, capture_envelopes):
8+
sentry_init()
9+
envelopes = capture_envelopes()
10+
11+
sentry_logger.trace("This is a 'trace' log...{rand}", rand=random.randint(0, 100))
12+
sentry_logger.debug("This is a 'debug' log... ({rand})", rand=random.randint(0, 100))
13+
sentry_logger.info("This is a 'info' log... ({rand})", rand=random.randint(0, 100))
14+
sentry_logger.warn("This is a 'warn' log... ({rand})", rand=random.randint(0, 100))
15+
sentry_logger.error("This is a 'error' log... ({rand})", rand=random.randint(0, 100))
16+
sentry_logger.fatal("This is a 'fatal' log... ({rand})", rand=random.randint(0, 100))
17+
18+
assert len(envelopes) == 0
19+
20+
21+
def test_logs_basics(sentry_init, capture_envelopes):
22+
sentry_init(enable_sentry_logs=True)
23+
envelopes = capture_envelopes()
24+
25+
sentry_logger.trace("This is a 'trace' log... {rand}", rand=random.randint(0, 100))
26+
sentry_logger.debug("This is a 'debug' log... {rand}", rand=random.randint(0, 100))
27+
sentry_logger.info("This is a 'info' log... {rand}", rand=random.randint(0, 100))
28+
sentry_logger.warn("This is a 'warn' log... {rand}", rand=random.randint(0, 100))
29+
sentry_logger.error("This is a 'error' log... {rand}", rand=random.randint(0, 100))
30+
sentry_logger.fatal("This is a 'fatal' log... {rand}", rand=random.randint(0, 100))
31+
32+
assert len(envelopes) == 6 # We will batch those log items into a single envelope at some point
33+
assert envelopes[0].items[0].payload.json["severityText"] == "trace"
34+
assert envelopes[0].items[0].payload.json["severityNumber"] == 1
35+
36+
assert envelopes[1].items[0].payload.json["severityText"] == "debug"
37+
assert envelopes[1].items[0].payload.json["severityNumber"] == 5
38+
39+
assert envelopes[2].items[0].payload.json["severityText"] == "info"
40+
assert envelopes[2].items[0].payload.json["severityNumber"] == 9
41+
42+
assert envelopes[3].items[0].payload.json["severityText"] == "warn"
43+
assert envelopes[3].items[0].payload.json["severityNumber"] == 13
44+
45+
assert envelopes[4].items[0].payload.json["severityText"] == "error"
46+
assert envelopes[4].items[0].payload.json["severityNumber"] == 17
47+
48+
assert envelopes[5].items[0].payload.json["severityText"] == "fatal"
49+
assert envelopes[5].items[0].payload.json["severityNumber"] == 21
50+
51+
52+
def test_logs_before_emit_log(sentry_init, capture_envelopes):
53+
def _before_log(record, hint):
54+
assert list(record.keys()) == ['severity_text', 'severity_number', 'body', 'attributes', 'time_unix_nano', 'trace_id']
55+
56+
if record['severity_text'] in ['fatal', 'error']:
57+
return None
58+
59+
return record
60+
61+
sentry_init(
62+
enable_sentry_logs=True,
63+
before_emit_log=_before_log,
64+
)
65+
66+
envelopes = capture_envelopes()
67+
68+
sentry_logger.trace("This is a 'trace' log... {rand}", rand=random.randint(0, 100))
69+
sentry_logger.debug("This is a 'debug' log... {rand}", rand=random.randint(0, 100))
70+
sentry_logger.info("This is a 'info' log... {rand}", rand=random.randint(0, 100))
71+
sentry_logger.warn("This is a 'warn' log... {rand}", rand=random.randint(0, 100))
72+
sentry_logger.error("This is a 'error' log... {rand}", rand=random.randint(0, 100))
73+
sentry_logger.fatal("This is a 'fatal' log... {rand}", rand=random.randint(0, 100))
74+
75+
assert len(envelopes) == 4
76+
77+
assert envelopes[0].items[0].payload.json["severityText"] == "trace"
78+
assert envelopes[1].items[0].payload.json["severityText"] == "debug"
79+
assert envelopes[2].items[0].payload.json["severityText"] == "info"
80+
assert envelopes[3].items[0].payload.json["severityText"] == "warn"
81+
82+
83+
def test_logs_attributes(sentry_init, capture_envelopes):
84+
sentry_init(enable_sentry_logs=True)
85+
86+
envelopes = capture_envelopes()
87+
88+
attrs = {
89+
"attr_int": 1,
90+
"attr_float": 2.0,
91+
"attr_bool": True,
92+
"attr_string": "string attribute",
93+
}
94+
95+
sentry_logger.warn("The recorded value was '{my_var}'", my_var="some value", attributes=attrs)
96+
97+
log_item = envelopes[0].items[0].payload.json
98+
assert log_item["body"]["stringValue"] == "The recorded value was 'some value'"
99+
100+
assert log_item["attributes"][1] == {"key": "attr_int", "value": {"intValue": "1"}} # ???
101+
assert log_item["attributes"][2] == {"key": "attr_float", "value": {"doubleValue": 2.0}}
102+
assert log_item["attributes"][3] == {"key": "attr_bool", "value": {"intValue": "True"}} # ???
103+
assert log_item["attributes"][4] == {"key": "attr_string", "value": {"stringValue": "string attribute"}}
104+
assert log_item["attributes"][5] == {"key": "sentry.environment", "value": {"stringValue": "production"}}
105+
assert log_item["attributes"][6] == {"key": "sentry.release", "value": {"stringValue": mock.ANY}}
106+
assert log_item["attributes"][7] == {"key": "sentry.message.parameters.my_var", "value": {"stringValue": "some value"}}
107+
108+
109+
def test_logs_message_params(sentry_init, capture_envelopes):
110+
sentry_init(enable_sentry_logs=True)
111+
112+
envelopes = capture_envelopes()
113+
114+
sentry_logger.warn("The recorded value was '{int_var}'", int_var=1)
115+
sentry_logger.warn("The recorded value was '{float_var}'", float_var=2.0)
116+
sentry_logger.warn("The recorded value was '{bool_var}'", bool_var=False)
117+
sentry_logger.warn("The recorded value was '{string_var}'", string_var="some string value")
118+
119+
assert envelopes[0].items[0].payload.json["body"]["stringValue"] == "The recorded value was '1'"
120+
assert envelopes[0].items[0].payload.json["attributes"][-1] == {"key": "sentry.message.parameters.int_var", "value": {'intValue': "1"}} # ???
121+
122+
assert envelopes[1].items[0].payload.json["body"]["stringValue"] == "The recorded value was '2.0'"
123+
assert envelopes[1].items[0].payload.json["attributes"][-1] == {"key": "sentry.message.parameters.float_var", "value": {'doubleValue': 2.0}}
124+
125+
assert envelopes[2].items[0].payload.json["body"]["stringValue"] == "The recorded value was 'False'"
126+
assert envelopes[2].items[0].payload.json["attributes"][-1] == {"key": "sentry.message.parameters.bool_var", "value": {'intValue': "False"}} # ???
127+
128+
assert envelopes[3].items[0].payload.json["body"]["stringValue"] == "The recorded value was 'some string value'"
129+
assert envelopes[3].items[0].payload.json["attributes"][-1] == {"key": "sentry.message.parameters.string_var", "value": {'stringValue': "some string value"}}
130+
131+
132+
def test_logs_message_old_style(sentry_init, capture_envelopes):
133+
sentry_init(enable_sentry_logs=True)
134+
135+
envelopes = capture_envelopes()
136+
137+
sentry_logger.warn("The recorded value was '%s'" % 1)
138+
139+
assert envelopes[0].items[0].payload.json["body"]["stringValue"] == "The recorded value was '1'"
140+
assert envelopes[0].items[0].payload.json["attributes"][-1] == {"key": "sentry.release", "value": {"stringValue": mock.ANY}} # no parametrization!
141+
142+
143+
def test_logs_message_format(sentry_init, capture_envelopes):
144+
sentry_init(enable_sentry_logs=True)
145+
146+
envelopes = capture_envelopes()
147+
148+
sentry_logger.warn("The recorded value was '{int_var}'".format(int_var=1))
149+
150+
assert envelopes[0].items[0].payload.json["body"]["stringValue"] == "The recorded value was '1'"
151+
assert envelopes[0].items[0].payload.json["attributes"][-1] == {"key": "sentry.release", "value": {"stringValue": mock.ANY}} # no parametrization!
152+
153+
154+
def test_logs_message_f_string(sentry_init, capture_envelopes):
155+
sentry_init(enable_sentry_logs=True)
156+
157+
envelopes = capture_envelopes()
158+
159+
int_var = 1
160+
sentry_logger.warn(f"The recorded value was '{int_var}'")
161+
162+
assert envelopes[0].items[0].payload.json["body"]["stringValue"] == "The recorded value was '1'"
163+
assert envelopes[0].items[0].payload.json["attributes"][-1] == {"key": "sentry.release", "value": {"stringValue": mock.ANY}} # no parametrization!
164+
165+
166+
def test_logs_message_python_logging(sentry_init, capture_envelopes):
167+
sentry_init(enable_sentry_logs=True)
168+
169+
envelopes = capture_envelopes()
170+
171+
try:
172+
sentry_logger.warn(f"The recorded value was '%s'", 1)
173+
except Exception as ex:
174+
# This is when users just replace the existing call to Python logging method, with the new Sentry logging method.
175+
# This is a very confusing error message to explain what is wrong here.
176+
assert str(ex) == "capture_log() takes 3 positional arguments but 4 were given"

0 commit comments

Comments
 (0)