Files
agent-framework/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAIAgentBuilderExtensionsTests.cs
T
Stephen Toub 0502f3ef91 .NET: Update OpenTelemetryAgent to latest spec (#967)
* Update OpenTelemetryAgent to latest spec

It was stale. Rather than try to keep it up-to-date manually, I've changed it to piggy back on OpenTelemetryChatClient, so that it inherits everything OpenTelemetryChatClient does and then augments it just with agent-specific tags.

* Address feedback / merge
2025-09-30 13:50:01 +00:00

128 lines
3.7 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
using System;
using Microsoft.Extensions.Logging;
using Moq;
namespace Microsoft.Agents.AI.UnitTests;
/// <summary>
/// Unit tests for the <see cref="OpenTelemetryAIAgentBuilderExtensions"/> class.
/// </summary>
public class OpenTelemetryAIAgentBuilderExtensionsTests
{
/// <summary>
/// Verify that UseOpenTelemetry throws ArgumentNullException when builder is null.
/// </summary>
[Fact]
public void UseOpenTelemetry_WithNullBuilder_ThrowsArgumentNullException()
{
// Act & Assert
Assert.Throws<ArgumentNullException>("builder", () =>
OpenTelemetryAIAgentBuilderExtensions.UseOpenTelemetry(null!));
}
/// <summary>
/// Verify that UseOpenTelemetry returns an OpenTelemetryAgent.
/// </summary>
[Fact]
public void UseOpenTelemetry_WithValidBuilder_ReturnsOpenTelemetryAgent()
{
// Arrange
var mockAgent = new Mock<AIAgent>();
var builder = new AIAgentBuilder(mockAgent.Object);
// Act
var result = builder.UseOpenTelemetry().Build();
// Assert
Assert.IsType<OpenTelemetryAgent>(result);
}
/// <summary>
/// Verify that UseOpenTelemetry with source name works correctly.
/// </summary>
[Fact]
public void UseOpenTelemetry_WithSourceName_WorksCorrectly()
{
// Arrange
var mockAgent = new Mock<AIAgent>();
var builder = new AIAgentBuilder(mockAgent.Object);
const string SourceName = "TestSource";
// Act
var result = builder.UseOpenTelemetry(sourceName: SourceName).Build();
// Assert
Assert.IsType<OpenTelemetryAgent>(result);
}
/// <summary>
/// Verify that UseOpenTelemetry with configure action works correctly.
/// </summary>
[Fact]
public void UseOpenTelemetry_WithConfigureAction_CallsConfigureAction()
{
// Arrange
var mockAgent = new Mock<AIAgent>();
var builder = new AIAgentBuilder(mockAgent.Object);
var configureWasCalled = false;
// Act
var result = builder.UseOpenTelemetry(configure: agent =>
{
configureWasCalled = true;
Assert.NotNull(agent);
Assert.IsType<OpenTelemetryAgent>(agent);
}).Build();
// Assert
Assert.True(configureWasCalled);
Assert.IsType<OpenTelemetryAgent>(result);
}
/// <summary>
/// Verify that UseOpenTelemetry returns the same builder instance for chaining.
/// </summary>
[Fact]
public void UseOpenTelemetry_ReturnsBuilderForChaining()
{
// Arrange
var mockAgent = new Mock<AIAgent>();
var builder = new AIAgentBuilder(mockAgent.Object);
// Act
var result = builder.UseOpenTelemetry();
// Assert
Assert.Same(builder, result);
}
/// <summary>
/// Verify that UseOpenTelemetry with all parameters works correctly.
/// </summary>
[Fact]
public void UseOpenTelemetry_WithAllParameters_WorksCorrectly()
{
// Arrange
var mockAgent = new Mock<AIAgent>();
using var loggerFactory = LoggerFactory.Create(builder => { });
var builder = new AIAgentBuilder(mockAgent.Object);
const string SourceName = "TestSource";
var configureWasCalled = false;
// Act
var result = builder.UseOpenTelemetry(
sourceName: SourceName,
configure: agent =>
{
configureWasCalled = true;
Assert.NotNull(agent);
}).Build();
// Assert
Assert.True(configureWasCalled);
Assert.IsType<OpenTelemetryAgent>(result);
}
}