mishima-nexus-client-csharp/tests/Robotico.Nexus.Client.Tests/Document/NexusDocumentClientTests.cs

113 lines
4.0 KiB
C#
Raw Normal View History

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<NexusClient> connected = NexusClient.Connect(_host.ConnectionUri(NexusUriSchemes.Document));
Assert.True(connected.IsSuccess(out NexusClient? client, out _));
_client = client!;
Robotico.Result.Result<NexusDocumentClient> 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<string?> fetched = _documentClient.GetDocument("users", "u1");
Assert.True(fetched.IsSuccess(out string? body, out _));
Assert.Equal("""{"name":"Ada"}""", body);
}
[Fact]
public void GetDocuments_ReturnsFound_AndOmitsMissing()
{
_documentClient.UpsertDocument("users", "u1", """{"name":"Ada"}""");
_documentClient.UpsertDocument("users", "u3", """{"name":"Grace"}""");
Robotico.Result.Result<IReadOnlyList<NexusRetrievedDocument>> fetched =
_documentClient.GetDocuments("users", ["u3", "missing", "u1"]);
Assert.True(fetched.IsSuccess(out IReadOnlyList<NexusRetrievedDocument>? docs, out _));
Assert.Equal(2, docs!.Count);
Assert.Equal("u3", docs[0].DocumentId);
Assert.Equal("""{"name":"Grace"}""", docs[0].JsonBody);
Assert.Equal("u1", docs[1].DocumentId);
}
[Fact]
public void GetDocument_ReturnsNull_WhenNotFound()
{
Robotico.Result.Result<string?> 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<string?> 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<NexusClient> connected = NexusClient.Connect(
_host.ConnectionUri(NexusUriSchemes.Document, FakeNexusTriggers.PingReportsFailure));
Assert.True(connected.IsSuccess(out NexusClient? client, out _));
using NexusClient failingClient = client!;
Robotico.Result.Result<NexusDocumentClient> 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);
}
}