public async Task Screenshot_Voting() { this.EnsureRetrospectiveInStage(RetrospectiveStage.Grouping); // Given this.Client1.WorkflowContinueButton.Click(); // When using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.RetroId). HasExistingParticipant("Aaron"). HasExistingParticipant("Ashley"). HasExistingParticipant("Hong"). HasExistingParticipant("Josh"). HasExistingParticipant("Patrick"). HasExistingParticipant("Roger"). HasExistingParticipant("Sarah"). WithVoteOnNoteGroup("Josh", this._startAutomationGroupId). WithVoteOnNoteGroup("Josh", this._startAutomationGroupId). WithVoteOnNoteGroup("Josh", this._startAutomationGroupId). WithVoteOnNote("Patrick", this._startNoteDefinitionOfDoneId). WithVoteOnNote("Roger", this._startNoteDefinitionOfDoneId). WithVoteOnNote("Ashley", this._startNoteDefinitionOfDoneId). WithVoteOnNote("Aaron", this._startClientRetroPresenceNoteId). WithVoteOnNoteGroup("Aaron", this._stopBacklogUnstableNoteGroupId). WithVoteOnNoteGroup("Roger", this._stopBacklogUnstableNoteGroupId). WithVoteOnNoteGroup("Hong", this._stopBacklogUnstableNoteGroupId). WithVoteOnNoteGroup("Roger", this._stopBacklogUnstableNoteGroupId). WithVoteOnNoteGroup("Hong", this._stopSprintScopeIncreasedGroupId). WithVoteOnNoteGroup("Sarah", this._stopSprintScopeIncreasedGroupId). WithVoteOnNoteGroup("Patrick", this._stopSprintScopeIncreasedGroupId). WithVoteOnNoteGroup("Sarah", this._stopKickOffLongGroupId). WithVoteOnNoteGroup("Roger", this._stopKickOffLongGroupId). WithVoteOnNoteGroup("Hong", this._continueDailiesNoteGroupId). WithVoteOnNoteGroup("Hong", this._continueDailiesNoteGroupId). WithVoteOnNoteGroup("Sarah", this._continueDailiesNoteGroupId). WithVoteOnNoteGroup("Sarah", this._continueDailiesNoteGroupId). WithVoteOnNote("Roger", this._continueFrameworkNoteId). WithVoteOnNote("Roger", this._continueFrameworkNoteId). WithVoteOnNote("Patrick", this._continueFrameworkNoteId). WithVoteOnNote("Aaron", this._continueFrameworkNoteId). WithVoteOnNote("Roger", this._continueDailyBuildNoteId). WithVoteOnNote("Hong", this._continueDailyBuildNoteId). WithVoteOnNote("Sarah", this._continueDailyBuildNoteId). Build(); } // Then Thread.Sleep(500); CreateDocScreenshot(this.Client1.WebDriver, "voting"); }
public async Task RetrospectiveLobby_GroupingStage_CanAddNoteGroup() { // Given using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.RetroId). WithParticipant("Boss", true, "scrummaster"). WithParticipant("Josh", false). WithParticipant("Foo", false). WithParticipant("Bar", false). WithParticipant("Baz", false). WithRetrospectiveStage(RetrospectiveStage.Writing). WithNote(KnownNoteLane.Start, "Josh"). WithNote(KnownNoteLane.Continue, "Boss"). WithNote(KnownNoteLane.Continue, "Bar"). WithNote(KnownNoteLane.Continue, "Baz"). WithNote(KnownNoteLane.Stop, "Foo"). WithNote(KnownNoteLane.Start, "Foo"). WithNote(KnownNoteLane.Start, "Boss"). WithRetrospectiveStage(RetrospectiveStage.Grouping). WithNoteGroup("Boss", KnownNoteLane.Start, "Some name"). 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 NoteLaneComponent noteLane = this.Client1.GetLane(KnownNoteLane.Continue); noteLane.AddNoteGroupButton.Click(); // Then this.MultiAssert(client => { Assert.That(() => client.GetLane(KnownNoteLane.Continue).NoteGroupElements, Has.Count.EqualTo(1).Retry()); Assert.That(() => client.GetLane(KnownNoteLane.Start).NoteGroupElements, Has.Count.EqualTo(1).Retry()); Assert.That(() => client.GetLane(KnownNoteLane.Stop).NoteGroupElements, Has.Count.EqualTo(0).Retry()); }); // When int lastAddedNoteGroupId = this.App.GetLastAddedId <NoteGroup>(); NoteGroupComponent note = noteLane.NoteGroups.First(x => x.Id == lastAddedNoteGroupId); string noteText = "title of new notegroup"; note.Input.SendKeys(noteText); this.Client1.Unfocus(); // Unfocus to propagate change // Then Assert.That(() => this.Client2.GetLane(KnownNoteLane.Continue).NoteGroups.First(x => x.Id == lastAddedNoteGroupId).Title.Text, Has.Length.EqualTo(noteText.Length).And.EqualTo(noteText).Retry(), "Client 1 does not have the the title text from client 2"); }
public async Task Screenshot_Finished() { // Play some rounds using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.SessionId). HasExistingParticipant("Roger"). HasExistingParticipant("Hong"). HasExistingParticipant("Aaron"). HasExistingParticipant("Josh"). HasExistingParticipant("Patrick"). HasExistingParticipant("Sarah"). NewRound("9346: As a user I want to change my password"). PlayCard("Roger", "5"). PlayCard("Hong", "3"). PlayCard("Aaron", "3"). PlayCard("Josh", "2"). PlayCard("Patrick", "8"). PlayCard("Sarah", "☕"). CloseEstimationPhase(). NewRound("9347: As a user I want to use two-factor authentication"). PlayCard("Roger", "8"). PlayCard("Hong", "8"). PlayCard("Aaron", "13"). PlayCard("Josh", "13"). PlayCard("Patrick", "?"). PlayCard("Sarah", "20"). CloseEstimationPhase(). NewRound("9348: As a user I want to change my e-mail address"). PlayCard("Roger", "3"). PlayCard("Hong", "2"). PlayCard("Aaron", "2"). PlayCard("Josh", "5"). PlayCard("Patrick", "2"). PlayCard("Sarah", "5"). CloseEstimationPhase(). NewRound("9347: As a user I want to reset my recovery code"). PlayCard("Roger", "8"). PlayCard("Hong", "8"). PlayCard("Aaron", "20"). PlayCard("Josh", "5"). PlayCard("Patrick", "5"). PlayCard("Sarah", "8"). CloseEstimationPhase(). Build(); } // When this.Client1.InvokeEndWorkflow(); this.EnsureSessionInStage(SessionStage.Finished); // Then CreateDocScreenshot(this.Client1.WebDriver, "finished"); }
public async Task Screenshot_Grouping() { this.EnsureRetrospectiveInStage(RetrospectiveStage.Discuss); // Given this.Client1.InvokeContinueWorkflow(); // When using (IServiceScope scope = this.App.CreateTestServiceScope()) { void AddNotesToGroup(TestCaseBuilder builder, int groupId, IEnumerable <int> noteIds) { foreach (int noteId in noteIds) { builder.AddNoteToNoteGroup("Roger", noteId, groupId); } } await scope.TestCaseBuilder(this.RetroId). HasExistingParticipant("Roger"). WithNoteGroup("Roger", KnownNoteLane.Start, "Automated tests"). OutputId(id => this._startAutomationGroupId = id). WithNoteGroup("Roger", KnownNoteLane.Stop, "Kick-off long"). OutputId(id => this._stopKickOffLongGroupId = id). WithNoteGroup("Roger", KnownNoteLane.Stop, "Sprint scope increased"). OutputId(id => this._stopSprintScopeIncreasedGroupId = id). WithNoteGroup("Roger", KnownNoteLane.Stop, "Backlog unstable"). OutputId(id => this._stopBacklogUnstableNoteGroupId = id). WithNoteGroup("Roger", KnownNoteLane.Continue, "Daily standups"). OutputId(id => this._continueDailiesNoteGroupId = id). Callback(builder => { AddNotesToGroup(builder, this._startAutomationGroupId, this._startAutomationGroupNoteIds); AddNotesToGroup(builder, this._stopBacklogUnstableNoteGroupId, this._stopBacklogUnstableNoteIds); AddNotesToGroup(builder, this._stopSprintScopeIncreasedGroupId, this._stopSprintScopeIncreasedNoteIds); AddNotesToGroup(builder, this._stopKickOffLongGroupId, this._stopKickOffLongNoteIds); AddNotesToGroup(builder, this._continueDailiesNoteGroupId, this._continueDailiesNoteIds); }). Build(); } // Then this.Client1.TimeInMinutesInput.SendKeys("\b4"); this.Client1.VoteCountInput.SendKeys("'\b3"); CreateDocScreenshot(this.Client1.WebDriver, "grouping"); }
public async Task RetrospectiveLobby_WritingStage_CanDeleteNote_Shortcut() { // Given int noteId = 0; using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.RetroId). WithParticipant("Boss", true, "scrummaster"). WithParticipant("Josh", false). WithRetrospectiveStage(RetrospectiveStage.Writing). WithNote(KnownNoteLane.Start, "Josh"). WithNote(KnownNoteLane.Continue, "Josh"). WithNote(KnownNoteLane.Continue, "Boss"). OutputId(id => noteId = id). WithNote(KnownNoteLane.Continue, "Boss"). 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(); this.MultiAssert(client => { Assert.That(() => client.GetLane(KnownNoteLane.Continue).NoteElements, Has.Count.EqualTo(3).Retry()); Assert.That(() => client.GetLane(KnownNoteLane.Start).NoteElements, Has.Count.EqualTo(1).Retry()); Assert.That(() => client.GetLane(KnownNoteLane.Stop).NoteElements, Has.Count.EqualTo(0).Retry()); }); // When NoteLaneComponent noteLane = this.Client1.GetLane(KnownNoteLane.Continue); NoteComponent note = noteLane.Notes.First(x => x.Id == noteId); new Actions(this.Client1.WebDriver) .KeyDown(note.Input, Keys.Control) .SendKeys(Keys.Delete) .KeyUp(Keys.Control) .Perform(); // Then this.MultiAssert(client => { NoteLaneComponent clientNoteLane = client.GetLane(KnownNoteLane.Continue); Assert.That(() => clientNoteLane.NoteElements, Has.Count.EqualTo(2).Retry()); Assert.That(() => clientNoteLane.Notes.Select(x => x.Id).ToArray(), Does.Not.Contain(noteId).Retry()); }); }
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 Screenshot_Estimation() { this.EnsureSessionInStage(SessionStage.Estimation); // When using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.SessionId). HasExistingParticipant("Roger"). HasExistingParticipant("Hong"). WithParticipant("Aaron", false). WithParticipant("Ashley", false). WithParticipant("Josh", false). WithParticipant("Patrick", false). WithParticipant("Sarah", false). PlayCard("Aaron", "3"). PlayCard("Josh", "2"). PlayCard("Patrick", "8"). PlayCard("Sarah", "☕"). Build(); } void PlayCard(PokerSessionLobby client, string symbolText) { CardComponent card = client.CardChooser.Cards.FirstOrDefault(x => x.SymbolText == symbolText); if (card == null) { Assert.Fail($"Unable to find card with symbol '{symbolText}'"); } card.Click(); } PlayCard(this.Client1, "?"); PlayCard(this.Client2, "5"); CreateDocScreenshot(this.Client2.WebDriver, "estimation"); // Then this.Client1.InvokeContinueWorkflow(); }
public async Task Screenshot_Writing() { this.EnsureRetrospectiveInStage(RetrospectiveStage.NotStarted); // Given using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.SetRetrospective(this.RetroId, r => r.HashedPassphrase = null); } this.Join(this.Client1, true, "Roger", colorName: "Driver", submitCallback: () => CreateDocScreenshot(this.Client1.WebDriver, "join-retro")); this.Join(this.Client2, false, "Hong", colorName: "green"); this.WaitNavigatedToLobby(); this.Client1.TimeInMinutesInput.Clear(); this.Client1.TimeInMinutesInput.SendKeys("5"); this.Client1.TimeInMinutesInput.SendKeys(Keys.Tab); Thread.Sleep(10000); this.Client1.InvokeContinueWorkflow(); // When TestContext.WriteLine("Attempting to find Note Lane button after state transition"); Thread.Sleep(10000); this.Client2.WebDriver.Retry(_ => this.Client2.GetLane(KnownNoteLane.Continue).AddNoteButton.Displayed); var writtenNoteIds = new HashSet <int>(); void WriteNote(RetrospectiveLobby client, KnownNoteLane laneId, string text) { NoteLaneComponent lane = client.GetLane(laneId); lane.AddNoteButton.Click(); NoteComponent addedNote = client.WebDriver.Retry(_ => { NoteComponent firstNote = lane.Notes.FirstOrDefault(); if (firstNote?.Input != null && writtenNoteIds.Add(firstNote.Id)) { return(firstNote); } return(null); }); addedNote.Input.SendKeys(text); } WriteNote(this.Client2, KnownNoteLane.Continue, "Using this framework, it works very productive"); using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.RetroId). HasExistingParticipant("Roger"). HasExistingParticipant("Hong"). WithParticipant("Aaron", false). WithParticipant("Ashley", false). WithParticipant("Josh", false). WithParticipant("Patrick", false). WithParticipant("Sarah", false). WithNote(KnownNoteLane.Continue, "Sarah", text: "Framework with good productivity"). OutputId(id => this._continueFrameworkNoteId = id). WithNote(KnownNoteLane.Continue, "Josh", text: "Daily standup"). OutputId(id => this._continueDailiesNoteIds.Add(id)). WithNote(KnownNoteLane.Continue, "Patrick", text: "Daily standups"). OutputId(id => this._continueDailiesNoteIds.Add(id)). WithNote(KnownNoteLane.Continue, "Ashley", text: "Dailies"). OutputId(id => this._continueDailiesNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Patrick", text: "Changing the backlog in the sprint"). OutputId(id => this._stopBacklogUnstableNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Aaron", text: "Backlog story changes in sprint"). OutputId(id => this._stopBacklogUnstableNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Ashley", text: "Story backlog changes while sprint in progress"). OutputId(id => this._stopBacklogUnstableNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Ashley", text: "Adding more stories while sprint is in progress"). OutputId(id => this._stopSprintScopeIncreasedNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Josh", text: "Stop adding stories when sprint is underway"). OutputId(id => this._stopSprintScopeIncreasedNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Josh", text: "Long kick-off, distractions in sprint"). OutputId(id => this._stopKickOffLongNoteIds.Add(id)). WithNote(KnownNoteLane.Stop, "Sarah", text: "Kick-off was very long"). OutputId(id => this._stopKickOffLongNoteIds.Add(id)). WithNote(KnownNoteLane.Start, "Josh", text: "Start writing automated tests"). OutputId(id => this._startAutomationGroupNoteIds.Add(id)). WithNote(KnownNoteLane.Start, "Patrick", text: "Use a proper definition of done"). OutputId(id => this._startNoteDefinitionOfDoneId = id). WithNote(KnownNoteLane.Start, "Sarah", text: "Daily build should include basic tests"). OutputId(id => this._startAutomationGroupNoteIds.Add(id)). Build(); } WriteNote(this.Client1, KnownNoteLane.Start, "Daily builds should include automated smoke tests"); this.AddLatestNoteIdToCollection(this._startAutomationGroupNoteIds); WriteNote(this.Client1, KnownNoteLane.Start, "Client should be present in retrospective"); this._startClientRetroPresenceNoteId = this.GetLatestNoteId(); WriteNote(this.Client2, KnownNoteLane.Continue, "Regular publish to acceptance environment"); this._continueDailyBuildNoteId = this.GetLatestNoteId(); CreateDocScreenshot(this.Client2.WebDriver, "writing"); // Then this.Client1.InvokeContinueWorkflow(); }
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; } } }); }
public async Task RetrospectiveLobby_GroupingStage_CanMoveNote() { // Given int note1Id = 0, note2Id = 0, noteGroupId = 0, bossId = 0; using (IServiceScope scope = this.App.CreateTestServiceScope()) { await scope.TestCaseBuilder(this.RetroId). WithParticipant("Boss", true, "scrummaster"). OutputId(id => bossId = id). WithParticipant("Josh", false). WithParticipant("Foo", false). WithParticipant("Bar", false). WithParticipant("Baz", false). WithRetrospectiveStage(RetrospectiveStage.Writing). WithNote(KnownNoteLane.Start, "Josh"). OutputId(id => note1Id = id). WithNote(KnownNoteLane.Continue, "Boss"). WithNote(KnownNoteLane.Continue, "Bar"). WithNote(KnownNoteLane.Continue, "Baz"). WithNote(KnownNoteLane.Stop, "Foo"). WithNote(KnownNoteLane.Start, "Foo"). OutputId(id => note2Id = id). WithNote(KnownNoteLane.Start, "Boss"). WithRetrospectiveStage(RetrospectiveStage.Grouping). WithNoteGroup("Boss", KnownNoteLane.Continue, "Cont name"). WithNoteGroup("Boss", KnownNoteLane.Start, "Some name"). OutputId(id => noteGroupId = id). 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 /*{ * NoteLaneComponent noteLane = this.Client1.GetLane(KnownNoteLane.Start); * NoteComponent note1 = noteLane.Notes.First(x => x.Id == note1Id); * NoteComponent note2 = noteLane.Notes.First(x => x.Id == note2Id); * NoteGroupComponent noteGroup = noteLane.NoteGroups.First(x => x.Id == noteGroupId); * * this.Client1.WebDriver.ExecuteDragAndDrop(note1.WebElement, noteGroup.WebElement); * this.Client1.WebDriver.ExecuteDragAndDrop(note2.WebElement, noteGroup.WebElement); * }*/// Disable while: https://bugs.chromium.org/p/chromedriver/issues/detail?id=2695 using (IServiceScope scope = this.App.CreateTestServiceScope()) { scope.SetAuthenticationInfo(new CurrentParticipantModel(bossId, "Boss", true)); await scope.Send(new MoveNoteCommand(note1Id, noteGroupId)); await scope.Send(new MoveNoteCommand(note2Id, noteGroupId)); } // Then this.MultiAssert(client => { NoteLaneComponent noteLane = client.GetLane(KnownNoteLane.Start); NoteGroupComponent noteGroup = noteLane.NoteGroups.First(x => x.Id == noteGroupId); Assert.That(() => noteGroup.Notes.Select(x => x.Id).ToArray(), Contains.Item(note1Id).And.Contain(note2Id).Retry()); }); }