using ChatBot.Services.Telegram.Commands; using FluentAssertions; namespace ChatBot.Tests.Telegram.Commands; public class TelegramCommandContextTests { [Fact] public void Create_ShouldCreateContextWithBasicProperties() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "Hello bot"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Should().NotBeNull(); context.ChatId.Should().Be(chatId); context.Username.Should().Be(username); context.MessageText.Should().Be(messageText); context.ChatType.Should().Be(chatType); context.ChatTitle.Should().Be(chatTitle); context.Arguments.Should().Be("bot"); // "Hello bot" split by space gives ["Hello", "bot"] context.ReplyInfo.Should().BeNull(); } [Fact] public void Create_ShouldExtractArgumentsFromMessage() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1 arg2 arg3"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1 arg2 arg3"); } [Fact] public void Create_ShouldHandleEmptyArguments() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleMessageWithoutCommand() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "Hello bot"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("bot"); // "Hello bot" split by space gives ["Hello", "bot"] } [Fact] public void Create_ShouldRemoveBotUsernameFromCommand() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@mybot arg1 arg2"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1 arg2"); } [Fact] public void Create_ShouldHandleMultipleBotUsernames() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@bot1@bot2 arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } [Fact] public void Create_ShouldHandleAtSymbolWithoutBotName() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@ arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } [Fact] public void Create_ShouldHandleEmptyBotUsername() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@ arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } [Fact] public void Create_ShouldTrimArguments() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1 arg2 "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1 arg2"); } [Fact] public void Create_ShouldHandleReplyInfo() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; var replyInfo = new ReplyInfo { MessageId = 1, UserId = 123, Username = "otheruser", }; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle, replyInfo ); // Assert context.ReplyInfo.Should().Be(replyInfo); context.ReplyInfo!.MessageId.Should().Be(1); context.ReplyInfo.UserId.Should().Be(123); context.ReplyInfo.Username.Should().Be("otheruser"); } [Fact] public void Create_ShouldHandleNullReplyInfo() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; ReplyInfo? replyInfo = null; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle, replyInfo ); // Assert context.ReplyInfo.Should().BeNull(); } [Fact] public void Create_ShouldHandleEmptyMessage() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = ""; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.MessageText.Should().BeEmpty(); context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleWhitespaceOnlyMessage() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = " "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.MessageText.Should().Be(" "); context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleVeryLongMessage() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start " + new string('A', 10000); var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().HaveLength(10000); context.Arguments.Should().StartWith("AAAA"); } [Fact] public void Create_ShouldHandleSpecialCharactersInArguments() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start !@#$%^&*()_+-=[]{}|;':\",./<>?"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("!@#$%^&*()_+-=[]{}|;':\",./<>?"); } [Fact] public void Create_ShouldHandleUnicodeCharacters() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start привет мир 🌍"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("привет мир 🌍"); } [Fact] public void Create_ShouldHandleNegativeChatId() { // Arrange var chatId = -12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.ChatId.Should().Be(chatId); } [Fact] public void Create_ShouldHandleZeroChatId() { // Arrange var chatId = 0L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.ChatId.Should().Be(chatId); } [Fact] public void Create_ShouldHandleEmptyUsername() { // Arrange var chatId = 12345L; var username = ""; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Username.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleEmptyChatType() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = ""; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.ChatType.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleEmptyChatTitle() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = ""; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.ChatTitle.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleVeryLongUsername() { // Arrange var chatId = 12345L; var username = new string('A', 1000); var messageText = "/start arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Username.Should().HaveLength(1000); context.Username.Should().StartWith("AAAA"); } [Fact] public void Create_ShouldHandleVeryLongChatTitle() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1"; var chatType = "private"; var chatTitle = new string('B', 1000); // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.ChatTitle.Should().HaveLength(1000); context.ChatTitle.Should().StartWith("BBBB"); } [Fact] public void Create_ShouldHandleMessageWithOnlySpaces() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = " "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.MessageText.Should().Be(" "); context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleMessageWithTabsAndNewlines() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start\targ1\narg2\r\narg3"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().BeEmpty(); // Split by space only, so tabs and newlines are not split } [Fact] public void Create_ShouldHandleMessageWithMultipleSpacesInArguments() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start arg1 arg2 arg3"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1 arg2 arg3"); // Trim() removes leading spaces } [Fact] public void Create_ShouldHandleMessageWithOnlyCommandAndSpaces() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleMessageWithCommandAndOnlySpacesAsArguments() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().BeEmpty(); } [Fact] public void Create_ShouldHandleMessageWithCommandAndMixedWhitespace() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start\t \n arg1 \t arg2 \r\n "; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1 \t arg2"); // Split by space and trim removes leading/trailing spaces } [Fact] public void Create_ShouldHandleMessageWithVeryLongBotUsername() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@verylongbotname arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } [Fact] public void Create_ShouldHandleMessageWithSpecialCharactersInBotUsername() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@bot_name-123 arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } [Fact] public void Create_ShouldHandleMessageWithUnicodeInBotUsername() { // Arrange var chatId = 12345L; var username = "testuser"; var messageText = "/start@бот123 arg1"; var chatType = "private"; var chatTitle = "Test Chat"; // Act var context = TelegramCommandContext.Create( chatId, username, messageText, chatType, chatTitle ); // Assert context.Arguments.Should().Be("arg1"); } }