using System.Collections.Concurrent; using ClawdDotNet.Core.Audit; namespace ClawdDotNet.Core.Tests.Infrastructure; /// /// In-Memory-Attrappe des Audit-Logs für Engine-Tests — hält Einträge und Belege in /// Listen, damit ein Test prüfen kann, was die Engine stempelt, ohne eine Datei. /// internal sealed class InMemoryAuditRepository : IAuditRepository { public ConcurrentQueue Entries { get; } = new(); public ConcurrentQueue Receipts { get; } = new(); public Task AppendAsync(AuditEntry entry, CancellationToken ct) { Entries.Enqueue(entry); return Task.CompletedTask; } public Task RecordReceiptAsync(RunReceipt receipt, CancellationToken ct) { Receipts.Enqueue(receipt); return Task.CompletedTask; } public Task> ListRecentAsync(int limit, CancellationToken ct) => Task.FromResult>(Entries.Reverse().Take(limit).ToList()); public Task> ListForRunAsync(string runId, CancellationToken ct) => Task.FromResult>(Entries.Where(e => e.RunId == runId).ToList()); public Task GetReceiptForRunAsync(string runId, CancellationToken ct) => Task.FromResult(Receipts.LastOrDefault(r => r.RunId == runId)); public Task> ListReceiptsForTaskAsync(string taskId, CancellationToken ct) => Task.FromResult>(Receipts.Where(r => r.TaskId == taskId).ToList()); public Task CountAsync(CancellationToken ct) => Task.FromResult(Entries.Count); }