using Grpc.Core; using Mishima.Nexus.Wire.V1; namespace Robotico.Nexus.Client.Tests.TestSupport; /// /// In-memory fake standing in for a real Nexus document engine host — the RPCs used by /// (Ping, CRUD, GetMany). /// public sealed class FakeDocumentEngineService : NexusDocumentEngineService.NexusDocumentEngineServiceBase { private readonly Dictionary<(string Collection, string Id), string> _documents = []; /// public override Task Ping(DocumentPingRequest request, ServerCallContext context) { NexusStatus? failure = FakeNexusTriggers.TryStatusFailure(context); return Task.FromResult(new DocumentPingResponse { Status = failure ?? NexusStatuses.Ok, EngineVersion = "fake" }); } /// public override Task UpsertDocument(DocumentUpsertRequest request, ServerCallContext context) { _documents[(request.CollectionName, request.DocumentId)] = request.JsonBody; return Task.FromResult(new DocumentUpsertResponse { Status = NexusStatuses.Ok }); } /// public override Task GetDocument(DocumentGetRequest request, ServerCallContext context) { if (_documents.TryGetValue((request.CollectionName, request.DocumentId), out string? body)) { return Task.FromResult(new DocumentGetResponse { Status = NexusStatuses.Ok, Found = true, JsonBody = body }); } return Task.FromResult(new DocumentGetResponse { Status = NexusStatuses.Ok, Found = false }); } /// public override Task CollectionGetMany( DocumentCollectionGetManyRequest request, ServerCallContext context) { DocumentCollectionGetManyResponse response = new() { Status = NexusStatuses.Ok }; foreach (string id in request.DocumentIds) { if (!_documents.TryGetValue((request.CollectionName, id), out string? body)) { continue; } response.Documents.Add(new DocumentCollectionDocumentWire { DocumentId = id, JsonBody = body, }); } return Task.FromResult(response); } /// public override Task DeleteDocument(DocumentDeleteRequest request, ServerCallContext context) { _documents.Remove((request.CollectionName, request.DocumentId)); return Task.FromResult(new DocumentDeleteResponse { Status = NexusStatuses.Ok }); } }