public async Task ShoutOut_is_limited_to_mods_and_subs(bool isSub, bool isMod, int numVerified) { // arrange var userToShout = "someusername"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("NonSub") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage($"!so {userToShout}") .WithIsSubscriber(isSub) .WithIsModerator(isMod) .Build(); var request = new ShoutOut(chatMessage); MockApiWrapper.Setup(m => m.DoesUserExist(It.IsAny <string>())).ReturnsAsync(true); MockCollection.Setup(m => m.ExistsAsync(userToShout, null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(m => m.GetAsync(userToShout, null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Exactly(numVerified)); }
public async Task ShoutOut_will_use_custom_message_if_there_is_one() { // arrange var userProfile = new TwitcherProfile { ShoutMessage = "hey hey look at me" + Guid.NewGuid() }; var userName = "******"; var expectedShoutMessage = userProfile.ShoutMessage + $" https://twitch.tv/{userName}"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userName}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userName)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeGetResult(userProfile)); var shout = new ShoutOut(chatMessage); // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedShoutMessage, false), Times.Once); }
public async Task Gets_content_and_says_it_to_chat_room() { // arrange var channel = "somechannel" + Guid.NewGuid(); var commandName = "!somemessage"; var expectedContent = "blah blah blah whatever " + Guid.NewGuid(); var content = new ValidStaticCommands { Commands = new List <StaticCommandInfo> { new StaticCommandInfo { Command = commandName, Content = expectedContent } } }; MockCollection.Setup(x => x.GetAsync("staticContentCommands", null)) .ReturnsAsync(new FakeGetResult(content)); var request = new StaticMessage(commandName, channel); // act await _handler.Handle(request, CancellationToken.None); // assert // _twitchClient.SendMessage(request.Channel, command.Content); MockTwitchClient.Verify(x => x.SendMessage(channel, expectedContent, false), Times.Once); }
public async Task Show_current_project_url() { // arrange var expectedUrl = "http://example.org/foo/bar"; var expectedMessage = $"Current Project is: " + expectedUrl; var projectInfo = new CurrentProjectInfo { Url = new Uri(expectedUrl) }; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatterusername") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!currentproject") .WithChannel("doesntmatterchannel") .Build(); var request = new SayCurrentProject(chatMessage); MockCollection.Setup(x => x.GetAsync("currentProject", null)) .ReturnsAsync(new FakeGetResult(projectInfo)); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }
public async Task ShoutOut_will_shout_the_given_username() { // arrange var userName = "******"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userName}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userName)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); var shout = new ShoutOut(chatMessage); var expectedMessage = $"Hey everyone, check out @{userName}'s Twitch stream at https://twitch.tv/{userName}"; // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }
public async Task ShoutOut_WILL_shout_if_the_given_username_is_a_real_twitch_user() { // arrange var userLookup = "doesntmattereither"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userLookup}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userLookup)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userLookup.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userLookup.ToLower(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); var shout = new ShoutOut(chatMessage); // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Once); }
public async Task Valid_url_must_be_passed_in(string message) { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(MockTwitchOptions.Object.Value.Username) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(message) .Build(); var request = new SetCurrentProject(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), "Sorry, I couldn't understand that URL!", false), Times.Once); }
public async Task ShoutOut_will_do_nothing_if_no_name_is_given() { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage("!so") .Build(); var request = new ShoutOut(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Never); }
public async Task Help_will_provide_details_on_specific_commands(string messageText, string startsWith) { // arrange var expectedChannel = "whateverchannel"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithChannel(expectedChannel) .WithMessage(messageText) .Build(); var request = new Help(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(expectedChannel, It.Is <string>(s => s.StartsWith(startsWith)), false), Times.Once); }
public async Task Help_with_invalid_arguments_will_just_say_generic_help() { // arrange var expectedChannel = "whateverchannel"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithChannel(expectedChannel) .WithMessage("!help somethingThatIsntACommand") .Build(); var request = new Help(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(expectedChannel, It.Is <string>(s => s.StartsWith("Try these commands:")), false), Times.Once); }
public async Task Says_okay_if_able_to_store() { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(MockTwitchOptions.Object.Value.Username) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!setcurrentproject http://validurl.com") .Build(); var request = new SetCurrentProject(chatMessage); MockCollection.Setup(x => x.UpsertAsync(It.IsAny <string>(), It.IsAny <CurrentProjectInfo>(), null)) .ReturnsAsync(new FakeMutationResult()); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), "Okay, got it!", false), Times.Once); }
public async Task Says_an_error_message_if_unable_to_store() { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(MockTwitchOptions.Object.Value.Username) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!setcurrentproject http://validurl.com") .Build(); var request = new SetCurrentProject(chatMessage); MockCollection.Setup(x => x.UpsertAsync(It.IsAny <string>(), It.IsAny <CurrentProjectInfo>(), null)) .Throws <Exception>(); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), "I was unable to store that, sorry!", false), Times.Once); }
public async Task If_user_isnt_specified_with_command_say_error_message(string messageWithNoUser) { // arrange var expectedMessage = $"You must specify a user to trout."; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesn't matter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(messageWithNoUser) .Build(); var troutRequest = new Trout(chatMessage); // act await _handler.Handle(troutRequest, CancellationToken.None); // assert MockTwitchClient.Verify(m => m.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }
public async Task ShoutOut_will_not_shout_if_the_given_username_isnt_a_real_twitch_user() { // arrange var userLookup = "doesntmattereither"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userLookup}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userLookup)).ReturnsAsync(false); var shout = new ShoutOut(chatMessage); // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Never); }
public async Task Only_the_bot_user_itself_can_set_the_current_project() { // arrange var notTheBotUser = MockTwitchOptions.Object.Value.Username + Guid.NewGuid(); var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(notTheBotUser) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("doesntmatter") .Build(); var request = new SetCurrentProject(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert - twitch client never used, bucket never used MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <bool>()), Times.Never); MockCollection.Verify(x => x.UpsertAsync(It.IsAny <string>(), It.IsAny <CurrentProjectInfo>(), null), Times.Never); }
public async Task If_user_exists_then_perform_trout_action_with_target_username(string userThatDoesExist) { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesn't matter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage($"!trout {userThatDoesExist}") .Build(); MockApiWrapper.Setup(m => m.DoesUserExist(It.IsAny <string>())) .ReturnsAsync(true); var troutRequest = new Trout(chatMessage); // act await _handler.Handle(troutRequest, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), $"/me slaps @{userThatDoesExist.Replace("@","")} around a bit with a large trout.", It.IsAny <bool>()) , Times.Once); }
public async Task If_no_current_project_set_show_default_message() { // arrange var expectedDefaultMessage = "I haven't set any current project yet, sorry!"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatterusername") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!currentproject") .WithChannel("doesntmatterchannel") .Build(); var request = new SayCurrentProject(chatMessage); MockCollection.Setup(m => m.GetAsync("currentProject", null)) .Throws <Exception>(); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedDefaultMessage, false), Times.Once); }
public async Task If_user_doesnt_exist_trouting_say_error_message(string userThatDoesntExist) { // arrange var expectedMessage = $"User {userThatDoesntExist.Replace("@", "")} doesn't exist."; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesn't matter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage($"!trout {userThatDoesntExist}") .Build(); MockApiWrapper.Setup(m => m.DoesUserExist(userThatDoesntExist)) .ReturnsAsync(false); var troutRequest = new Trout(chatMessage); // act await _handler.Handle(troutRequest, CancellationToken.None); // assert MockTwitchClient.Verify(m => m.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }