using System.Text.Json; using Agent.Mcp; using ModelContextProtocol.Extensions.Tasks; namespace Agent.Core.Tests; public sealed class PersistentMcpTaskStoreTests { [Fact] public async Task Persists_terminal_task_and_marks_incomplete_task_failed_after_restart() { using var directory = new TestDirectory(); var settings = new McpTaskStoreSettings(directory.Path, TimeSpan.FromHours(24), 1000); var first = new PersistentMcpTaskStore(settings); McpTaskInfo completed = await first.CreateTaskAsync(TestContext.Current.CancellationToken); await first.SetCompletedAsync(completed.TaskId, JsonSerializer.SerializeToElement(new { ok = true }), TestContext.Current.CancellationToken); McpTaskInfo working = await first.CreateTaskAsync(TestContext.Current.CancellationToken); var recovered = new PersistentMcpTaskStore(settings); Assert.Equal(McpTaskStatus.Completed, (await recovered.GetTaskAsync(completed.TaskId, TestContext.Current.CancellationToken))!.Status); McpTaskInfo failed = (await recovered.GetTaskAsync(working.TaskId, TestContext.Current.CancellationToken))!; Assert.Equal(McpTaskStatus.Failed, failed.Status); Assert.Equal("server_restarted", failed.StatusMessage); } [Fact] public async Task Expired_task_is_removed() { using var directory = new TestDirectory(); var store = new PersistentMcpTaskStore(new McpTaskStoreSettings(directory.Path, TimeSpan.FromMilliseconds(1), 1000)); McpTaskInfo task = await store.CreateTaskAsync(TestContext.Current.CancellationToken); await Task.Delay(20, TestContext.Current.CancellationToken); Assert.Null(await store.GetTaskAsync(task.TaskId, TestContext.Current.CancellationToken)); Assert.Empty(Directory.EnumerateFiles(directory.Path, "*.json")); } }