Files
EchoHub/src/EchoHub.Tests/Irc/IrcMessageTests.cs
T
HueByte c0d38015ff Add comprehensive unit tests for IRC command handling and message formatting
- Implemented IrcCommandHandlerTests to cover various IRC commands including PING, JOIN, PART, and authentication scenarios.
- Added IrcMessageFormatterTests to validate message formatting for different message types such as text, images, files, and audio.
- Created IrcMessageTests to ensure correct parsing of IRC messages and handling of various command formats.
- Introduced TestHelpers to facilitate testing with mock connections and streams, including a FakeChatService and FakeEncryptionService for simulating chat behavior.
2026-02-21 11:25:34 +01:00

184 lines
5.5 KiB
C#

using EchoHub.Server.Irc;
using Xunit;
namespace EchoHub.Tests.Irc;
public class IrcMessageTests
{
[Fact]
public void Parse_SimpleCommand_ExtractsCommand()
{
var msg = IrcMessage.Parse("PING");
Assert.Equal("PING", msg.Command);
Assert.Null(msg.Prefix);
Assert.Empty(msg.Parameters);
}
[Fact]
public void Parse_CommandWithOneParam_ExtractsParam()
{
var msg = IrcMessage.Parse("NICK alice");
Assert.Equal("NICK", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("alice", msg.Parameters[0]);
}
[Fact]
public void Parse_CommandWithTrailing_ExtractsTrailingAsLastParam()
{
var msg = IrcMessage.Parse("PRIVMSG #general :Hello world!");
Assert.Equal("PRIVMSG", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("#general", msg.Parameters[0]);
Assert.Equal("Hello world!", msg.Parameters[1]);
Assert.Equal("Hello world!", msg.Trailing);
}
[Fact]
public void Parse_MessageWithPrefix_ExtractsPrefix()
{
var msg = IrcMessage.Parse(":alice!alice@echohub PRIVMSG #general :hi");
Assert.Equal("alice!alice@echohub", msg.Prefix);
Assert.Equal("PRIVMSG", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("#general", msg.Parameters[0]);
Assert.Equal("hi", msg.Parameters[1]);
}
[Fact]
public void Parse_MultipleParams_ExtractsAll()
{
var msg = IrcMessage.Parse("USER alice 0 * :Alice Smith");
Assert.Equal("USER", msg.Command);
Assert.Equal(4, msg.Parameters.Count);
Assert.Equal("alice", msg.Parameters[0]);
Assert.Equal("0", msg.Parameters[1]);
Assert.Equal("*", msg.Parameters[2]);
Assert.Equal("Alice Smith", msg.Parameters[3]);
}
[Fact]
public void Parse_PingWithToken_ExtractsToken()
{
var msg = IrcMessage.Parse("PING :server.example.com");
Assert.Equal("PING", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("server.example.com", msg.Parameters[0]);
}
[Fact]
public void Parse_CapLs_ParsesSubcommand()
{
var msg = IrcMessage.Parse("CAP LS 302");
Assert.Equal("CAP", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("LS", msg.Parameters[0]);
Assert.Equal("302", msg.Parameters[1]);
}
[Fact]
public void Parse_CapReqWithTrailing_ParsesSasl()
{
var msg = IrcMessage.Parse("CAP REQ :sasl");
Assert.Equal("CAP", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("REQ", msg.Parameters[0]);
Assert.Equal("sasl", msg.Parameters[1]);
}
[Fact]
public void Parse_JoinMultipleChannels_ExtractsCsv()
{
var msg = IrcMessage.Parse("JOIN #general,#random");
Assert.Equal("JOIN", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("#general,#random", msg.Parameters[0]);
}
[Fact]
public void Parse_PartWithReason_ExtractsReason()
{
var msg = IrcMessage.Parse("PART #general :Leaving for now");
Assert.Equal("PART", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("#general", msg.Parameters[0]);
Assert.Equal("Leaving for now", msg.Parameters[1]);
}
[Fact]
public void Parse_EmptyTrailing_ExtractsEmptyString()
{
var msg = IrcMessage.Parse("PRIVMSG #general :");
Assert.Equal("PRIVMSG", msg.Command);
Assert.Equal(2, msg.Parameters.Count);
Assert.Equal("#general", msg.Parameters[0]);
Assert.Equal("", msg.Parameters[1]);
}
[Fact]
public void Parse_TrailingWithColons_PreservesColons()
{
var msg = IrcMessage.Parse("PRIVMSG #general :time is 12:30:00");
Assert.Equal("time is 12:30:00", msg.Parameters[1]);
}
[Fact]
public void Parse_CrLfTrimmed()
{
var msg = IrcMessage.Parse("PING\r\n");
Assert.Equal("PING", msg.Command);
Assert.Empty(msg.Parameters);
}
[Fact]
public void Parse_ExtraSpaces_Handled()
{
var msg = IrcMessage.Parse("NICK alice");
Assert.Equal("NICK", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("alice", msg.Parameters[0]);
}
[Fact]
public void Parse_Authenticate_Base64Payload()
{
var payload = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("\0alice\0secret"));
var msg = IrcMessage.Parse($"AUTHENTICATE {payload}");
Assert.Equal("AUTHENTICATE", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal(payload, msg.Parameters[0]);
}
[Fact]
public void Parse_PassCommand_ExtractsPassword()
{
var msg = IrcMessage.Parse("PASS mysecretpassword");
Assert.Equal("PASS", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("mysecretpassword", msg.Parameters[0]);
}
[Fact]
public void Parse_QuitWithMessage_ExtractsMessage()
{
var msg = IrcMessage.Parse("QUIT :Goodbye!");
Assert.Equal("QUIT", msg.Command);
Assert.Single(msg.Parameters);
Assert.Equal("Goodbye!", msg.Parameters[0]);
}
[Fact]
public void Trailing_NoParams_ReturnsNull()
{
var msg = IrcMessage.Parse("PING");
Assert.Null(msg.Trailing);
}
[Fact]
public void Trailing_WithParams_ReturnsLastParam()
{
var msg = IrcMessage.Parse("MODE #channel +o alice");
Assert.Equal("alice", msg.Trailing);
}
}