diff --git a/Bottomly.Tests/Slack/EventHandlers/GetCurrentKarmaReasonsHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/GetCurrentKarmaReasonsHandlerTests.cs index 74ff5b2..148df7b 100644 --- a/Bottomly.Tests/Slack/EventHandlers/GetCurrentKarmaReasonsHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/GetCurrentKarmaReasonsHandlerTests.cs @@ -50,13 +50,15 @@ public async Task HandleAsync_PlainRecipient_CallsCommandWithRecipient() _mockKarmaRepo.Verify(r => r.GetKarmaReasonsAsync("alice"), Times.Once()); } - [Fact] - public async Task HandleAsync_NoRecipient_CallsCommandWithMessageUser() + [Theory] + [InlineData("_reasons")] + [InlineData("_reasons ")] + public async Task HandleAsync_NoRecipient_CallsCommandWithMessageUser(string message) { _mockKarmaRepo.Setup(r => r.GetKarmaReasonsAsync("U_sender")).ReturnsAsync( new KarmaReasonsResult(0, new List().AsReadOnly())); - await _handler.HandleAsync(CreateMessage("_reasons ")); + await _handler.HandleAsync(CreateMessage(message)); _mockKarmaRepo.Verify(r => r.GetKarmaReasonsAsync("U_sender"), Times.Once()); } diff --git a/Bottomly.Tests/Slack/EventHandlers/GiphyHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/GiphyHandlerTests.cs index 2ce89fe..9f6d73f 100644 --- a/Bottomly.Tests/Slack/EventHandlers/GiphyHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/GiphyHandlerTests.cs @@ -78,6 +78,16 @@ public async Task HandleAsync_ValidEvent_EmptyResult_SendsNoGifsMessage() _mockBroker.Verify(b => b.SendMessageAsync("No gifs found for \"xyz\"", "C1", null), Times.Once()); } + [Theory] + [InlineData("_gif")] + [InlineData("_gif ")] + public async Task HandleAsync_NoArgument_SendsPleaseProvideMessage(string text) + { + await _handler.HandleAsync(CreateMessage(text)); + + _mockBroker.Verify(b => b.SendMessageAsync("Please provide a search term.", "C1", null), Times.Once()); + } + [Fact] public async Task HandleAsync_HelpEvent_SendsHelpMessage() { diff --git a/Bottomly.Tests/Slack/EventHandlers/ImageSearchHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/ImageSearchHandlerTests.cs index cc5f5a3..7b2b5bd 100644 --- a/Bottomly.Tests/Slack/EventHandlers/ImageSearchHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/ImageSearchHandlerTests.cs @@ -79,6 +79,16 @@ public async Task HandleAsync_ValidEvent_NoResultsFound_SendsNoResultMessage() _mockBroker.Verify(b => b.SendMessageAsync("No image results found for \"xyz\"", "C1", null), Times.Once()); } + [Theory] + [InlineData("_gi")] + [InlineData("_gi ")] + public async Task HandleAsync_NoArgument_SendsPleaseProvideMessage(string text) + { + await _handler.HandleAsync(CreateMessage(text)); + + _mockBroker.Verify(b => b.SendMessageAsync("Please provide a search query.", "C1", null), Times.Once()); + } + [Fact] public async Task HandleAsync_HelpEvent_SendsHelpMessage() { diff --git a/Bottomly.Tests/Slack/EventHandlers/SearchHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/SearchHandlerTests.cs index 09a485b..012b8f2 100644 --- a/Bottomly.Tests/Slack/EventHandlers/SearchHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/SearchHandlerTests.cs @@ -66,6 +66,16 @@ public async Task HandleAsync_ValidEvent_EmptySearchTermResult_SendsNoResultMess _mockBroker.Verify(b => b.SendMessageAsync("No results found for \"xyz\"", "C1", null), Times.Once()); } + [Theory] + [InlineData("_g")] + [InlineData("_g ")] + public async Task HandleAsync_NoArgument_SendsPleaseProvideMessage(string text) + { + await _handler.HandleAsync(CreateMessage(text)); + + _mockBroker.Verify(b => b.SendMessageAsync("Please provide a search query.", "C1", null), Times.Once()); + } + [Fact] public async Task HandleAsync_HelpEvent_SendsHelpMessage() { diff --git a/Bottomly.Tests/Slack/EventHandlers/UrbanHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/UrbanHandlerTests.cs index e6bdfac..71eb850 100644 --- a/Bottomly.Tests/Slack/EventHandlers/UrbanHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/UrbanHandlerTests.cs @@ -65,6 +65,16 @@ public async Task HandleAsync_ValidEvent_NotFoundResult_SendsExerciseMessage() _mockBroker.Verify(b => b.SendMessageAsync("Left as an exercise for the reader.", "C1", "ts1"), Times.Once()); } + [Theory] + [InlineData("_ud")] + [InlineData("_ud ")] + public async Task HandleAsync_NoArgument_SendsPleaseProvideMessage(string text) + { + await _handler.HandleAsync(CreateMessage(text)); + + _mockBroker.Verify(b => b.SendMessageAsync("Please provide a search term.", "C1", null), Times.Once()); + } + [Fact] public async Task HandleAsync_HelpEvent_SendsHelpMessage() { diff --git a/Bottomly.Tests/Slack/EventHandlers/WikipediaHandlerTests.cs b/Bottomly.Tests/Slack/EventHandlers/WikipediaHandlerTests.cs index c81da1e..adeaf44 100644 --- a/Bottomly.Tests/Slack/EventHandlers/WikipediaHandlerTests.cs +++ b/Bottomly.Tests/Slack/EventHandlers/WikipediaHandlerTests.cs @@ -65,6 +65,16 @@ public async Task HandleAsync_ValidEvent_NotFoundResult_SendsNoResultMessage() _mockBroker.Verify(b => b.SendMessageAsync("No results found for \"xyz\"", "C1", null), Times.Once()); } + [Theory] + [InlineData("_wik")] + [InlineData("_wik ")] + public async Task HandleAsync_NoArgument_SendsPleaseProvideMessage(string text) + { + await _handler.HandleAsync(CreateMessage(text)); + + _mockBroker.Verify(b => b.SendMessageAsync("Please provide a search term.", "C1", null), Times.Once()); + } + [Fact] public async Task HandleAsync_HelpEvent_SendsHelpMessage() { diff --git a/Bottomly/Slack/MessageEventHandlers/GetCurrentKarmaReasonsHandler.cs b/Bottomly/Slack/MessageEventHandlers/GetCurrentKarmaReasonsHandler.cs index fca883f..fbc0b3b 100644 --- a/Bottomly/Slack/MessageEventHandlers/GetCurrentKarmaReasonsHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/GetCurrentKarmaReasonsHandler.cs @@ -27,7 +27,7 @@ protected override string GetPurpose() => protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { var text = await parser.ReplaceSlackIdTokensWithUsernamesAsync(message.Text!); - var recipient = text[CommandTrigger.Length..].Split(' ')[0]; + var recipient = text[CommandTrigger.TrimEnd().Length..].TrimStart().Split(' ')[0]; if (string.IsNullOrEmpty(recipient)) { recipient = message.User; diff --git a/Bottomly/Slack/MessageEventHandlers/GiphyHandler.cs b/Bottomly/Slack/MessageEventHandlers/GiphyHandler.cs index 7e80e57..db20d87 100644 --- a/Bottomly/Slack/MessageEventHandlers/GiphyHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/GiphyHandler.cs @@ -21,7 +21,13 @@ public class GiphyHandler( protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { - var term = message.Text![CommandTrigger.Length..]; + var term = message.Text![CommandTrigger.TrimEnd().Length..].Trim(); + if (string.IsNullOrEmpty(term)) + { + await SendMessageResponseAsync("Please provide a search term.", message); + return; + } + var result = await command.ExecuteAsync(term); if (result is GiphySuccessResult success) diff --git a/Bottomly/Slack/MessageEventHandlers/ImageSearchHandler.cs b/Bottomly/Slack/MessageEventHandlers/ImageSearchHandler.cs index 81dff67..85070c1 100644 --- a/Bottomly/Slack/MessageEventHandlers/ImageSearchHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/ImageSearchHandler.cs @@ -23,7 +23,13 @@ public class ImageSearchHandler( protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { - var query = message.Text![CommandTrigger.Length..]; + var query = message.Text![CommandTrigger.TrimEnd().Length..].Trim(); + if (string.IsNullOrEmpty(query)) + { + await SendMessageResponseAsync("Please provide a search query.", message); + return; + } + var result = await command.ExecuteAsync(query); if (result is SearchResult success) diff --git a/Bottomly/Slack/MessageEventHandlers/SearchHandler.cs b/Bottomly/Slack/MessageEventHandlers/SearchHandler.cs index d6dbad3..8f2190b 100644 --- a/Bottomly/Slack/MessageEventHandlers/SearchHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/SearchHandler.cs @@ -22,7 +22,13 @@ public class SearchHandler( protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { - var query = message.Text![CommandTrigger.Length..]; + var query = message.Text![CommandTrigger.TrimEnd().Length..].Trim(); + if (string.IsNullOrEmpty(query)) + { + await SendMessageResponseAsync("Please provide a search query.", message); + return; + } + var result = await command.ExecuteAsync(query); var response = result switch diff --git a/Bottomly/Slack/MessageEventHandlers/UrbanHandler.cs b/Bottomly/Slack/MessageEventHandlers/UrbanHandler.cs index 90d4ba8..948d582 100644 --- a/Bottomly/Slack/MessageEventHandlers/UrbanHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/UrbanHandler.cs @@ -20,7 +20,13 @@ public class UrbanHandler( protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { - var term = message.Text![CommandTrigger.Length..]; + var term = message.Text![CommandTrigger.TrimEnd().Length..].Trim(); + if (string.IsNullOrEmpty(term)) + { + await SendMessageResponseAsync("Please provide a search term.", message); + return; + } + var result = await command.ExecuteAsync(term); var response = result switch { diff --git a/Bottomly/Slack/MessageEventHandlers/WikipediaHandler.cs b/Bottomly/Slack/MessageEventHandlers/WikipediaHandler.cs index 7c44c99..6eaac1c 100644 --- a/Bottomly/Slack/MessageEventHandlers/WikipediaHandler.cs +++ b/Bottomly/Slack/MessageEventHandlers/WikipediaHandler.cs @@ -20,7 +20,13 @@ public class WikipediaHandler( protected override async Task InvokeHandlerLogicAsync(MessageEvent message) { - var term = message.Text![CommandTrigger.Length..]; + var term = message.Text![CommandTrigger.TrimEnd().Length..].Trim(); + if (string.IsNullOrEmpty(term)) + { + await SendMessageResponseAsync("Please provide a search term.", message); + return; + } + var result = await command.ExecuteAsync(term); var response = result switch {