Files
natsdotnet/tests/NATS.Server.Tests/Server/CoreServerOptionsParityBatch3Tests.cs
Joseph Doherty c30e67a69d Fix E2E test gaps and add comprehensive E2E + parity test suites
- Fix pull consumer fetch: send original stream subject in HMSG (not inbox)
  so NATS client distinguishes data messages from control messages
- Fix MaxAge expiry: add background timer in StreamManager for periodic pruning
- Fix JetStream wire format: Go-compatible anonymous objects with string enums,
  proper offset-based pagination for stream/consumer list APIs
- Add 42 E2E black-box tests (core messaging, auth, TLS, accounts, JetStream)
- Add ~1000 parity tests across all subsystems (gaps closure)
- Update gap inventory docs to reflect implementation status
2026-03-12 14:09:23 -04:00

107 lines
3.1 KiB
C#

using NATS.Server.Server;
namespace NATS.Server.Tests.Server;
public class CoreServerOptionsParityBatch3Tests
{
[Fact]
public void Core_ports_and_compression_types_exist_with_expected_defaults()
{
var ports = new Ports
{
Nats = ["nats://127.0.0.1:4222"],
Monitoring = ["http://127.0.0.1:8222"],
};
ports.Nats.ShouldHaveSingleItem();
ports.Monitoring.ShouldHaveSingleItem();
CompressionModes.Off.ShouldBe("off");
CompressionModes.S2Auto.ShouldBe("s2_auto");
var opts = new CompressionOpts();
opts.Mode.ShouldBe(CompressionModes.Off);
opts.RTTThresholds.ShouldNotBeNull();
}
[Fact]
public void RoutesFromStr_parses_comma_delimited_routes()
{
var routes = NatsOptions.RoutesFromStr(" nats://a:6222, tls://b:7222 ");
routes.Count.ShouldBe(2);
routes[0].ToString().ShouldBe("nats://a:6222/");
routes[1].ToString().ShouldBe("tls://b:7222/");
}
[Fact]
public void Clone_returns_deep_copy_for_common_collections()
{
var original = new NatsOptions
{
Host = "127.0.0.1",
Port = 4222,
Tags = new Dictionary<string, string> { ["a"] = "1" },
SubjectMappings = new Dictionary<string, string> { ["foo.*"] = "bar.$1" },
TlsPinnedCerts = ["abc"],
};
original.InCmdLine.Add("host");
var clone = original.Clone();
clone.ShouldNotBeSameAs(original);
clone.Tags.ShouldNotBeSameAs(original.Tags);
clone.SubjectMappings.ShouldNotBeSameAs(original.SubjectMappings);
clone.TlsPinnedCerts.ShouldNotBeSameAs(original.TlsPinnedCerts);
clone.InCmdLine.ShouldNotBeSameAs(original.InCmdLine);
clone.InCmdLine.ShouldContain("host");
}
[Fact]
public void ProcessConfigString_sets_config_digest_and_applies_values()
{
var opts = new NatsOptions();
opts.ProcessConfigString("port: 4333");
opts.Port.ShouldBe(4333);
opts.ConfigDigest().ShouldNotBeNullOrWhiteSpace();
}
[Fact]
public void NoErrOnUnknownFields_toggle_is_available()
{
NatsOptions.NoErrOnUnknownFields(true);
var ex = Record.Exception(() => new NatsOptions().ProcessConfigString("totally_unknown_field: 1"));
ex.ShouldBeNull();
NatsOptions.NoErrOnUnknownFields(false);
}
[Fact]
public void Option_parity_types_exist()
{
var jsLimits = new JSLimitOpts
{
MaxRequestBatch = 10,
MaxAckPending = 20,
};
jsLimits.MaxRequestBatch.ShouldBe(10);
jsLimits.MaxAckPending.ShouldBe(20);
var callout = new AuthCallout
{
Issuer = "issuer",
Account = "A",
AllowedAccounts = ["A", "B"],
};
callout.Issuer.ShouldBe("issuer");
callout.AllowedAccounts.ShouldContain("B");
var proxies = new ProxiesConfig
{
Trusted = [new ProxyConfig { Key = "k1" }],
};
proxies.Trusted.Count.ShouldBe(1);
proxies.Trusted[0].Key.ShouldBe("k1");
}
}