Files
natsdotnet/tests/NATS.Server.Monitoring.Tests/Events/EventApiAndSubjectsParityBatch2Tests.cs
Joseph Doherty 0c086522a4 refactor: extract NATS.Server.Monitoring.Tests project
Move 39 monitoring, events, and system endpoint test files from
NATS.Server.Tests into a dedicated NATS.Server.Monitoring.Tests project.
Update namespaces, replace private GetFreePort/ReadUntilAsync with
TestUtilities shared helpers, add InternalsVisibleTo, and register
in the solution file. All 439 tests pass.
2026-03-12 15:44:12 -04:00

153 lines
5.3 KiB
C#

using System.Text.Json;
using NATS.Server.Events;
namespace NATS.Server.Monitoring.Tests.Events;
public class EventApiAndSubjectsParityBatch2Tests
{
[Fact]
public void EventSubjects_DefineMissingServerRequestSubjects()
{
EventSubjects.RemoteLatency.ShouldBe("$SYS.SERVER.{0}.ACC.{1}.LATENCY.M2");
EventSubjects.UserDirectInfo.ShouldBe("$SYS.REQ.USER.INFO");
EventSubjects.UserDirectReq.ShouldBe("$SYS.REQ.USER.{0}.INFO");
EventSubjects.AccountNumSubsReq.ShouldBe("$SYS.REQ.ACCOUNT.NSUBS");
EventSubjects.AccountSubs.ShouldBe("$SYS._INBOX_.{0}.NSUBS");
EventSubjects.ClientKickReq.ShouldBe("$SYS.REQ.SERVER.{0}.KICK");
EventSubjects.ClientLdmReq.ShouldBe("$SYS.REQ.SERVER.{0}.LDM");
EventSubjects.ServerStatsPingReq.ShouldBe("$SYS.REQ.SERVER.PING.STATSZ");
EventSubjects.ServerReloadReq.ShouldBe("$SYS.REQ.SERVER.{0}.RELOAD");
}
[Fact]
public void OcspSubjects_MatchGoPatterns()
{
EventSubjects.OcspPeerReject.ShouldBe("$SYS.SERVER.{0}.OCSP.PEER.CONN.REJECT");
EventSubjects.OcspPeerChainlinkInvalid.ShouldBe("$SYS.SERVER.{0}.OCSP.PEER.LINK.INVALID");
}
[Fact]
public void OcspPeerRejectEvent_IncludesPeerCertInfo()
{
var evt = new OcspPeerRejectEventMsg
{
Id = "id",
Kind = "client",
Reason = "revoked",
Peer = new EventCertInfo
{
Subject = "CN=client",
Issuer = "CN=issuer",
Fingerprint = "fingerprint",
Raw = "raw",
},
};
var json = JsonSerializer.Serialize(evt);
json.ShouldContain("\"peer\":");
json.ShouldContain("\"subject\":\"CN=client\"");
}
[Fact]
public void OcspPeerChainlinkInvalidEvent_SerializesExpectedShape()
{
var evt = new OcspPeerChainlinkInvalidEventMsg
{
Id = "id",
Link = new EventCertInfo { Subject = "CN=link" },
Peer = new EventCertInfo { Subject = "CN=peer" },
};
var json = JsonSerializer.Serialize(evt);
json.ShouldContain("\"type\":\"io.nats.server.advisory.v1.ocsp_peer_link_invalid\"");
json.ShouldContain("\"link\":");
json.ShouldContain("\"peer\":");
}
[Fact]
public void EventFilterOptions_HasCoreGoFields()
{
var opts = new EventFilterOptions
{
Name = "srv-a",
Cluster = "cluster-a",
Host = "127.0.0.1",
Tags = ["a", "b"],
Domain = "domain-a",
};
opts.Name.ShouldBe("srv-a");
opts.Cluster.ShouldBe("cluster-a");
opts.Host.ShouldBe("127.0.0.1");
opts.Tags.ShouldBe(["a", "b"]);
opts.Domain.ShouldBe("domain-a");
}
[Fact]
public void OptionRequestTypes_IncludeBaseFilterFields()
{
new StatszEventOptions { Name = "n" }.Name.ShouldBe("n");
new ConnzEventOptions { Cluster = "c" }.Cluster.ShouldBe("c");
new RoutezEventOptions { Host = "h" }.Host.ShouldBe("h");
new HealthzEventOptions { Domain = "d" }.Domain.ShouldBe("d");
new JszEventOptions { Tags = ["t"] }.Tags.ShouldBe(["t"]);
}
[Fact]
public void ServerApiResponses_ExposeDataAndError()
{
var response = new ServerAPIResponse
{
Server = new EventServerInfo { Id = "S1" },
Data = new { ok = true },
Error = new ServerAPIError { Code = 500, Description = "err" },
};
response.Server.Id.ShouldBe("S1");
response.Error?.Code.ShouldBe(500);
response.Error?.Description.ShouldBe("err");
}
[Fact]
public void TypedServerApiWrappers_CarryResponsePayload()
{
new ServerAPIConnzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIRoutezResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIGatewayzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIJszResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIHealthzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIVarzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPISubszResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPILeafzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIAccountzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIExpvarzResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIpqueueszResponse { Data = new object() }.Data.ShouldNotBeNull();
new ServerAPIRaftzResponse { Data = new object() }.Data.ShouldNotBeNull();
}
[Fact]
public void RequestPayloadTypes_KickAndLdm()
{
var kick = new KickClientReq { ClientId = 22 };
var ldm = new LDMClientReq { ClientId = 33 };
kick.ClientId.ShouldBe(22UL);
ldm.ClientId.ShouldBe(33UL);
}
[Fact]
public void UserInfo_IncludesExpectedIdentityFields()
{
var info = new UserInfo
{
User = "alice",
Account = "A",
Permissions = "pubsub",
};
info.User.ShouldBe("alice");
info.Account.ShouldBe("A");
info.Permissions.ShouldBe("pubsub");
}
}