using Robotico.Result.Errors; using Xunit; namespace Robotico.Nexus.Client.Tests; public class NexusConnectionUriTests { [Fact] public void TryParse_Rejects_EmptyString() { Robotico.Result.Result 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 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 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 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 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 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 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 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 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)); } }