Information at endpoint and service-method boundaries, Debug in deeper helpers, Warning before expected/recoverable failures (not-found, validation, agent tool errors), Error on caught exceptions. Serilog wraps the exception handler so request-completion logs report the resolved status code rather than the raw exception. Never logs prose bodies or the Anthropic API key.
40 lines
1.4 KiB
C#
40 lines
1.4 KiB
C#
using Microsoft.Extensions.Logging.Abstractions;
|
|
using Microsoft.Extensions.Options;
|
|
using Novelly.Api.Agent;
|
|
using Novelly.Api.Common;
|
|
|
|
namespace Novelly.Api.Tests;
|
|
|
|
[TestFixture]
|
|
public class AnthropicClientTests
|
|
{
|
|
[Test]
|
|
public void Constructing_without_a_key_does_not_throw() =>
|
|
// The agent service takes this as a dependency and also serves read-only endpoints
|
|
// (listing conversations, reading a transcript). Throwing at construction would
|
|
// take those down on any install that has not configured a key yet.
|
|
Assert.That(
|
|
() => new AnthropicAgentModelClient(Options.Create(new AgentOptions()), NullLogger<AnthropicAgentModelClient>.Instance),
|
|
Throws.Nothing);
|
|
|
|
[Test]
|
|
public void Sending_without_a_key_reports_a_configuration_problem()
|
|
{
|
|
var previous = Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY");
|
|
Environment.SetEnvironmentVariable("ANTHROPIC_API_KEY", null);
|
|
|
|
try
|
|
{
|
|
var client = new AnthropicAgentModelClient(Options.Create(new AgentOptions()), NullLogger<AnthropicAgentModelClient>.Instance);
|
|
|
|
Assert.That(
|
|
async () => await client.CompleteAsync("system", [], []),
|
|
Throws.TypeOf<AgentNotConfiguredException>().With.Message.Contains("ANTHROPIC_API_KEY"));
|
|
}
|
|
finally
|
|
{
|
|
Environment.SetEnvironmentVariable("ANTHROPIC_API_KEY", previous);
|
|
}
|
|
}
|
|
}
|