namespace ScadaLink.ClusterInfrastructure.Tests;

/// <summary>
/// Tests for ClusterOptions default values and property setters.
/// </summary>
public class ClusterOptionsTests
{
    [Fact]
    public void DefaultValues_AreCorrect()
    {
        var options = new ClusterOptions();

        Assert.Equal("keep-oldest", options.SplitBrainResolverStrategy);
        Assert.Equal(TimeSpan.FromSeconds(15), options.StableAfter);
        Assert.Equal(TimeSpan.FromSeconds(2), options.HeartbeatInterval);
        Assert.Equal(TimeSpan.FromSeconds(10), options.FailureDetectionThreshold);
        Assert.Equal(1, options.MinNrOfMembers);
        Assert.True(options.DownIfAlone);
    }

    [Fact]
    public void DownIfAlone_CanBeSet()
    {
        var options = new ClusterOptions { DownIfAlone = false };

        Assert.False(options.DownIfAlone);
    }

    [Fact]
    public void SeedNodes_DefaultsToEmptyList()
    {
        var options = new ClusterOptions();

        Assert.NotNull(options.SeedNodes);
        Assert.Empty(options.SeedNodes);
    }

    [Fact]
    public void Properties_CanBeSetToCustomValues()
    {
        var options = new ClusterOptions
        {
            SeedNodes = new List<string> { "akka.tcp://system@node1:2551", "akka.tcp://system@node2:2551" },
            SplitBrainResolverStrategy = "keep-majority",
            StableAfter = TimeSpan.FromSeconds(30),
            HeartbeatInterval = TimeSpan.FromSeconds(5),
            FailureDetectionThreshold = TimeSpan.FromSeconds(20),
            MinNrOfMembers = 2
        };

        Assert.Equal(2, options.SeedNodes.Count);
        Assert.Contains("akka.tcp://system@node1:2551", options.SeedNodes);
        Assert.Contains("akka.tcp://system@node2:2551", options.SeedNodes);
        Assert.Equal("keep-majority", options.SplitBrainResolverStrategy);
        Assert.Equal(TimeSpan.FromSeconds(30), options.StableAfter);
        Assert.Equal(TimeSpan.FromSeconds(5), options.HeartbeatInterval);
        Assert.Equal(TimeSpan.FromSeconds(20), options.FailureDetectionThreshold);
        Assert.Equal(2, options.MinNrOfMembers);
    }
}
