// Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; using Moq; namespace Microsoft.Agents.AI.Abstractions.UnitTests; /// /// Contains tests for the class. /// public sealed class ChatHistoryProviderExtensionsTests { [Fact] public void WithMessageFilters_ReturnsChatHistoryProviderMessageFilter() { // Arrange Mock providerMock = new(); // Act ChatHistoryProvider result = providerMock.Object.WithMessageFilters( invokingMessagesFilter: msgs => msgs, invokedMessagesFilter: ctx => ctx); // Assert Assert.IsType(result); } [Fact] public async Task WithMessageFilters_InvokingFilter_IsAppliedAsync() { // Arrange Mock providerMock = new(); List innerMessages = [new(ChatRole.User, "Hello"), new(ChatRole.Assistant, "Hi")]; ChatHistoryProvider.InvokingContext context = new([new ChatMessage(ChatRole.User, "Test")]); providerMock .Setup(p => p.InvokingAsync(context, It.IsAny())) .ReturnsAsync(innerMessages); ChatHistoryProvider filtered = providerMock.Object.WithMessageFilters( invokingMessagesFilter: msgs => msgs.Where(m => m.Role == ChatRole.User)); // Act List result = (await filtered.InvokingAsync(context, CancellationToken.None)).ToList(); // Assert Assert.Single(result); Assert.Equal(ChatRole.User, result[0].Role); } [Fact] public async Task WithMessageFilters_InvokedFilter_IsAppliedAsync() { // Arrange Mock providerMock = new(); List requestMessages = [new(ChatRole.User, "Hello")]; List chatHistoryProviderMessages = [new(ChatRole.System, "System")]; ChatHistoryProvider.InvokedContext context = new(requestMessages, chatHistoryProviderMessages) { ResponseMessages = [new ChatMessage(ChatRole.Assistant, "Response")] }; ChatHistoryProvider.InvokedContext? capturedContext = null; providerMock .Setup(p => p.InvokedAsync(It.IsAny(), It.IsAny())) .Callback((ctx, _) => capturedContext = ctx) .Returns(default(ValueTask)); ChatHistoryProvider filtered = providerMock.Object.WithMessageFilters( invokedMessagesFilter: ctx => { ctx.ResponseMessages = null; return ctx; }); // Act await filtered.InvokedAsync(context, CancellationToken.None); // Assert Assert.NotNull(capturedContext); Assert.Null(capturedContext.ResponseMessages); } [Fact] public void WithAIContextProviderMessageRemoval_ReturnsChatHistoryProviderMessageFilter() { // Arrange Mock providerMock = new(); // Act ChatHistoryProvider result = providerMock.Object.WithAIContextProviderMessageRemoval(); // Assert Assert.IsType(result); } [Fact] public async Task WithAIContextProviderMessageRemoval_RemovesAIContextProviderMessagesAsync() { // Arrange Mock providerMock = new(); List requestMessages = [new(ChatRole.User, "Hello")]; List chatHistoryProviderMessages = [new(ChatRole.System, "System")]; List aiContextProviderMessages = [new(ChatRole.System, "Context")]; ChatHistoryProvider.InvokedContext context = new(requestMessages, chatHistoryProviderMessages) { AIContextProviderMessages = aiContextProviderMessages }; ChatHistoryProvider.InvokedContext? capturedContext = null; providerMock .Setup(p => p.InvokedAsync(It.IsAny(), It.IsAny())) .Callback((ctx, _) => capturedContext = ctx) .Returns(default(ValueTask)); ChatHistoryProvider filtered = providerMock.Object.WithAIContextProviderMessageRemoval(); // Act await filtered.InvokedAsync(context, CancellationToken.None); // Assert Assert.NotNull(capturedContext); Assert.Null(capturedContext.AIContextProviderMessages); } }