tests: add integration tests to cover both 😁 and 🥲 paths when counting message tokens

This commit is contained in:
Stevan Freeborn
2025-01-02 20:41:12 -06:00
parent 4fe8bfaf0e
commit a23938961f
2 changed files with 103 additions and 4 deletions
@@ -418,4 +418,89 @@ public class AnthropicApiClientTests : IntegrationTest
textContent.As<TextContent>().Text.Should().Be("It is a PDF");
textContent.As<TextContent>().Type.Should().Be("text");
}
[Fact]
public async Task CountMessageTokensAsync_WhenCalled_ItShouldReturnCountTokensResponse()
{
_mockHttpMessageHandler
.WhenCountMessageTokensRequest()
.Respond(
HttpStatusCode.OK,
"application/json",
@"{
""input_tokens"": 10
}"
);
var request = new CountMessageTokensRequest(
model: AnthropicModels.Claude35Sonnet,
messages: [
new(MessageRole.User, [new TextContent("Hello!")]),
]
);
var result = await Client.CountMessageTokensAsync(request);
result.IsSuccess.Should().BeTrue();
result.Value.Should().BeOfType<TokenCountResponse>();
result.Value.InputTokens.Should().Be(10);
}
[Fact]
public async Task CountMessageTokensAsync_WhenCalledAndErrorReturned_ItShouldHandleError()
{
_mockHttpMessageHandler
.WhenCountMessageTokensRequest()
.Respond(
HttpStatusCode.BadRequest,
"application/json",
@"{
""type"": ""error"",
""error"": {
""type"": ""invalid_request_error"",
""message"": ""messages: roles must alternate between user and assistant, but found multiple user roles in a row""
}
}"
);
var request = new CountMessageTokensRequest(
model: AnthropicModels.Claude35Sonnet,
messages: [
new(MessageRole.User, [new TextContent("Hello!")]),
new(MessageRole.User, [new TextContent("Hello!")])
]
);
var result = await Client.CountMessageTokensAsync(request);
result.IsSuccess.Should().BeFalse();
result.Error.Should().BeOfType<AnthropicError>();
result.Error.Error.Should().BeOfType<InvalidRequestError>();
}
[Fact]
public async Task CountMessageTokensAsync_WhenCalledRequestFailsAndCanNotSerializeError_ItShouldReturnUnknownError()
{
_mockHttpMessageHandler
.WhenCountMessageTokensRequest()
.Respond(
HttpStatusCode.BadRequest,
"application/json",
@"{}"
);
var request = new CountMessageTokensRequest(
model: AnthropicModels.Claude35Sonnet,
messages: [
new(MessageRole.User, [new TextContent("Hello!")]),
new(MessageRole.User, [new TextContent("Hello!")])
]
);
var result = await Client.CountMessageTokensAsync(request);
result.IsSuccess.Should().BeFalse();
result.Error.Should().BeOfType<AnthropicError>();
result.Error.Error.Should().BeOfType<ApiError>();
}
}
@@ -13,10 +13,18 @@ public class IntegrationTest
public static class MockHttpMessageHandlerExtensions
{
private static MockedRequest SetupBaseRequest(this MockHttpMessageHandler mockHttpMessageHandler)
private const string BaseUrl = "https://api.anthropic.com/v1";
private static readonly string MessagesEndpoint = $"{BaseUrl}/messages";
private static readonly string CountTokensEndpoint = $"{BaseUrl}/messages/count_tokens";
private static MockedRequest SetupBaseRequest(
this MockHttpMessageHandler mockHttpMessageHandler,
HttpMethod method,
string url
)
{
return mockHttpMessageHandler
.When(HttpMethod.Post, "https://api.anthropic.com/v1/messages")
.When(method, url)
.WithHeaders(new Dictionary<string, string>
{
{ "anthropic-version", "2023-06-01" },
@@ -27,14 +35,20 @@ public static class MockHttpMessageHandlerExtensions
public static MockedRequest WhenCreateMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
{
return mockHttpMessageHandler
.SetupBaseRequest()
.SetupBaseRequest(HttpMethod.Post, MessagesEndpoint)
.WithJsonContent<MessageRequest>(r => r.Stream == false, JsonSerializationOptions.DefaultOptions);
}
public static MockedRequest WhenCreateStreamMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
{
return mockHttpMessageHandler
.SetupBaseRequest()
.SetupBaseRequest(HttpMethod.Post, MessagesEndpoint)
.WithJsonContent<StreamMessageRequest>(r => r.Stream == true, JsonSerializationOptions.DefaultOptions);
}
public static MockedRequest WhenCountMessageTokensRequest(this MockHttpMessageHandler mockHttpMessageHandler)
{
return mockHttpMessageHandler
.SetupBaseRequest(HttpMethod.Post, CountTokensEndpoint);
}
}