Skip to content

Commit 2772a29

Browse files
committed
Use pytest pytest-vcr for google-genai tests
1 parent e654b89 commit 2772a29

File tree

8 files changed

+1061
-0
lines changed

8 files changed

+1061
-0
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
16+
from opentelemetry.sdk._logs.export import (
17+
InMemoryLogExporter,
18+
)
19+
from opentelemetry.sdk.metrics.export import (
20+
InMemoryMetricReader,
21+
)
22+
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
23+
InMemorySpanExporter,
24+
)
25+
26+
27+
class _LogWrapper:
28+
def __init__(self, log_data):
29+
self._log_data = log_data
30+
31+
@property
32+
def scope(self):
33+
return self._log_data.instrumentation_scope
34+
35+
@property
36+
def resource(self):
37+
return self._log_data.log_record.resource
38+
39+
@property
40+
def attributes(self):
41+
return self._log_data.log_record.attributes
42+
43+
@property
44+
def body(self):
45+
return self._log_data.log_record.body
46+
47+
def __str__(self):
48+
return self._log_data.log_record.to_json()
49+
50+
51+
class _MetricDataPointWrapper:
52+
def __init__(self, resource, scope, metric):
53+
self._resource = resource
54+
self._scope = scope
55+
self._metric = metric
56+
57+
@property
58+
def resource(self):
59+
return self._resource
60+
61+
@property
62+
def scope(self):
63+
return self._scope
64+
65+
@property
66+
def metric(self):
67+
return self._metric
68+
69+
@property
70+
def name(self):
71+
return self._metric.name
72+
73+
@property
74+
def data(self):
75+
return self._metric.data
76+
77+
78+
class OTelAssertions:
79+
def __init__(
80+
self,
81+
logs_exporter: InMemoryLogExporter,
82+
span_exporter: InMemorySpanExporter,
83+
metric_reader: InMemoryMetricReader,
84+
):
85+
self._logs = logs_exporter
86+
self._traces = span_exporter
87+
self._metrics = metric_reader
88+
self._spans = []
89+
self._finished_logs = []
90+
self._metrics_data = []
91+
92+
def get_finished_logs(self):
93+
for log_data in self._logs.get_finished_logs():
94+
self._finished_logs.append(_LogWrapper(log_data))
95+
return self._finished_logs
96+
97+
def get_finished_spans(self):
98+
for span in self._traces.get_finished_spans():
99+
self._spans.append(span)
100+
return self._spans
101+
102+
def get_metrics_data(self):
103+
data = self._metrics.get_metrics_data()
104+
if data is not None:
105+
for resource_metric in data.resource_metrics:
106+
resource = resource_metric.resource
107+
for scope_metrics in resource_metric.scope_metrics:
108+
scope = scope_metrics.scope
109+
for metric in scope_metrics.metrics:
110+
wrapper = _MetricDataPointWrapper(
111+
resource, scope, metric
112+
)
113+
self._metrics_data.append(wrapper)
114+
return self._metrics_data
115+
116+
def get_span_named(self, name):
117+
for span in self.get_finished_spans():
118+
if span.name == name:
119+
return span
120+
return None
121+
122+
def assert_has_span_named(self, name):
123+
span = self.get_span_named(name)
124+
finished_spans = [span.name for span in self.get_finished_spans()]
125+
assert span is not None, (
126+
f'Could not find span named "{name}"; finished spans: {finished_spans}'
127+
)
128+
129+
def get_event_named(self, event_name):
130+
for event in self.get_finished_logs():
131+
event_name_attr = event.attributes.get("event.name")
132+
if event_name_attr is None:
133+
continue
134+
if event_name_attr == event_name:
135+
return event
136+
return None
137+
138+
def assert_has_event_named(self, name):
139+
event = self.get_event_named(name)
140+
finished_logs = self.get_finished_logs()
141+
assert event is not None, (
142+
f'Could not find event named "{name}"; finished logs: {finished_logs}'
143+
)
144+
145+
def assert_does_not_have_event_named(self, name):
146+
event = self.get_event_named(name)
147+
assert event is None, f"Unexpected event: {event}"
148+
149+
def get_metrics_data_named(self, name):
150+
results = []
151+
for entry in self.get_metrics_data():
152+
if entry.name == name:
153+
results.append(entry)
154+
return results
155+
156+
def assert_has_metrics_data_named(self, name):
157+
data = self.get_metrics_data_named(name)
158+
assert len(data) > 0

0 commit comments

Comments
 (0)