Files
agent-framework/dotnet/tests/Microsoft.Agents.AI.Hosting.OpenAI.UnitTests/ChatCompletionRequestMessageToChatMessageTests.cs
AkiKurisu 9691c9c271 .NET: Fix role assignment in ChatMessage construction (#4290)
* Use actual message role when creating ChatMessage

Replace hard-coded ChatRole.User with a ChatRole constructed from the message's Role. The change ensures ToChatMessage and FunctionMessage use the original role (new ChatRole(this.Role)) for both text and contents branches, fixing incorrect role assignment when constructing ChatMessage instances.

* Update changes

* Fix formatting in ToChatMessage tests

---------

Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
2026-03-26 16:13:00 +00:00

116 lines
4.3 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
using System.Linq;
using System.Text.Json;
using Microsoft.Agents.AI.Hosting.OpenAI.ChatCompletions.Models;
using Microsoft.Extensions.AI;
namespace Microsoft.Agents.AI.Hosting.OpenAI.UnitTests;
/// <summary>
/// Tests for ChatCompletionRequestMessage.ToChatMessage() role preservation.
/// Verifies that each message type correctly maps its role to the corresponding ChatRole.
/// </summary>
public sealed class ChatCompletionRequestMessageToChatMessageTests
{
[Theory]
[InlineData("system", """{"role":"system","content":"You are a helpful assistant."}""")]
[InlineData("developer", """{"role":"developer","content":"Follow these rules."}""")]
[InlineData("user", """{"role":"user","content":"Hello!"}""")]
[InlineData("assistant", """{"role":"assistant","content":"Hi there!"}""")]
[InlineData("tool", """{"role":"tool","content":"result","tool_call_id":"call_123"}""")]
public void ToChatMessage_PreservesRole_ForTextContent(string expectedRole, string json)
{
// Arrange
ChatCompletionRequestMessage message = JsonSerializer.Deserialize(
json, ChatCompletions.ChatCompletionsJsonContext.Default.ChatCompletionRequestMessage)!;
// Act
ChatMessage chatMessage = message.ToChatMessage();
// Assert
Assert.Equal(expectedRole, message.Role);
Assert.Equal(new ChatRole(expectedRole), chatMessage.Role);
}
[Fact]
public void ToChatMessage_FunctionMessage_PreservesRole()
{
// Arrange
const string Json = """{"role":"function","name":"get_weather","content":"sunny"}""";
ChatCompletionRequestMessage message = JsonSerializer.Deserialize(
Json, ChatCompletions.ChatCompletionsJsonContext.Default.ChatCompletionRequestMessage)!;
// Act
ChatMessage chatMessage = message.ToChatMessage();
// Assert
Assert.Equal("function", message.Role);
Assert.Equal(new ChatRole("function"), chatMessage.Role);
}
[Theory]
[InlineData("system")]
[InlineData("developer")]
[InlineData("user")]
[InlineData("assistant")]
public void ToChatMessage_PreservesRole_ForMultiPartContent(string expectedRole)
{
// Arrange
string json = $$"""{"role":"{{expectedRole}}","content":[{"type":"text","text":"Hello!"}]}""";
ChatCompletionRequestMessage message = JsonSerializer.Deserialize(
json, ChatCompletions.ChatCompletionsJsonContext.Default.ChatCompletionRequestMessage)!;
// Act
ChatMessage chatMessage = message.ToChatMessage();
// Assert
Assert.Equal(expectedRole, message.Role);
Assert.Equal(new ChatRole(expectedRole), chatMessage.Role);
}
[Fact]
public void ToChatMessage_MultiTurnConversation_PreservesAllRoles()
{
// Arrange - simulate a multi-turn conversation
string[] jsons =
[
"""{"role":"system","content":"You are a helpful assistant."}""",
"""{"role":"user","content":"Hello!"}""",
"""{"role":"assistant","content":"Hi there! How can I help?"}""",
"""{"role":"user","content":"What did I just say?"}"""
];
string[] expectedRoles = ["system", "user", "assistant", "user"];
// Act
ChatMessage[] chatMessages = jsons
.Select(j => JsonSerializer.Deserialize(
j, ChatCompletions.ChatCompletionsJsonContext.Default.ChatCompletionRequestMessage)!)
.Select(m => m.ToChatMessage())
.ToArray();
// Assert
Assert.Equal(expectedRoles.Length, chatMessages.Length);
for (int i = 0; i < expectedRoles.Length; i++)
{
Assert.Equal(new ChatRole(expectedRoles[i]), chatMessages[i].Role);
}
}
[Fact]
public void ToChatMessage_PreservesTextContent()
{
// Arrange
const string Json = """{"role":"system","content":"You are a helpful assistant."}""";
ChatCompletionRequestMessage message = JsonSerializer.Deserialize(
Json, ChatCompletions.ChatCompletionsJsonContext.Default.ChatCompletionRequestMessage)!;
// Act
ChatMessage chatMessage = message.ToChatMessage();
// Assert
Assert.Contains(chatMessage.Contents, c => c is TextContent tc && tc.Text == "You are a helpful assistant.");
}
}