public async Task UploadsSuppliedStreamToBlobStoreWithANewBatchIdAndRespondsWithSaasUrlAndBatchId()
        {
            byte[] expectedUpload = NewRandomBytes();

            string expectedSaasUrl = NewRandomString();
            string expectedBatchId = NewRandomString();

            DateTimeOffset utcNow = NewRandomDate();

            BatchUploadBlobName blobName = new BatchUploadBlobName(expectedBatchId);

            GivenTheNewBatchId(expectedBatchId);
            AndTheBlobIsCreated(blobName);
            AndTheCurrentDateTime(utcNow);
            AndTheSaasUrl(blobName, utcNow, expectedSaasUrl);

            OkObjectResult result = await WhenTheBatchIsUploaded(NewBatchUploadRequest(_ => _.WithStream(expectedUpload))) as OkObjectResult;

            result?
            .Value
            .Should()
            .BeEquivalentTo(new BatchUploadResponse
            {
                Url     = expectedSaasUrl,
                BatchId = expectedBatchId
            });

            AndTheStreamWasUploaded(expectedUpload);
        }
        private void GivenTheUploadedExcelFile(string batchId,
                                               Stream stream)
        {
            BatchUploadBlobName blobName = new BatchUploadBlobName(batchId);

            Mock <ICloudBlob> blob = new Mock <ICloudBlob>();

            _blobClient.Setup(_ => _.GetBlobReferenceFromServerAsync(blobName, "batchuploads"))
            .ReturnsAsync(blob.Object);

            _blobClient.Setup(_ => _.DownloadToStreamAsync(blob.Object))
            .ReturnsAsync(stream);
        }
        public void ProcessFailsIfAnyUkprnsAreMissingForTheFundingStreamAndPeriodInTheSuppliedBatchDetails()
        {
            string batchId         = NewRandomString();
            string fundingStreamId = NewRandomString();
            string fundingPeriodId = NewRandomString();

            string ukprn1 = NewRandomString();
            string ukprn2 = NewRandomString();
            string ukprn3 = NewRandomString();
            string ukprn4 = NewRandomString();
            string ukprn5 = NewRandomString();
            string ukprn6 = NewRandomString();

            string publishedProviderId3 = NewRandomString();

            BatchUploadBlobName uploadedBlobName = new BatchUploadBlobName(batchId);

            GivenThePagesOfUkprns(uploadedBlobName,
                                  AsArray(ukprn1, ukprn2),
                                  AsArray(ukprn3),
                                  AsArray(ukprn4, ukprn5),
                                  AsArray(ukprn6));
            AndThePublisherProviderIds(fundingStreamId,
                                       fundingPeriodId,
                                       AsArray(ukprn3),
                                       (ukprn3, publishedProviderId3));

            Action invocation = () => WhenTheBatchUploadIsValidated(NewMessage(_ => _.WithUserProperty(BatchId, batchId)
                                                                               .WithUserProperty(FundingStreamId, fundingStreamId)
                                                                               .WithUserProperty(FundingPeriodId, fundingPeriodId)
                                                                               .WithUserProperty(SpecificationId, NewRandomString())))
                                .GetAwaiter()
                                .GetResult();

            string outcome = $"Did not locate the following ukprns for {fundingStreamId} and {fundingPeriodId}:\n{ukprn1},{ukprn2},{ukprn4},{ukprn5},{ukprn6}";

            invocation
            .Should()
            .Throw <NonRetriableException>()
            .WithMessage(outcome);

            _batchUploadReader.VerifyAll();
        }