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

110 lines
3.9 KiB
C#

using Robotico.Result.Errors;
using Xunit;
namespace Robotico.Nexus.Client.Tests;
public class NexusConnectionUriTests
{
[Fact]
public void TryParse_Rejects_EmptyString()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse(string.Empty);
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UriInvalid, error!.Code);
}
[Fact]
public void TryParse_Rejects_WhitespaceOnly()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse(" ");
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UriInvalid, error!.Code);
}
[Fact]
public void TryParse_Rejects_MalformedUri()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse("not a uri at all://");
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UriInvalid, error!.Code);
}
[Fact]
public void TryParse_Rejects_SqlScheme_WithDedicatedMessage()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse("nexus+sql://localhost:50051/db");
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UnsupportedScheme, error!.Code);
Assert.Contains("Mishima.Nexus.Sql", error.Message, StringComparison.Ordinal);
}
[Fact]
public void TryParse_Rejects_UnknownScheme()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse("http://localhost:50051/db");
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UnsupportedScheme, error!.Code);
}
[Fact]
public void TryParse_Rejects_DefaultPort()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse("nexus+graph://localhost/db");
Assert.True(result.IsError(out IError? error));
Assert.Equal(NexusErrors.UriInvalid, error!.Code);
}
[Theory]
[InlineData("nexus+graph")]
[InlineData("nexus+time")]
[InlineData("nexus+document")]
[InlineData("nexus+relational")]
public void TryParse_Accepts_AllSupportedSchemes_WithExplicitPortAndPath(string scheme)
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse($"{scheme}://myhost:50051/mydb");
Assert.True(result.IsSuccess(out NexusConnectionUriParts? parsed, out _));
Assert.Equal(scheme, parsed!.Scheme);
Assert.Equal("myhost", parsed.Host);
Assert.Equal(50051, parsed.Port);
Assert.Equal("mydb", parsed.Database);
}
[Theory]
[InlineData("nexus+graph://myhost:50051")]
[InlineData("nexus+graph://myhost:50051/")]
public void TryParse_Database_IsNull_WhenPathIsEmptyOrRoot(string uri)
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse(uri);
Assert.True(result.IsSuccess(out NexusConnectionUriParts? parsed, out _));
Assert.Null(parsed!.Database);
}
[Fact]
public void TryParse_TrimsLeadingSlash_FromDatabasePath()
{
Robotico.Result.Result<NexusConnectionUriParts> result = NexusConnectionUri.TryParse("nexus+time://myhost:50051/telemetry");
Assert.True(result.IsSuccess(out NexusConnectionUriParts? parsed, out _));
Assert.Equal("telemetry", parsed!.Database);
}
[Theory]
[InlineData(NexusUriSchemes.Graph, "pathways")]
[InlineData(NexusUriSchemes.Time, "telemetry")]
[InlineData(NexusUriSchemes.Document, "catalog")]
[InlineData(NexusUriSchemes.Relational, "ledger")]
[InlineData("unknown-scheme", "primary")]
public void DefaultDatabase_ReturnsCanonicalNamePerScheme(string scheme, string expected)
{
Assert.Equal(expected, NexusConnectionUri.DefaultDatabase(scheme));
}
}