using Robotico.Nexus.Client.Document; using Robotico.Nexus.Client.Tests.TestSupport; using Robotico.Result.Errors; using Xunit; namespace Robotico.Nexus.Client.Tests.Document; public class NexusDocumentClientTests : IAsyncLifetime { private NexusTestHost _host = null!; private NexusClient _client = null!; private NexusDocumentClient _documentClient = null!; public async Task InitializeAsync() { _host = await NexusTestHost.StartAsync(); Robotico.Result.Result connected = NexusClient.Connect(_host.ConnectionUri(NexusUriSchemes.Document)); Assert.True(connected.IsSuccess(out NexusClient? client, out _)); _client = client!; Robotico.Result.Result created = _client.CreateDocumentClient(); Assert.True(created.IsSuccess(out NexusDocumentClient? documentClient, out _)); _documentClient = documentClient!; } public async Task DisposeAsync() { _client.Dispose(); await _host.DisposeAsync(); } [Fact] public void CheckHealth_Succeeds() { Robotico.Result.Result result = _documentClient.CheckHealth(); Assert.True(result.IsSuccess()); } [Fact] public void UpsertDocument_ThenGetDocument_RoundTrips() { Robotico.Result.Result upserted = _documentClient.UpsertDocument("users", "u1", """{"name":"Ada"}"""); Assert.True(upserted.IsSuccess()); Robotico.Result.Result fetched = _documentClient.GetDocument("users", "u1"); Assert.True(fetched.IsSuccess(out string? body, out _)); Assert.Equal("""{"name":"Ada"}""", body); } [Fact] public void GetDocument_ReturnsNull_WhenNotFound() { Robotico.Result.Result result = _documentClient.GetDocument("users", "missing"); Assert.True(result.IsSuccess(out string? body, out _)); Assert.Null(body); } [Fact] public void DeleteDocument_RemovesDocument() { _documentClient.UpsertDocument("users", "u2", "{}"); Robotico.Result.Result deleted = _documentClient.DeleteDocument("users", "u2"); Assert.True(deleted.IsSuccess()); Robotico.Result.Result fetched = _documentClient.GetDocument("users", "u2"); Assert.True(fetched.IsSuccess(out string? body, out _)); Assert.Null(body); } [Fact] public void DeleteDocument_Succeeds_WhenAlreadyAbsent() { Robotico.Result.Result result = _documentClient.DeleteDocument("users", "never-existed"); Assert.True(result.IsSuccess()); } [Fact] public void CheckHealth_Fails_WhenEngineReportsFailure() { Robotico.Result.Result connected = NexusClient.Connect( _host.ConnectionUri(NexusUriSchemes.Document, FakeNexusTriggers.PingReportsFailure)); Assert.True(connected.IsSuccess(out NexusClient? client, out _)); using NexusClient failingClient = client!; Robotico.Result.Result created = failingClient.CreateDocumentClient(); Assert.True(created.IsSuccess(out NexusDocumentClient? failingDocumentClient, out _)); Robotico.Result.Result result = failingDocumentClient!.CheckHealth(); Assert.True(result.IsError(out IError? error)); Assert.Equal(NexusErrors.Unavailable, error!.Code); } }