150 lines
5.0 KiB
C#
Raw Normal View History

// Copyright (c) Microsoft Corporation. All rights reserved.
// AgentTests.cs
using FluentAssertions;
using Microsoft.AutoGen.Contracts;
using Microsoft.Extensions.Logging;
using Xunit;
namespace Microsoft.AutoGen.Core.Tests;
[Trait("Category", "UnitV2")]
public class AgentTests()
{
[Fact]
public async Task AgentShouldNotReceiveMessagesWhenNotSubscribedTest()
{
2025-01-27 15:35:06 -05:00
var runtime = new InProcessRuntime();
await runtime.StartAsync();
2025-01-27 15:35:06 -05:00
Logger<BaseAgent> logger = new(new LoggerFactory());
TestAgent agent = null!;
await runtime.RegisterAgentFactoryAsync("MyAgent", (id, runtime) =>
{
agent = new TestAgent(id, runtime, logger);
return ValueTask.FromResult(agent);
});
// Ensure the agent is actually created
AgentId agentId = await runtime.GetAgentAsync("MyAgent", lazy: false);
// Validate agent ID
agentId.Should().Be(agent.Id, "Agent ID should match the registered agent");
var topicType = "TestTopic";
await runtime.PublishMessageAsync(new TextMessage { Source = topicType, Content = "test" }, new TopicId(topicType)).ConfigureAwait(true);
await runtime.RunUntilIdleAsync();
agent.ReceivedMessages.Any().Should().BeFalse("Agent should not receive messages when not subscribed.");
}
[Fact]
public async Task AgentShouldReceiveMessagesWhenSubscribedTest()
{
2025-01-27 15:35:06 -05:00
var runtime = new InProcessRuntime();
await runtime.StartAsync();
2025-01-27 15:35:06 -05:00
Logger<BaseAgent> logger = new(new LoggerFactory());
SubscribedAgent agent = null!;
await runtime.RegisterAgentFactoryAsync("MyAgent", (id, runtime) =>
{
agent = new SubscribedAgent(id, runtime, logger);
return ValueTask.FromResult(agent);
});
// Ensure the agent id is registered
AgentId agentId = await runtime.GetAgentAsync("MyAgent", lazy: false);
// Validate agent ID
agentId.Should().Be(agent.Id, "Agent ID should match the registered agent");
2025-01-27 15:35:06 -05:00
await runtime.RegisterImplicitAgentSubscriptionsAsync<SubscribedAgent>("MyAgent");
var topicType = "TestTopic";
2025-01-27 15:35:06 -05:00
await runtime.PublishMessageAsync(new TextMessage { Source = topicType, Content = "test" }, new TopicId(topicType)).ConfigureAwait(true);
2025-01-27 15:35:06 -05:00
await runtime.RunUntilIdleAsync();
agent.ReceivedMessages.Any().Should().BeTrue("Agent should receive messages when subscribed.");
}
[Fact]
public async Task SendMessageAsyncShouldReturnResponseTest()
{
2025-01-27 15:35:06 -05:00
// Arrange
var runtime = new InProcessRuntime();
await runtime.StartAsync();
2025-01-27 16:09:16 -05:00
Logger<BaseAgent> logger = new(new LoggerFactory());
2025-01-27 15:35:06 -05:00
await runtime.RegisterAgentFactoryAsync("MyAgent", (id, runtime) => ValueTask.FromResult(new TestAgent(id, runtime, logger)));
await runtime.RegisterImplicitAgentSubscriptionsAsync<TestAgent>("MyAgent");
var agentId = new AgentId("MyAgent", "TestAgent");
2025-01-27 15:35:06 -05:00
var response = await runtime.SendMessageAsync(new RpcTextMessage { Source = "TestTopic", Content = "Request" }, agentId);
// Assert
Assert.NotNull(response);
Assert.IsType<string>(response);
2025-01-27 16:09:16 -05:00
if (response is string responseString)
{
2025-01-27 15:35:06 -05:00
Assert.Equal("Request", responseString);
}
}
2025-01-27 16:09:16 -05:00
public class ReceiverAgent(AgentId id,
IAgentRuntime runtime) : BaseAgent(id, runtime, "Receiver Agent", null),
IHandle<string>
{
2025-01-27 16:40:17 -05:00
public ValueTask HandleAsync(string item, MessageContext messageContext)
2025-01-27 16:09:16 -05:00
{
ReceivedItems.Add(item);
return ValueTask.CompletedTask;
}
public List<string> ReceivedItems { get; private set; } = [];
}
[Fact]
public async Task SubscribeAsyncRemoveSubscriptionAsyncTest()
2025-01-27 16:09:16 -05:00
{
var runtime = new InProcessRuntime();
await runtime.StartAsync();
2025-01-27 16:09:16 -05:00
ReceiverAgent? agent = null;
await runtime.RegisterAgentFactoryAsync("MyAgent", (id, runtime) =>
{
2025-01-27 16:09:16 -05:00
agent = new ReceiverAgent(id, runtime);
return ValueTask.FromResult(agent);
});
Assert.Null(agent);
await runtime.GetAgentAsync("MyAgent", lazy: false);
Assert.NotNull(agent);
Assert.True(agent.ReceivedItems.Count == 0);
var topicTypeName = "TestTopic";
await runtime.PublishMessageAsync("info", new TopicId(topicTypeName));
await Task.Delay(100);
Assert.True(agent.ReceivedItems.Count == 0);
var subscription = new TypeSubscription(topicTypeName, "MyAgent");
await runtime.AddSubscriptionAsync(subscription);
await runtime.PublishMessageAsync("info", new TopicId(topicTypeName));
await Task.Delay(100);
2025-01-27 16:09:16 -05:00
Assert.True(agent.ReceivedItems.Count == 1);
Assert.Equal("info", agent.ReceivedItems[0]);
await runtime.RemoveSubscriptionAsync(subscription.Id);
await runtime.PublishMessageAsync("info", new TopicId(topicTypeName));
await Task.Delay(100);
2025-01-27 16:09:16 -05:00
Assert.True(agent.ReceivedItems.Count == 1);
}
}