// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; using Moq; namespace Microsoft.Agents.AI.Workflows.Declarative.UnitTests; /// /// Mock implementation of for unit testing purposes. /// internal sealed class MockAgentProvider : Mock { public IList ExistingConversationIds { get; } = []; public List TestMessages { get; set; } = []; public MockAgentProvider() { this.Setup(provider => provider.CreateConversationAsync(It.IsAny())) .Returns(() => Task.FromResult(this.CreateConversationId())); List testMessages = this.CreateMessages(); this.Setup(provider => provider.GetMessageAsync( It.IsAny(), It.IsAny(), It.IsAny())) .Returns(Task.FromResult(testMessages.First())); // Setup GetMessagesAsync to return test messages this.Setup(provider => provider.GetMessagesAsync( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(ToAsyncEnumerableAsync(testMessages)); this.Setup(provider => provider.CreateMessageAsync( It.IsAny(), It.IsAny(), It.IsAny())) .Returns((conversationId, message, cancellationToken) => Task.FromResult(this.CaptureChatMessage(message))); } private string CreateConversationId() { string newConversationId = Guid.NewGuid().ToString("N"); this.ExistingConversationIds.Add(newConversationId); return newConversationId; } private ChatMessage CaptureChatMessage(ChatMessage message) { this.TestMessages.Add(message); return message; } private List CreateMessages() { // Create test messages List messages = []; const int MessageCount = 5; for (int i = 0; i < MessageCount; i++) { messages.Add(new ChatMessage(ChatRole.User, $"Test message {i + 1}") { MessageId = Guid.NewGuid().ToString("N") }); } this.TestMessages = messages; return this.TestMessages; } private static async IAsyncEnumerable ToAsyncEnumerableAsync(IEnumerable messages) { foreach (ChatMessage message in messages) { yield return message; } await Task.CompletedTask; } }