public async Task ItShouldNotCommitNotificationsIfReceivedAnEmptyCollectionOfNotifications(
            INotificationChannel <long> channel,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange
            A.CallTo(() => channel.Receive(A <CancellationToken> ._))
            .Returns(Enumerable.Empty <INotification <long> >().ToArray());

            // Act
            await sut.GetMessages(CancellationToken.None);

            // Assert
            A.CallTo(() => channel.Commit(A <INotification <long>[]> ._, A <NotificationTransaction> ._))
            .MustNotHaveHappened();
        }
        public async Task ItShouldReturnTheExpectedResultWhenNoExceptionIsThrown(
            NotificationTransaction expectedTransaction,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange
            var expected =
                new MessageEnvelope("Notifications Commited", expectedTransaction)
                .AsSource()
                .OfLikeness <MessageEnvelope>()
                .CreateProxy();

            // Act
            var actual = await sut.GetMessages(CancellationToken.None);

            // Assert
            expected.Should().Be(actual);
        }
        public async Task ItShouldStoreTheExpectedMessagesWhenNoExceptionIsThrown(
            [Frozen] IStorageProvider <long> storageProvider,
            [Frozen] IStorageMessageSerializer serializer,
            CancellationToken cancellation,
            NotificationTransaction expectedTransaction,
            INotification <long>[] expectedNotifications,
            INotificationChannel <long> channel,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange

            // Act
            await sut.GetMessages(cancellation);

            // Assert
            A.CallTo(() => storageProvider.Store(serializer, expectedNotifications)).MustHaveHappened(Repeated.Exactly.Once)
            .Then(A.CallTo(() => channel.Commit(expectedNotifications, expectedTransaction)).MustHaveHappened(Repeated.Exactly.Once));
        }
        public async Task ItShouldReturnTheExpectedResultsIfReceivedAnEmptyCollectionOfNotifications(
            INotificationChannel <long> channel,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange
            A.CallTo(() => channel.Receive(A <CancellationToken> ._))
            .Returns(Enumerable.Empty <INotification <long> >().ToArray());

            var likeness =
                new MessageEnvelope(null, null)
                .AsSource()
                .OfLikeness <MessageEnvelope>();

            // Act
            var actual = await sut.GetMessages(CancellationToken.None);

            // Assert
            likeness.ShouldEqual(actual);
        }
        public async Task ItShouldRollbackTheExpectedMessagesWhenAnExceptionIsThrown(
            [Frozen] IStorageProvider <long> storageProvider,
            NotificationTransaction expectedTransaction,
            INotification <long>[] expectedNotifications,
            INotificationChannel <long> channel,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange
            A.CallTo(() => storageProvider.Store(
                         A <IStorageMessageSerializer> ._,
                         A <INotification <long>[]> ._))
            .Throws <Exception>();

            // Act
            await sut.GetMessages(CancellationToken.None);

            // Assert
            A.CallTo(() => channel.Commit(A <INotification <long>[]> ._, A <NotificationTransaction> ._)).MustNotHaveHappened();
            A.CallTo(() => channel.Rollback(expectedNotifications, expectedTransaction)).MustHaveHappened(Repeated.Exactly.Once);
        }
        public async Task ItShouldReturnTheExpectedResultWhenAnExceptionIsThrown(
            [Frozen] IStorageProvider <long> storageProvider,
            NotificationTransaction expectedTransaction,
            Exception exception,
            AbstractMessageProcessor <long> sut)
        {
            // Arrange
            A.CallTo(() => storageProvider.Store(
                         A <IStorageMessageSerializer> ._,
                         A <INotification <long>[]> ._))
            .Throws(exception);

            var likeness =
                new MessageEnvelope(exception.Message, expectedTransaction)
                .AsSource()
                .OfLikeness <MessageEnvelope>();

            // Act
            var actual = await sut.GetMessages(CancellationToken.None);

            // Assert
            likeness.ShouldEqual(actual);
        }