public async Task DeleteNoteGroupCommandHandler_InvalidId_SilentlyContinueNoBroadcast()
        {
            // Given
            var mediator = Substitute.For <IMediator>();
            var handler  = new DeleteNoteGroupCommandHandler(
                this.Context,
                Substitute.For <ISecurityValidator>(),
                Substitute.For <IMediator>()
                );

            var retro = new Retrospective {
                CurrentStage = RetrospectiveStage.Grouping,
                FacilitatorHashedPassphrase = "whatever",
                Title             = TestContext.CurrentContext.Test.FullName,
                CreationTimestamp = DateTimeOffset.Now,
                Participants      = { new Participant {
                                          Name = "John"
                                      } },
                NoteGroup = { new NoteGroup {
                                  Lane = this.Context.NoteLanes.Find(KnownNoteLane.Continue), Title = "???"
                              } }
            };
            string retroId = retro.UrlId.StringId;

            this.Context.Retrospectives.Add(retro);
            await this.Context.SaveChangesAsync();

            var command = new DeleteNoteGroupCommand(retroId, -1);

            // When
            await handler.Handle(command, CancellationToken.None);

            // Then
            Assert.That(mediator.ReceivedCalls(), Is.Empty);
        }
        public async Task DeleteNoteGroupCommandHandler_ValidCommand_CreatesValidObjectAndBroadcast()
        {
            // Given
            var securityValidator = Substitute.For <ISecurityValidator>();
            var mediatorMock      = Substitute.For <IMediator>();
            var handler           = new DeleteNoteGroupCommandHandler(
                this.Context,
                securityValidator,
                mediatorMock
                );


            var retro = new Retrospective {
                CurrentStage = RetrospectiveStage.Writing,
                FacilitatorHashedPassphrase = "whatever",
                Title             = TestContext.CurrentContext.Test.FullName,
                CreationTimestamp = DateTimeOffset.Now,
                Participants      = { new Participant {
                                          Name = "John"
                                      } },
                NoteGroup = { new NoteGroup {
                                  Lane = this.Context.NoteLanes.Find(KnownNoteLane.Continue), Title = "???"
                              } }
            };
            string retroId = retro.UrlId.StringId;

            this.Context.Retrospectives.Add(retro);
            await this.Context.SaveChangesAsync();

            NoteGroup noteGroup = retro.NoteGroup.First();

            var command = new DeleteNoteGroupCommand(retroId, noteGroup.Id);

            // When
            Assume.That(this.Context.NoteGroups.Select(x => x.Id), Does.Contain(noteGroup.Id));
            await handler.Handle(command, CancellationToken.None);

            // Then
            await securityValidator.Received().EnsureOperation(Arg.Is <Retrospective>(r => r.Id == retro.Id), SecurityOperation.AddOrUpdate, Arg.Is <NoteGroup>(g => g.Id == noteGroup.Id));

            var broadcastedDelete = mediatorMock.ReceivedCalls().FirstOrDefault()?.GetArguments()[0] as NoteLaneUpdatedNotification;

            if (broadcastedDelete == null)
            {
                Assert.Fail("No broadcast has gone out");
            }

            Assert.That(broadcastedDelete.LaneId, Is.EqualTo((int)KnownNoteLane.Continue));
            Assert.That(broadcastedDelete.RetroId, Is.EqualTo(command.RetroId));
            Assert.That(broadcastedDelete.GroupId, Is.EqualTo(noteGroup.Id));

            Assert.That(this.Context.NoteGroups.Select(x => x.Id), Does.Not.Contains(noteGroup.Id));
        }
        public async Task DeleteNoteGroupCommandHandler_InvalidRetroId_SilentlyContinueNoBroadcast()
        {
            // Given
            var mediator = Substitute.For <IMediator>();
            var handler  = new DeleteNoteGroupCommandHandler(
                this.Context,
                Substitute.For <ISecurityValidator>(),
                mediator
                );
            var command = new DeleteNoteGroupCommand("not found", (int)KnownNoteLane.Start);

            // When
            await handler.Handle(command, CancellationToken.None);

            // Then
            Assert.That(mediator.ReceivedCalls(), Is.Empty);
        }