tests: add integration tests to cover both 😁 and 🥲 paths when counting message tokens
This commit is contained in:
@@ -418,4 +418,89 @@ public class AnthropicApiClientTests : IntegrationTest
|
|||||||
textContent.As<TextContent>().Text.Should().Be("It is a PDF");
|
textContent.As<TextContent>().Text.Should().Be("It is a PDF");
|
||||||
textContent.As<TextContent>().Type.Should().Be("text");
|
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
|
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
|
return mockHttpMessageHandler
|
||||||
.When(HttpMethod.Post, "https://api.anthropic.com/v1/messages")
|
.When(method, url)
|
||||||
.WithHeaders(new Dictionary<string, string>
|
.WithHeaders(new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{ "anthropic-version", "2023-06-01" },
|
{ "anthropic-version", "2023-06-01" },
|
||||||
@@ -27,14 +35,20 @@ public static class MockHttpMessageHandlerExtensions
|
|||||||
public static MockedRequest WhenCreateMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
public static MockedRequest WhenCreateMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
||||||
{
|
{
|
||||||
return mockHttpMessageHandler
|
return mockHttpMessageHandler
|
||||||
.SetupBaseRequest()
|
.SetupBaseRequest(HttpMethod.Post, MessagesEndpoint)
|
||||||
.WithJsonContent<MessageRequest>(r => r.Stream == false, JsonSerializationOptions.DefaultOptions);
|
.WithJsonContent<MessageRequest>(r => r.Stream == false, JsonSerializationOptions.DefaultOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MockedRequest WhenCreateStreamMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
public static MockedRequest WhenCreateStreamMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
||||||
{
|
{
|
||||||
return mockHttpMessageHandler
|
return mockHttpMessageHandler
|
||||||
.SetupBaseRequest()
|
.SetupBaseRequest(HttpMethod.Post, MessagesEndpoint)
|
||||||
.WithJsonContent<StreamMessageRequest>(r => r.Stream == true, JsonSerializationOptions.DefaultOptions);
|
.WithJsonContent<StreamMessageRequest>(r => r.Stream == true, JsonSerializationOptions.DefaultOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MockedRequest WhenCountMessageTokensRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
||||||
|
{
|
||||||
|
return mockHttpMessageHandler
|
||||||
|
.SetupBaseRequest(HttpMethod.Post, CountTokensEndpoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user