using ChatBot.Services.Telegram.Commands; using FluentAssertions; using Xunit; namespace ChatBot.Tests.Telegram.Commands; public class ReplyInfoTests { [Fact] public void ReplyInfo_ShouldHaveCorrectProperties() { // Arrange & Act var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = "testuser", }; // Assert replyInfo.MessageId.Should().Be(123); replyInfo.UserId.Should().Be(456L); replyInfo.Username.Should().Be("testuser"); } [Fact] public void ReplyInfo_ShouldAllowNullUsername() { // Arrange & Act var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = null, }; // Assert replyInfo.MessageId.Should().Be(123); replyInfo.UserId.Should().Be(456L); replyInfo.Username.Should().BeNull(); } [Fact] public void ReplyInfo_ShouldAllowEmptyUsername() { // Arrange & Act var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = string.Empty, }; // Assert replyInfo.MessageId.Should().Be(123); replyInfo.UserId.Should().Be(456L); replyInfo.Username.Should().BeEmpty(); } [Fact] public void Create_ShouldReturnReplyInfo_WhenValidParameters() { // Arrange var messageId = 123; var userId = 456L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldReturnReplyInfo_WhenUsernameIsNull() { // Arrange var messageId = 123; var userId = 456L; string? username = null; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().BeNull(); } [Fact] public void Create_ShouldReturnReplyInfo_WhenUsernameIsEmpty() { // Arrange var messageId = 123; var userId = 456L; var username = string.Empty; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().BeEmpty(); } [Fact] public void Create_ShouldReturnNull_WhenMessageIdIsNull() { // Arrange int? messageId = null; var userId = 456L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().BeNull(); } [Fact] public void Create_ShouldReturnNull_WhenUserIdIsNull() { // Arrange var messageId = 123; long? userId = null; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().BeNull(); } [Fact] public void Create_ShouldReturnNull_WhenBothMessageIdAndUserIdAreNull() { // Arrange int? messageId = null; long? userId = null; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().BeNull(); } [Fact] public void Create_ShouldReturnNull_WhenMessageIdIsZero() { // Arrange var messageId = 0; var userId = 456L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); // 0 is a valid message ID result!.MessageId.Should().Be(0); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldReturnNull_WhenUserIdIsZero() { // Arrange var messageId = 123; var userId = 0L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); // 0 is a valid user ID result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(0L); result.Username.Should().Be(username); } [Fact] public void Create_ShouldReturnNull_WhenMessageIdIsNegative() { // Arrange var messageId = -1; var userId = 456L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); // Negative values are still valid result!.MessageId.Should().Be(-1); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldReturnNull_WhenUserIdIsNegative() { // Arrange var messageId = 123; var userId = -1L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); // Negative values are still valid result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(-1L); result.Username.Should().Be(username); } [Fact] public void Create_ShouldHandleVeryLongUsername() { // Arrange var messageId = 123; var userId = 456L; var username = new string('a', 1000); // Very long username // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); result.Username.Should().HaveLength(1000); } [Fact] public void Create_ShouldHandleUsernameWithSpecialCharacters() { // Arrange var messageId = 123; var userId = 456L; var username = "user@domain.com!@#$%^&*()_+-=[]{}|;':\",./<>?"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldHandleUsernameWithUnicodeCharacters() { // Arrange var messageId = 123; var userId = 456L; var username = "пользователь_用户_ユーザー_مستخدم"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldHandleUsernameWithWhitespace() { // Arrange var messageId = 123; var userId = 456L; var username = " user with spaces "; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); // Username is preserved as-is } [Fact] public void Create_ShouldHandleUsernameWithNewlines() { // Arrange var messageId = 123; var userId = 456L; var username = "user\nwith\nnewlines"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void Create_ShouldHandleUsernameWithTabs() { // Arrange var messageId = 123; var userId = 456L; var username = "user\twith\ttabs"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Theory] [InlineData(0)] [InlineData(1)] [InlineData(100)] [InlineData(int.MaxValue)] [InlineData(int.MinValue)] public void Create_ShouldHandleVariousMessageIds(int messageId) { // Arrange var userId = 456L; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Theory] [InlineData(0L)] [InlineData(1L)] [InlineData(100L)] [InlineData(long.MaxValue)] [InlineData(long.MinValue)] public void Create_ShouldHandleVariousUserIds(long userId) { // Arrange var messageId = 123; var username = "testuser"; // Act var result = ReplyInfo.Create(messageId, userId, username); // Assert result.Should().NotBeNull(); result!.MessageId.Should().Be(messageId); result.UserId.Should().Be(userId); result.Username.Should().Be(username); } [Fact] public void ReplyInfo_ShouldBeMutable() { // Arrange var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = "testuser", }; // Act replyInfo.MessageId = 789; replyInfo.UserId = 101112L; replyInfo.Username = "newuser"; // Assert replyInfo.MessageId.Should().Be(789); replyInfo.UserId.Should().Be(101112L); replyInfo.Username.Should().Be("newuser"); } [Fact] public void ReplyInfo_ShouldAllowSettingUsernameToNull() { // Arrange var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = "testuser", }; // Act replyInfo.Username = null; // Assert replyInfo.Username.Should().BeNull(); } [Fact] public void ReplyInfo_ShouldAllowSettingUsernameToEmpty() { // Arrange var replyInfo = new ReplyInfo { MessageId = 123, UserId = 456L, Username = "testuser", }; // Act replyInfo.Username = string.Empty; // Assert replyInfo.Username.Should().BeEmpty(); } }