public async Task WhenDownloadIsNewThenGeneratePathAndUploadToBlob(
            Function2WorkerFixture workerFixture,
            string uploadPath,
            Guid channelGuid,
            string url,
            string downloadContent)
        {
            var worker = workerFixture
                         .SerializerReturnsValidObject(channelGuid, url)
                         .DownloaderReturns(downloadContent)
                         .DownloadDoesNotExits()
                         .GenerateValidBlobUploadPath(uploadPath)
                         .GetWorker();


            await worker.Run(string.Empty);

            workerFixture
            .DownloadsReader
            .Verify(
                v => v.Exists(It.Is <Guid>(p => p == channelGuid),
                              It.IsAny <string>()),
                Times.Once());

            workerFixture
            .PathGenerator
            .Verify(v => v.CreateChannelDownloadPath(It.Is <Guid>(p => p == channelGuid)), Times.Once);

            workerFixture
            .BlobContainer
            .Verify(
                v => v.UploadStringAsync(
                    It.Is <string>(p => p == "rss"),
                    It.Is <string>(p => p == uploadPath),
                    It.Is <string>(p => p == downloadContent),
                    It.IsAny <IBlobContainer.UploadStringCompression>()), Times.Once);

            workerFixture
            .DownloadsWriter
            .Verify(
                v => v.InsertAsync(It.Is <DownloadDto>(p =>
                                                       p.Path == uploadPath && p.ChannelId == channelGuid)), Times.Once);
        }
        public async Task WhenDownloadsAlreadyExistsDoesNotGenerateUploadNorInsertDownload(
            Function2WorkerFixture workerFixture)
        {
            await workerFixture
            .SerializerReturnsValidObject()
            .DownloaderReturnsEmptyString()
            .DownloadsAlreadyExists()
            .GetWorker()
            .Run(string.Empty);

            workerFixture.PathGenerator
            .Verify(v => v.CreateChannelDownloadPath(It.IsAny <Guid>()), Times.Never);

            workerFixture.BlobContainer
            .Verify(v => v.UploadStringAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IBlobContainer.UploadStringCompression>())
                    ,
                    Times.Never);

            workerFixture.DownloadsWriter
            .Verify(v => v.InsertAsync(It.IsAny <DownloadDto>()), Times.Never);
        }
        public void WhenDownloaderConfirmsDownloadExistence_DoesNotGenerateNorUpload(Function2WorkerFixture fixture, Guid channelGuid, string url
                                                                                     , string downloadContent, string queueItem)
        {
            // arrange
            var sut = fixture
                      .WithSerializer_ReturnsValidObject(channelGuid, url)
                      .WithDownloader_Returns(downloadContent)
                      .WithDownloadsReader_ConfirmingExistanceOfDownload()
                      .GetWorker();

            // act
            sut.Run(queueItem);

            // assert
            fixture.MockBlobPathGenerator
            .Verify(v => v.CreateChannelDownloadPath(It.IsAny <Guid>()),
                    Times.Never);

            fixture.MockBlobContainer
            .Verify(v => v.UploadStringAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IBlobContainer.UploadStringCompression>())
                    ,
                    Times.Never);
        }