public async Task HandleAsync_ProcessesNotificationsWithPipeline()
        {
            var notificationsToRelease = new MultiValueDictionary <NotificationBuffer, BufferedNotification>();

            NotificationBuffer buffer1 = new NotificationBuffer(Guid.NewGuid(), bufferGovernor1.Id,
                                                                notificationPipeline1.Id);

            inMemoryCrudRepository.Attach(buffer1);
            BufferedNotification notification1 = new BufferedNotification(Guid.NewGuid(), "Notification1", "{}",
                                                                          buffer1, DateTime.Today);

            notificationsToRelease.Add(buffer1, notification1);
            inMemoryCrudRepository.Attach(notification1);
            BufferedNotification notification2 = new BufferedNotification(Guid.NewGuid(), "Notification2", "{}",
                                                                          buffer1, DateTime.Today);

            notificationsToRelease.Add(buffer1, notification2);
            inMemoryCrudRepository.Attach(notification2);

            NotificationBuffer buffer2 = new NotificationBuffer(Guid.NewGuid(), bufferGovernor1.Id,
                                                                notificationPipeline2.Id);

            inMemoryCrudRepository.Attach(buffer2);
            BufferedNotification notification3 = new BufferedNotification(Guid.NewGuid(), "Notification3", "{}",
                                                                          buffer2, DateTime.Today);

            notificationsToRelease.Add(buffer2, notification3);
            inMemoryCrudRepository.Attach(notification3);

            bufferGovernor1.SelectNotificationsForReleaseAsync(inMemoryCrudRepository)
            .Returns(notificationsToRelease);

            var job = new ProcessBufferedNotificationsJob(Clock.Current.Now);
            await sut.HandleAsync(job, CancellationToken.None);

            notificationPipeline1.Received(1).ProcessNotificationsAsync(
                Arg.Is <IReadOnlyCollection <INotification> >(
                    x => x.Count() == 2 &&
                    x.Count(y => ((TestNotification)y).TypeName == "Notification1") == 1 &&
                    x.Count(y => ((TestNotification)y).TypeName == "Notification2") == 1));

            notificationPipeline2.Received(1).ProcessNotificationsAsync(
                Arg.Is <IReadOnlyCollection <INotification> >(
                    x => x.Count() == 1 &&
                    x.Count(y => ((TestNotification)y).TypeName == "Notification3") == 1));
        }
        public async Task HandleAsync_RemovesNotificationFromRepository()
        {
            var notificationsToRelease = new MultiValueDictionary <NotificationBuffer, BufferedNotification>();

            NotificationBuffer buffer1 = new NotificationBuffer(Guid.NewGuid(), bufferGovernor1.Id,
                                                                notificationPipeline1.Id);

            inMemoryCrudRepository.Attach(buffer1);
            BufferedNotification notification1 = new BufferedNotification(Guid.NewGuid(), "Notification1", "{}",
                                                                          buffer1, DateTime.Today);

            notificationsToRelease.Add(buffer1, notification1);
            inMemoryCrudRepository.Attach(notification1);

            bufferGovernor1.SelectNotificationsForReleaseAsync(inMemoryCrudRepository)
            .Returns(notificationsToRelease);

            var job = new ProcessBufferedNotificationsJob(Clock.Current.Now);
            await sut.HandleAsync(job, CancellationToken.None);

            Assert.DoesNotContain(notification1, inMemoryCrudRepository.FindAll <BufferedNotification>());
        }