/// <summary> /// Add a vote. /// </summary> private async Task <BotResponseCode> AddVote(UpdateDto updateDto, Vote vote) { var responseCode = BotResponseCode.AddVoteHandled; // Save the vote in storage. await _voteRepository.Upsert(vote); var votes = await _voteRepository.GetVotes(updateDto.Track.PlaylistId, updateDto.Track.Id); string newText = null; InlineKeyboardMarkup keyboard = null; if (vote.Type == VoteType.Downvote) { var downVotes = votes.Where(x => x.Type == VoteType.Downvote).ToList(); // If there are enough downvotes, remove the track. if (downVotes.Count >= RemoveTrackOnDownvoteCount) { responseCode = await _removeTrackService.TryRemoveTrackFromPlaylist(updateDto); newText = $"This track has been removed from the playlist because of {RemoveTrackOnDownvoteCount} downvotes."; // Add only the See Votes button, so users can see who downvoted. keyboard = _keyboardService.CreateSeeVotesKeyboard(updateDto.Track); } } if (string.IsNullOrEmpty(newText)) { newText = UseNegativeOperator(vote) // Increment or decrement the vote in the original message. ? _voteTextHelper.DecrementVote(updateDto.ParsedTextMessageWithLinks, vote.Type) : _voteTextHelper.IncrementVote(updateDto.ParsedTextMessageWithLinks, vote.Type); // If there are votes, add the See Votes button to the keyboard. keyboard = _keyboardService.AddOrRemoveSeeVotesButton(updateDto.ParsedInlineKeyboard, updateDto.Track, votes.Any()); } await EditOriginalMessage(updateDto, newText, keyboard); // Let telegram know the callback query has been handled. await AnswerCallback(updateDto, $"Added {vote.Type}"); return(responseCode); }
public async Task Run_VoteCallbackTwice_AddVoteHandledReturned_RemoveVoteHandledReturned(VoteType voteType) { // Arrange. await TruncateTables(); await InsertTrack(); await InsertPlaylist(); await InsertChat(); var trackUrl = GetLinkToTrack(); // Send the two messages that go before an vote callback: one with a trackUrl and a reply from the bot with a vote button. var trackMessageId = await SendMessage(trackUrl); var botReplyMessageText = "Track added to the playlist!"; var botReplyMessageId = await SendMessage(botReplyMessageText, replyToMessageId : trackMessageId); // Send two callback updates, first to test to add a vote... using (var stream = new MemoryStream()) { var httpRequest = await CreateVoteCallbackQueryRequest(stream, voteType, botReplyMessageId, botReplyMessageText, trackUrl); // Act. var voteResult = await _sut.Run(httpRequest); // Assert. AssertHelper.Equal(BotResponseCode.AddVoteHandled, voteResult); var expectedVote = new Vote { PlaylistId = _testOptions.TestPlaylistId, UserId = _testOptions.TestUserId, TrackId = _testOptions.TestTrackId, Type = voteType }; var vote = await GetVote(expectedVote); Assert.NotNull(vote); var user = await GetUser(); Assert.NotNull(user); var chatMember = await GetChatMember(); Assert.NotNull(chatMember); } // ...and then test to remove a vote. using (var stream = new MemoryStream()) { // Arrange. botReplyMessageText = voteType.HasAttribute <VoteType, VoteAttributes.UseNegativeOperatorAttribute>() ? _voteTextHelper.DecrementVote(botReplyMessageText, voteType) : _voteTextHelper.IncrementVote(botReplyMessageText, voteType); var httpRequest = await CreateVoteCallbackQueryRequest(stream, voteType, botReplyMessageId, botReplyMessageText, trackUrl); // Act. var voteResult = await _sut.Run(httpRequest); // Assert. AssertHelper.Equal(BotResponseCode.RemoveVoteHandled, voteResult); var expectedVote = new Vote { PlaylistId = _testOptions.TestPlaylistId, UserId = _testOptions.TestUserId, TrackId = _testOptions.TestTrackId, Type = voteType }; var vote = await GetVote(expectedVote); Assert.Null(vote); } }