Skip to content
Closed
Show file tree
Hide file tree
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 @@ -100,4 +100,157 @@ void whenResponseIsNullThenThrow() {
.hasMessageContaining("response cannot be null");
}

@Test
void whenEmptyOperationTypeThenThrow() {
assertThatThrownBy(() -> new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder().operationType("").provider(AiProvider.OLLAMA.value()).build()))
.isInstanceOf(IllegalArgumentException.class);
}

@Test
void whenEmptyProviderThenThrow() {
assertThatThrownBy(() -> new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder().operationType(AiOperationType.CHAT.value()).provider("").build()))
.isInstanceOf(IllegalArgumentException.class);
}

@Test
void whenDifferentProvidersThenReturn() {
var ollamaContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());

var openaiContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OPENAI.value())
.build());

var anthropicContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.ANTHROPIC.value())
.build());

assertThat(ollamaContext).isNotNull();
assertThat(openaiContext).isNotNull();
assertThat(anthropicContext).isNotNull();
}

@Test
void whenComplexObjectTypesAreUsedThenReturn() {
var observationContext = new ModelObservationContext<Integer, Boolean>(12345,
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());
observationContext.setResponse(true);

assertThat(observationContext).isNotNull();
}

@Test
void whenGetRequestThenReturn() {
var testRequest = "test request content";
var observationContext = new ModelObservationContext<String, String>(testRequest,
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());

assertThat(observationContext.getRequest()).isEqualTo(testRequest);
}

@Test
void whenGetResponseBeforeSettingThenReturnNull() {
var observationContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());

assertThat(observationContext.getResponse()).isNull();
}

@Test
void whenGetResponseAfterSettingThenReturn() {
var testResponse = "test response content";
var observationContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());
observationContext.setResponse(testResponse);

assertThat(observationContext.getResponse()).isEqualTo(testResponse);
}

@Test
void whenGetOperationMetadataThenReturn() {
var metadata = AiOperationMetadata.builder()
.operationType(AiOperationType.EMBEDDING.value())
.provider(AiProvider.OPENAI.value())
.build();
var observationContext = new ModelObservationContext<String, String>("test request", metadata);

assertThat(observationContext.getOperationMetadata()).isEqualTo(metadata);
}

@Test
void whenSetResponseMultipleTimesThenLastValueWins() {
var observationContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());

observationContext.setResponse("first response");
observationContext.setResponse("second response");
observationContext.setResponse("final response");

assertThat(observationContext.getResponse()).isEqualTo("final response");
}

@Test
void whenWhitespaceOnlyOperationTypeThenThrow() {
assertThatThrownBy(() -> new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder().operationType(" ").provider(AiProvider.OLLAMA.value()).build()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("operationType cannot be null or empty");
}

@Test
void whenWhitespaceOnlyProviderThenThrow() {
assertThatThrownBy(() -> new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder().operationType(AiOperationType.CHAT.value()).provider(" ").build()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("provider cannot be null or empty");
}

@Test
void whenEmptyStringRequestThenReturn() {
var observationContext = new ModelObservationContext<String, String>("",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());

assertThat(observationContext).isNotNull();
assertThat(observationContext.getRequest()).isEqualTo("");
}

@Test
void whenEmptyStringResponseThenReturn() {
var observationContext = new ModelObservationContext<String, String>("test request",
AiOperationMetadata.builder()
.operationType(AiOperationType.CHAT.value())
.provider(AiProvider.OLLAMA.value())
.build());
observationContext.setResponse("");

assertThat(observationContext.getResponse()).isEqualTo("");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,38 @@ public Map<String, Integer> getNativeUsage() {

}

@Test
void whenZeroTokenUsageThenMetrics() {
var meterRegistry = new SimpleMeterRegistry();
var usage = new TestUsage(0, 0, 0);
ModelUsageMetricsGenerator.generate(usage, buildContext(), meterRegistry);

assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value()).meters()).hasSize(3);
assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value())
.tag(AiObservationMetricAttributes.TOKEN_TYPE.value(), AiTokenType.INPUT.value())
.counter()
.count()).isEqualTo(0);
assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value())
.tag(AiObservationMetricAttributes.TOKEN_TYPE.value(), AiTokenType.OUTPUT.value())
.counter()
.count()).isEqualTo(0);
assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value())
.tag(AiObservationMetricAttributes.TOKEN_TYPE.value(), AiTokenType.TOTAL.value())
.counter()
.count()).isEqualTo(0);
}

@Test
void whenBothPromptAndGenerationNullThenOnlyTotalMetric() {
var meterRegistry = new SimpleMeterRegistry();
var usage = new TestUsage(null, null, 100);
ModelUsageMetricsGenerator.generate(usage, buildContext(), meterRegistry);

assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value()).meters()).hasSize(1);
assertThat(meterRegistry.get(AiObservationMetricNames.TOKEN_USAGE.value())
.tag(AiObservationMetricAttributes.TOKEN_TYPE.value(), AiTokenType.TOTAL.value())
.counter()
.count()).isEqualTo(100);
}

}