Skip to content

Commit 3fb6692

Browse files
jonatan-ivanovtzolov
authored andcommitted
Add missing observability tests
Some tests were missing from gh-3003, this change adds them See gh-3003
1 parent 0bcb2e1 commit 3fb6692

File tree

5 files changed

+754
-37
lines changed

5 files changed

+754
-37
lines changed

auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/test/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientObservationAutoConfigurationTests.java

Lines changed: 118 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@
1818

1919
import io.micrometer.tracing.Tracer;
2020
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.api.extension.ExtendWith;
22+
import org.springframework.ai.chat.client.observation.ChatClientObservationContext;
2123
import org.springframework.ai.chat.client.observation.ChatClientPromptContentObservationHandler;
24+
import org.springframework.ai.observation.TracingAwareLoggingObservationHandler;
2225
import org.springframework.boot.autoconfigure.AutoConfigurations;
2326
import org.springframework.boot.test.context.FilteredClassLoader;
2427
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
28+
import org.springframework.boot.test.system.CapturedOutput;
29+
import org.springframework.boot.test.system.OutputCaptureExtension;
30+
import org.springframework.context.annotation.Bean;
31+
import org.springframework.context.annotation.Configuration;
2532

2633
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.mockito.Mockito.mock;
2735

2836
/**
2937
* Unit tests for {@link ChatClientAutoConfiguration} observability support.
@@ -32,22 +40,127 @@
3240
* @author Thomas Vitale
3341
* @author Jonatan Ivanov
3442
*/
43+
@ExtendWith(OutputCaptureExtension.class)
3544
class ChatClientObservationAutoConfigurationTests {
3645

3746
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
3847
.withConfiguration(AutoConfigurations.of(ChatClientAutoConfiguration.class));
3948

4049
@Test
41-
void promptContentHandlerDefault() {
42-
this.contextRunner
43-
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class));
50+
void promptContentHandlerNoTracer() {
51+
this.contextRunner.withClassLoader(new FilteredClassLoader(Tracer.class))
52+
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class)
53+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
54+
}
55+
56+
@Test
57+
void promptContentHandlerWithTracer() {
58+
this.contextRunner.withUserConfiguration(TracerConfiguration.class)
59+
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class)
60+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
4461
}
4562

4663
@Test
47-
void promptContentHandlerEnabled() {
64+
void promptContentHandlerEnabledNoTracer(CapturedOutput output) {
4865
this.contextRunner.withClassLoader(new FilteredClassLoader(Tracer.class))
4966
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=true")
50-
.run(context -> assertThat(context).hasSingleBean(ChatClientPromptContentObservationHandler.class));
67+
.run(context -> assertThat(context).hasSingleBean(ChatClientPromptContentObservationHandler.class)
68+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
69+
assertThat(output).contains(
70+
"You have enabled logging out the ChatClient prompt content with the risk of exposing sensitive or private information. Please, be careful!");
71+
}
72+
73+
@Test
74+
void promptContentHandlerEnabledWithTracer(CapturedOutput output) {
75+
this.contextRunner.withUserConfiguration(TracerConfiguration.class)
76+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=true")
77+
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class)
78+
.hasSingleBean(TracingAwareLoggingObservationHandler.class));
79+
assertThat(output).contains(
80+
"You have enabled logging out the ChatClient prompt content with the risk of exposing sensitive or private information. Please, be careful!");
81+
}
82+
83+
@Test
84+
void promptContentHandlerDisabledNoTracer() {
85+
this.contextRunner.withClassLoader(new FilteredClassLoader(Tracer.class))
86+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=false")
87+
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class)
88+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
89+
}
90+
91+
@Test
92+
void promptContentHandlerDisabledWithTracer() {
93+
this.contextRunner.withUserConfiguration(TracerConfiguration.class)
94+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=false")
95+
.run(context -> assertThat(context).doesNotHaveBean(ChatClientPromptContentObservationHandler.class)
96+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
97+
}
98+
99+
@Test
100+
void customChatClientPromptContentObservationHandlerNoTracer() {
101+
this.contextRunner.withClassLoader(new FilteredClassLoader(Tracer.class))
102+
.withUserConfiguration(CustomChatClientPromptContentObservationHandlerConfiguration.class)
103+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=true")
104+
.run(context -> assertThat(context).hasSingleBean(ChatClientPromptContentObservationHandler.class)
105+
.hasBean("customChatClientPromptContentObservationHandler")
106+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
107+
}
108+
109+
@Test
110+
void customChatClientPromptContentObservationHandlerWithTracer() {
111+
this.contextRunner.withUserConfiguration(TracerConfiguration.class)
112+
.withUserConfiguration(CustomChatClientPromptContentObservationHandlerConfiguration.class)
113+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=true")
114+
.run(context -> assertThat(context).hasSingleBean(ChatClientPromptContentObservationHandler.class)
115+
.hasBean("customChatClientPromptContentObservationHandler")
116+
.doesNotHaveBean(TracingAwareLoggingObservationHandler.class));
117+
}
118+
119+
@Test
120+
void customTracingAwareLoggingObservationHandler() {
121+
this.contextRunner.withUserConfiguration(TracerConfiguration.class)
122+
.withUserConfiguration(CustomTracingAwareLoggingObservationHandlerConfiguration.class)
123+
.withPropertyValues("spring.ai.chat.client.observations.log-prompt=true")
124+
.run(context -> {
125+
assertThat(context).hasSingleBean(TracingAwareLoggingObservationHandler.class)
126+
.hasBean("chatClientPromptContentObservationHandler")
127+
.doesNotHaveBean(ChatClientPromptContentObservationHandler.class);
128+
assertThat(context.getBean(TracingAwareLoggingObservationHandler.class))
129+
.isSameAs(CustomTracingAwareLoggingObservationHandlerConfiguration.handlerInstance);
130+
});
131+
}
132+
133+
@Configuration(proxyBeanMethods = false)
134+
static class TracerConfiguration {
135+
136+
@Bean
137+
Tracer tracer() {
138+
return mock(Tracer.class);
139+
}
140+
141+
}
142+
143+
@Configuration(proxyBeanMethods = false)
144+
static class CustomChatClientPromptContentObservationHandlerConfiguration {
145+
146+
@Bean
147+
ChatClientPromptContentObservationHandler customChatClientPromptContentObservationHandler() {
148+
return new ChatClientPromptContentObservationHandler();
149+
}
150+
151+
}
152+
153+
@Configuration(proxyBeanMethods = false)
154+
static class CustomTracingAwareLoggingObservationHandlerConfiguration {
155+
156+
static TracingAwareLoggingObservationHandler<ChatClientObservationContext> handlerInstance = new TracingAwareLoggingObservationHandler<>(
157+
new ChatClientPromptContentObservationHandler(), null);
158+
159+
@Bean
160+
TracingAwareLoggingObservationHandler<ChatClientObservationContext> chatClientPromptContentObservationHandler() {
161+
return handlerInstance;
162+
}
163+
51164
}
52165

53166
}

0 commit comments

Comments
 (0)