76 lines
3.0 KiB
C#
76 lines
3.0 KiB
C#
using System.Text;
|
|
using A2A;
|
|
using Volcanic.AgenticCore.Extensions.A2A;
|
|
using A2AMessage = global::A2A.Message;
|
|
using A2ATaskStatus = global::A2A.TaskStatus;
|
|
|
|
namespace Volcanic.AgenticCore.Extensions.Tests.A2A;
|
|
|
|
public sealed class A2AResultsTests : IDisposable
|
|
{
|
|
private readonly string _ws = Path.Combine(Path.GetTempPath(), "a2a-results", Guid.NewGuid().ToString("N"));
|
|
|
|
private static AgentTask Task_(TaskState state, string? statusText = null, params Artifact[] artifacts) => new()
|
|
{
|
|
Id = "task-123456789", ContextId = "ctx-1",
|
|
Status = new A2ATaskStatus
|
|
{
|
|
State = state,
|
|
Message = statusText is null ? null : new A2AMessage { Role = Role.Agent, MessageId = "m", Parts = [Part.FromText(statusText)] },
|
|
},
|
|
Artifacts = [.. artifacts],
|
|
};
|
|
|
|
[Fact]
|
|
public void FinalText_PrefersResponseArtifact()
|
|
{
|
|
var task = Task_(TaskState.Completed, null,
|
|
new Artifact { ArtifactId = "other", Parts = [Part.FromText("side")] },
|
|
new Artifact { ArtifactId = "response", Parts = [Part.FromText("Booked "), Part.FromText("Friday")] });
|
|
Assert.Equal("Booked Friday", A2AResults.FinalText(task));
|
|
}
|
|
|
|
[Fact]
|
|
public void FinalText_FallsBackToTextArtifactsThenStatus()
|
|
{
|
|
Assert.Equal("side", A2AResults.FinalText(Task_(TaskState.Completed, null, new Artifact { ArtifactId = "x", Parts = [Part.FromText("side")] })));
|
|
Assert.Equal("why", A2AResults.FinalText(Task_(TaskState.Failed, "why")));
|
|
}
|
|
|
|
[Fact]
|
|
public void Send_FileArtifact_SavedToInbox()
|
|
{
|
|
var task = Task_(TaskState.Completed, null, new Artifact
|
|
{
|
|
ArtifactId = "f1", Name = "plan.pdf", Parts = [Part.FromRaw(Encoding.UTF8.GetBytes("pdf!"), "application/pdf", "../../plan.pdf")],
|
|
});
|
|
var files = A2AResults.SaveFiles(_ws, "travel-bot", task, 1024);
|
|
var file = Assert.Single(files);
|
|
Assert.Equal("inbox/a2a/travel-bot/plan.pdf", file);
|
|
Assert.Equal("pdf!", File.ReadAllText(Path.Combine(_ws, file)));
|
|
}
|
|
|
|
[Fact]
|
|
public void Describe_InputRequired_HasQuestionAndHint()
|
|
{
|
|
var text = A2AResults.Describe("travel-bot", Task_(TaskState.InputRequired, "Which date?"), []);
|
|
Assert.Contains("input-required", text);
|
|
Assert.Contains("Which date?", text);
|
|
Assert.Contains("action=send", text);
|
|
Assert.Contains("task-123456789", text);
|
|
Assert.Contains("ctx-1", text);
|
|
}
|
|
|
|
[Fact]
|
|
public void DeliveryText_HasHeader()
|
|
{
|
|
var text = A2AResults.DeliveryText("travel-bot", Task_(TaskState.Completed, null,
|
|
new Artifact { ArtifactId = "response", Parts = [Part.FromText("Done")] }), ["inbox/a2a/travel-bot/x.pdf"]);
|
|
Assert.StartsWith("[A2A result from \"travel-bot\", task task-123456789 (completed)]", text);
|
|
Assert.Contains("Done", text);
|
|
Assert.Contains("Files: inbox/a2a/travel-bot/x.pdf", text);
|
|
}
|
|
|
|
public void Dispose() { try { Directory.Delete(_ws, true); } catch (IOException) { } }
|
|
}
|