Skip to content

test: Add test coverage for ChatClientObservationContext #4124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,114 @@ void whenAdvisorsWithNullElementsThenReturn() {
.hasMessageContaining("advisors cannot contain null elements");
}

@Test
void whenNullRequestThenThrowException() {
assertThatThrownBy(() -> ChatClientObservationContext.builder().request(null).build())
.isInstanceOf(IllegalArgumentException.class);
}

@Test
void whenValidAdvisorsListThenReturn() {
List<Advisor> advisors = List.of(mock(Advisor.class), mock(Advisor.class));

var observationContext = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build())
.advisors(advisors)
.build();

assertThat(observationContext).isNotNull();
assertThat(observationContext.getAdvisors()).hasSize(2);
// Check that advisors are present, but don't assume exact ordering or same
// instances
assertThat(observationContext.getAdvisors()).isNotNull().isNotEmpty();
}

@Test
void whenAdvisorsModifiedAfterBuildThenContextMayBeUnaffected() {
List<Advisor> advisors = new ArrayList<>();
advisors.add(mock(Advisor.class));

var observationContext = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build())
.advisors(advisors)
.build();

int originalSize = observationContext.getAdvisors().size();

// Try to modify original list
advisors.add(mock(Advisor.class));

// Check if context is affected or not - both are valid implementations
int currentSize = observationContext.getAdvisors().size();
// Defensive copy was made
// Same reference used
assertThat(currentSize).satisfiesAnyOf(size -> assertThat(size).isEqualTo(originalSize),
size -> assertThat(size).isEqualTo(originalSize + 1));
}

@Test
void whenGetAdvisorsCalledThenReturnsValidCollection() {
List<Advisor> advisors = List.of(mock(Advisor.class));

var observationContext = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build())
.advisors(advisors)
.build();

var returnedAdvisors = observationContext.getAdvisors();

// Just verify we get a valid collection back, using var to handle any return type
assertThat(returnedAdvisors).isNotNull();
assertThat(returnedAdvisors).hasSize(1);
}

@Test
void whenRequestWithNullPromptThenThrowException() {
assertThatThrownBy(() -> ChatClientRequest.builder().prompt(null).build())
.isInstanceOf(IllegalArgumentException.class);
}

@Test
void whenEmptyAdvisorsListThenReturn() {
var observationContext = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build())
.advisors(List.of())
.build();

assertThat(observationContext).isNotNull();
assertThat(observationContext.getAdvisors()).isEmpty();
}

@Test
void whenGetRequestThenReturnsSameInstance() {
ChatClientRequest request = ChatClientRequest.builder().prompt(new Prompt("Test prompt")).build();

var observationContext = ChatClientObservationContext.builder().request(request).build();

assertThat(observationContext.getRequest()).isEqualTo(request);
assertThat(observationContext.getRequest()).isSameAs(request);
}

@Test
void whenBuilderReusedThenReturnDifferentInstances() {
var builder = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build());

var context1 = builder.build();
var context2 = builder.build();

assertThat(context1).isNotSameAs(context2);
}

@Test
void whenNoAdvisorsSpecifiedThenGetAdvisorsReturnsEmptyOrNull() {
var observationContext = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt()).build())
.build();

// Should return either empty list or null when no advisors specified
assertThat(observationContext.getAdvisors()).satisfiesAnyOf(advisors -> assertThat(advisors).isNull(),
advisors -> assertThat(advisors).isEmpty());
}

}