110 lines
3.9 KiB
C#
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));
|
|
}
|
|
}
|