public async Task RetrospectiveLobby_ShowsCorrectVoteCount_OnStartingVotes()
        {
            // Given
            int bossId = 0;

            using (IServiceScope scope = this.App.CreateTestServiceScope()) {
                await scope.TestCaseBuilder(this.RetroId).
                WithParticipant("Boss", true, "scrummaster").
                OutputId(id => bossId = id).
                WithParticipant("Josh", false).
                WithRetrospectiveStage(RetrospectiveStage.Writing).
                WithNote(KnownNoteLane.Start, "Josh").
                WithNote(KnownNoteLane.Continue, "Josh").
                WithNote(KnownNoteLane.Continue, "Boss").
                WithNote(KnownNoteLane.Continue, "Boss").
                WithRetrospectiveStage(RetrospectiveStage.Grouping).
                Build();
            }

            await Task.WhenAll(
                Task.Run(() => this.Join(this.Client1, true, "Boss", alreadyJoined: true)),
                Task.Run(() => this.Join(this.Client2, false, "Josh", true))
                );

            this.WaitNavigatedToLobby();

            // When
            this.Client1.VoteCountInput.SendKeys("2");
            this.Client1.TimeInMinutesInput.SendKeys("10");
            this.Client1.WorkflowContinueButton.Click();

            // Then
            this.MultiAssert(client => {
                const int expectedVoteCount = 2 * 3 /* Number of lanes */;
                Assert.That(() => {
                    VoteStatusPanelComponent voteStatusPanel = client.VoteStatus;
                    VoteStatusForParticipant bossVoteStatus  =
                        voteStatusPanel.VoteStatusPerParticipant.First(x => x.ParticipantId == bossId);
                    return(bossVoteStatus.TotalVotes);
                },
                            Has.Count.EqualTo(expectedVoteCount).Retry(),
                            $"Either unable to find vote panel, unable to find vote status for participant #{bossId}, or the vote count is incorrect (not {expectedVoteCount})");
            });
        }
        public async Task RetrospectiveLobby_ShowsUpdatesVotes_OnVoting()
        {
            // Given
            int bossId        = 0;
            int participantId = 0;

            using (IServiceScope scope = this.App.CreateTestServiceScope()) {
                await scope.TestCaseBuilder(this.RetroId).
                WithParticipant("Boss", true, "scrummaster").
                OutputId(id => bossId = id).
                WithParticipant("Josh", false).
                OutputId(id => participantId = id).
                WithRetrospectiveStage(RetrospectiveStage.Writing).
                WithNote(KnownNoteLane.Start, "Josh").
                WithNote(KnownNoteLane.Continue, "Josh").
                WithNote(KnownNoteLane.Continue, "Boss").
                WithNote(KnownNoteLane.Continue, "Boss").
                WithNote(KnownNoteLane.Stop, "Boss").
                WithRetrospectiveStage(RetrospectiveStage.Grouping).
                Build();
            }

            await Task.WhenAll(
                Task.Run(() => this.Join(this.Client1, true, "Boss", alreadyJoined: true)),
                Task.Run(() => this.Join(this.Client2, false, "Josh", true))
                );

            this.WaitNavigatedToLobby();

            // When
            this.Client1.VoteCountInput.SendKeys("2");
            this.Client1.TimeInMinutesInput.SendKeys("10");
            this.Client1.WorkflowContinueButton.Click();

            var allLanes = new[] { KnownNoteLane.Start, KnownNoteLane.Stop, KnownNoteLane.Continue };

            foreach (KnownNoteLane noteLaneId in allLanes)
            {
                NoteLaneComponent noteLane = this.Client2.GetLane(noteLaneId);

                foreach (VoteListComponent voteListComponent in noteLane.VoteLists)
                {
                    for (int cnt = 0; cnt < 2; cnt++)
                    {
                        voteListComponent.ClickVoteButton();
                    }

                    break;
                }
            }

            // Then
            this.MultiAssert(client => {
                const int expectedVoteCount = 2 * 3 /* Number of lanes */;

                void AssertVoteCount(int pid, int count, Func <VoteStatusForParticipant, IEnumerable> voteListSelector)
                {
                    Assert.That(() => {
                        VoteStatusPanelComponent voteStatusPanel = client.VoteStatus;
                        VoteStatusForParticipant bossVoteStatus  =
                            voteStatusPanel.VoteStatusPerParticipant.First(x => x.ParticipantId == pid);
                        return(voteListSelector(bossVoteStatus));
                    },
                                Has.Count.EqualTo(count).Retry(),
                                $"Either unable to find vote panel, unable to find vote status for participant #{pid}, or the vote count is incorrect (not {count})");
                }

                AssertVoteCount(participantId, expectedVoteCount, v => v.CastVotes);
                AssertVoteCount(bossId, expectedVoteCount, v => v.UncastVotes);
                AssertVoteCount(bossId, 0, v => v.CastVotes);
                AssertVoteCount(participantId, 0, v => v.UncastVotes);

                foreach (KnownNoteLane noteLaneId in allLanes)
                {
                    NoteLaneComponent noteLane = client.GetLane(noteLaneId);

                    foreach (VoteListComponent voteListComponent in noteLane.VoteLists)
                    {
                        Assert.That(() => voteListComponent.Votes, Has.Count.EqualTo(2),
                                    "Expected to find 2 votes in each lane");

                        if (client == this.Client2)
                        {
                            Assert.That(() => voteListComponent.IsVoteButtonEnabled, Is.False, "Vote button should be disabled");
                        }
                        else
                        {
                            Assert.That(() => voteListComponent.IsVoteButtonEnabled, Is.True, "Vote button should be enabled");
                        }

                        break;
                    }
                }
            });
        }