Files
Nitrox/Nitrox.Test/Client/Communication/MultiplayerSession/ConnectionState/DisconnectedStateTests.cs
2025-07-06 00:23:46 +02:00

148 lines
5.7 KiB
C#

using System;
using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Nitrox.Test.Client.Communication.MultiplayerSession;
using NitroxClient.Communication.Abstract;
using NitroxModel.Packets;
using NSubstitute;
namespace NitroxClient.Communication.MultiplayerSession.ConnectionState
{
[TestClass]
public class DisconnectedStateTests
{
[TestMethod]
public void NegotiateShouldStartTheClientOnTheContext()
{
// Arrange
IClient serverClient = Substitute.For<IClient>();
serverClient.IsConnected.Returns(false);
serverClient
.When(client => client.StartAsync(Arg.Any<string>(), TestConstants.TEST_SERVER_PORT))
.Do(info => serverClient.IsConnected.Returns(true));
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
connectionContext.Client.Returns(serverClient);
connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT);
Disconnected connectionState = new Disconnected();
// Act
connectionState.NegotiateReservationAsync(connectionContext);
// Assert
serverClient.IsConnected.Should().BeTrue();
}
[TestMethod]
public void NegotiateShouldSendMultiplayerSessionPolicyRequestPacketToClient()
{
// Arrange
IClient serverClient = Substitute.For<IClient>();
serverClient.IsConnected.Returns(false);
serverClient
.When(client => client.StartAsync(Arg.Any<string>(), TestConstants.TEST_SERVER_PORT))
.Do(info => serverClient.IsConnected.Returns(true));
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
connectionContext.Client.Returns(serverClient);
connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT);
Disconnected connectionState = new Disconnected();
// Act
connectionState.NegotiateReservationAsync(connectionContext);
// Assert
serverClient.Received().Send(Arg.Any<MultiplayerSessionPolicyRequest>());
}
[TestMethod]
public void NegotiateShouldTransitionToEstablishingSessionPolicyState()
{
// Arrange
IClient serverClient = Substitute.For<IClient>();
serverClient.IsConnected.Returns(false);
serverClient
.When(client => client.StartAsync(Arg.Any<string>(), TestConstants.TEST_SERVER_PORT))
.Do(info => serverClient.IsConnected.Returns(true));
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
connectionContext.Client.Returns(serverClient);
connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT);
Disconnected connectionState = new Disconnected();
// Act
connectionState.NegotiateReservationAsync(connectionContext);
// Assert
connectionContext.Received().UpdateConnectionState(Arg.Any<EstablishingSessionPolicy>());
}
[TestMethod]
public async Task NegotiateShouldThrowInvalidOperationExceptionWhenClientIsNull()
{
// Arrange
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
connectionContext.Client.Returns((IClient)null);
connectionContext.IpAddress.Returns(TestConstants.TEST_IP_ADDRESS);
Disconnected connectionState = new Disconnected();
// Act
Func<Task> action = async () => await connectionState.NegotiateReservationAsync(connectionContext);
// Assert
await action.Should().ThrowAsync<InvalidOperationException>();
}
[TestMethod]
public async Task NegotiateShouldThrowInvalidOperationExceptionWhenIpAddressIsNull()
{
// Arrange
IClient client = Substitute.For<IClient>();
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
connectionContext.Client.Returns(client);
connectionContext.IpAddress.Returns((string)null);
Disconnected connectionState = new Disconnected();
// Act
Func<Task> action = async () => await connectionState.NegotiateReservationAsync(connectionContext);
// Assert
await action.Should().ThrowAsync<InvalidOperationException>();
}
[TestMethod]
public void JoinSessionShouldThrowInvalidOperationException()
{
// Arrange
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
Disconnected connectionState = new Disconnected();
// Act
Action action = () => connectionState.JoinSession(connectionContext);
// Assert
action.Should().Throw<InvalidOperationException>();
}
[TestMethod]
public void DisconnectShouldThrowInvalidOperationException()
{
// Arrange
IMultiplayerSessionConnectionContext connectionContext = Substitute.For<IMultiplayerSessionConnectionContext>();
Disconnected connectionState = new Disconnected();
// Act
Action action = () => connectionState.Disconnect(connectionContext);
// Assert
action.Should().Throw<InvalidOperationException>();
}
}
}