// Copyright 2012-2025 The NATS Authors
// Licensed under the Apache License, Version 2.0
using Xunit.Abstractions;
namespace ZB.MOM.NatsNet.Server.IntegrationTests.Helpers;
///
/// Stub helper for creating multi-server NATS clusters in integration tests.
/// In the Go test suite, this corresponds to createJetStreamCluster(t, numServers, name) and
/// createJetStreamSuperCluster(t, numClusters, numServersPerCluster).
///
/// This stub is a placeholder until cluster orchestration is implemented.
/// Tests using this helper will skip unless NATS_INTEGRATION_ENABLED=true.
///
public sealed class TestCluster : IDisposable
{
private readonly ITestOutputHelper _output;
/// Number of servers in the cluster.
public int ServerCount { get; }
/// Cluster name.
public string Name { get; }
/// URL of a random server in the cluster (stub returns the default URL).
public string RandomServerUrl =>
Environment.GetEnvironmentVariable("NATS_TEST_SERVER_URL") ?? "nats://localhost:4222";
private TestCluster(ITestOutputHelper output, int serverCount, string name)
{
_output = output;
ServerCount = serverCount;
Name = name;
}
///
/// Creates a stub JetStream cluster. Throws NotSupportedException when integration is disabled.
/// Corresponds to createJetStreamCluster(t, numServers, name) in Go tests.
///
public static TestCluster CreateJetStreamCluster(int numServers, string name, ITestOutputHelper output)
{
if (!IntegrationTestBase.IntegrationEnabled)
throw new NotSupportedException(IntegrationTestBase.SkipMessage);
output.WriteLine($"Creating JetStream cluster '{name}' with {numServers} servers (stub)");
return new TestCluster(output, numServers, name);
}
///
/// Creates a stub JetStream super-cluster.
/// Corresponds to createJetStreamSuperCluster(t, numClusters, numServers) in Go tests.
///
public static TestCluster CreateJetStreamSuperCluster(int numClusters, int numServersPerCluster, ITestOutputHelper output)
{
if (!IntegrationTestBase.IntegrationEnabled)
throw new NotSupportedException(IntegrationTestBase.SkipMessage);
output.WriteLine($"Creating JetStream super-cluster with {numClusters} clusters x {numServersPerCluster} servers (stub)");
return new TestCluster(output, numClusters * numServersPerCluster, $"SuperCluster({numClusters}x{numServersPerCluster})");
}
public void Dispose()
{
_output.WriteLine($"Shutting down cluster '{Name}'");
}
}