feat: add multi-option reschedule voting
This commit is contained in:
+36
-18
@@ -5,32 +5,50 @@ namespace GmRelay.Bot.Tests.Features.Sessions.RescheduleSession;
|
||||
public sealed class RescheduleVoteRulesTests
|
||||
{
|
||||
[Fact]
|
||||
public void Evaluate_ShouldReject_WhenParticipantVotesNo()
|
||||
public void SelectWinner_ShouldApproveSingleTopOption()
|
||||
{
|
||||
var decision = RescheduleVoteRules.Evaluate("no", totalParticipants: 4, approvedParticipants: 3);
|
||||
var winningOptionId = Guid.NewGuid();
|
||||
var otherOptionId = Guid.NewGuid();
|
||||
|
||||
Assert.Equal(RescheduleVoteOutcome.Rejected, decision.Outcome);
|
||||
Assert.False(decision.ShouldRescheduleSession);
|
||||
Assert.Equal("Вы проголосовали против переноса.", decision.CallbackText);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Evaluate_ShouldApprove_WhenEveryoneVotedYes()
|
||||
{
|
||||
var decision = RescheduleVoteRules.Evaluate("yes", totalParticipants: 3, approvedParticipants: 3);
|
||||
var decision = RescheduleVoteRules.SelectWinner(
|
||||
[
|
||||
new RescheduleOptionVoteCount(winningOptionId, 3),
|
||||
new RescheduleOptionVoteCount(otherOptionId, 1)
|
||||
]);
|
||||
|
||||
Assert.Equal(RescheduleVoteOutcome.Approved, decision.Outcome);
|
||||
Assert.True(decision.ShouldRescheduleSession);
|
||||
Assert.True(decision.ShouldResetParticipantRsvps);
|
||||
Assert.Equal(winningOptionId, decision.SelectedOptionId);
|
||||
Assert.Equal("Победил вариант с большинством голосов.", decision.Reason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Evaluate_ShouldStayPending_WhileVotesOutstanding()
|
||||
public void SelectWinner_ShouldRejectTie()
|
||||
{
|
||||
var decision = RescheduleVoteRules.Evaluate("yes", totalParticipants: 5, approvedParticipants: 2);
|
||||
var firstOptionId = Guid.NewGuid();
|
||||
var secondOptionId = Guid.NewGuid();
|
||||
|
||||
Assert.Equal(RescheduleVoteOutcome.Pending, decision.Outcome);
|
||||
Assert.False(decision.ShouldRescheduleSession);
|
||||
Assert.False(decision.ShouldResetParticipantRsvps);
|
||||
var decision = RescheduleVoteRules.SelectWinner(
|
||||
[
|
||||
new RescheduleOptionVoteCount(firstOptionId, 2),
|
||||
new RescheduleOptionVoteCount(secondOptionId, 2)
|
||||
]);
|
||||
|
||||
Assert.Equal(RescheduleVoteOutcome.Rejected, decision.Outcome);
|
||||
Assert.Null(decision.SelectedOptionId);
|
||||
Assert.Equal("Голоса разделились поровну, перенос не применяется.", decision.Reason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SelectWinner_ShouldRejectWhenNobodyVoted()
|
||||
{
|
||||
var decision = RescheduleVoteRules.SelectWinner(
|
||||
[
|
||||
new RescheduleOptionVoteCount(Guid.NewGuid(), 0),
|
||||
new RescheduleOptionVoteCount(Guid.NewGuid(), 0)
|
||||
]);
|
||||
|
||||
Assert.Equal(RescheduleVoteOutcome.Rejected, decision.Outcome);
|
||||
Assert.Null(decision.SelectedOptionId);
|
||||
Assert.Equal("Никто не проголосовал до дедлайна, перенос не применяется.", decision.Reason);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user