public async Task TestAimAndDeliverableReportGeneration()
        {
            var dateTime = DateTime.UtcNow;
            var filename = $"10005752/2/ESF Round 2 Aim and Deliverable Report Legacy {dateTime:yyyyMMdd-HHmmss}";

            var dateTimeProviderMock = new Mock <IDateTimeProvider>();

            dateTimeProviderMock.Setup(x => x.GetNowUtc()).Returns(dateTime);
            dateTimeProviderMock.Setup(x => x.ConvertUtcToUk(It.IsAny <DateTime>())).Returns(dateTime);

            var models = AimAndDeliverableBuilder.BuildAimAndDeliverableModels();

            var aimAndDeliverableService1819Mock = new Mock <IAimAndDeliverableService1819>();

            aimAndDeliverableService1819Mock
            .Setup(m => m.GetAimAndDeliverableModel(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(models);

            var aimAndDeliverableService1920Mock = new Mock <IAimAndDeliverableService1920>();

            aimAndDeliverableService1920Mock
            .Setup(m => m.GetAimAndDeliverableModel(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(models);

            var csvServiceMock = new Mock <ICsvFileService>();

            csvServiceMock.Setup(x => x.WriteAsync <AimAndDeliverableModel, AimAndDeliverableMapper>(models, $"{filename}.csv", It.IsAny <string>(), It.IsAny <CancellationToken>(), null, null))
            .Returns(Task.CompletedTask);

            var aimAndDeliverableReport = new AimAndDeliverableReport(
                dateTimeProviderMock.Object,
                csvServiceMock.Object,
                aimAndDeliverableService1819Mock.Object,
                aimAndDeliverableService1920Mock.Object);

            var esfJobContextMock = new Mock <IEsfJobContext>();

            esfJobContextMock.Setup(x => x.UkPrn).Returns(10005752);
            esfJobContextMock.Setup(x => x.JobId).Returns(2);
            esfJobContextMock.Setup(x => x.BlobContainerName).Returns("TestBlob");
            esfJobContextMock.Setup(x => x.CollectionYear).Returns(1819);

            SourceFileModel sourceFile = GetEsfSourceFileModel();

            var reportName = await aimAndDeliverableReport.GenerateReport(esfJobContextMock.Object, sourceFile, null, CancellationToken.None);

            csvServiceMock.VerifyAll();
        }
        public async Task TestAimAndDeliverableReportGeneration()
        {
            var csv      = string.Empty;
            var dateTime = DateTime.UtcNow;
            var filename = $"10005752_2_ESF Aim and Deliverable Report {dateTime:yyyyMMdd-HHmmss}";

            var dateTimeProviderMock = new Mock <IDateTimeProvider>();

            dateTimeProviderMock.Setup(x => x.GetNowUtc()).Returns(dateTime);
            dateTimeProviderMock.Setup(x => x.ConvertUtcToUk(It.IsAny <DateTime>())).Returns(dateTime);

            var storage = new Mock <IStreamableKeyValuePersistenceService>();

            storage.Setup(x => x.SaveAsync($"{filename}.csv", It.IsAny <string>(), It.IsAny <CancellationToken>()))
            .Callback <string, string, CancellationToken>((key, value, ct) => csv = value)
            .Returns(Task.CompletedTask);

            var refRepoMock = new Mock <IReferenceDataCache>();

            refRepoMock.Setup(m =>
                              m.GetContractDeliverableCodeMapping(It.IsAny <IList <string> >(), It.IsAny <CancellationToken>()))
            .Returns(ReferenceDataBuilder.BuildContractDeliverableCodeMapping());
            refRepoMock.Setup(m => m.GetLarsLearningDelivery(It.IsAny <IList <string> >(), It.IsAny <CancellationToken>()))
            .Returns(ReferenceDataBuilder.BuildLarsLearningDeliveries());

            var validRepoMock = new Mock <IValidRepository>();

            validRepoMock.Setup(m => m.GetLearners(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(ValidLearnerModelsBuilder.BuildLearners());
            validRepoMock.Setup(m => m.GetLearningDeliveries(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(ValidLearnerModelsBuilder.BuildLearningDeliveries());
            validRepoMock.Setup(m => m.GetLearningDeliveryFAMs(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(ValidLearnerModelsBuilder.BuildLearningDeliveryFams());
            validRepoMock.Setup(m => m.GetDPOutcomes(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new List <DPOutcome>());
            validRepoMock.Setup(m =>
                                m.GetProviderSpecDeliveryMonitorings(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new List <ProviderSpecDeliveryMonitoring>());
            validRepoMock
            .Setup(m => m.GetProviderSpecLearnerMonitorings(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new List <ProviderSpecLearnerMonitoring>());

            var fm70RepoMock = new Mock <IFM70Repository>();

            fm70RepoMock.Setup(m => m.GetLearningDeliveries(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(FM70ModelsBuilder.BuildLearningDeliveries());
            fm70RepoMock.Setup(m => m.GetLearningDeliveryDeliverables(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(FM70ModelsBuilder.BuildLearningDeliveryDeliverables());
            fm70RepoMock.Setup(m =>
                               m.GetLearningDeliveryDeliverablePeriods(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(FM70ModelsBuilder.BuildDeliveryDeliverablePeriods());
            fm70RepoMock.Setup(m => m.GetOutcomes(It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new List <ESF_DPOutcome>());

            var comparer      = new AimAndDeliverableComparer();
            var valueProvider = new ValueProvider();

            var aimAndDeliverableReport = new AimAndDeliverableReport(
                dateTimeProviderMock.Object,
                storage.Object,
                refRepoMock.Object,
                validRepoMock.Object,
                fm70RepoMock.Object,
                valueProvider,
                comparer);

            var wrapper = new SupplementaryDataWrapper
            {
                SupplementaryDataModels = new List <SupplementaryDataModel>()
            };
            SourceFileModel sourceFile = GetEsfSourceFileModel();

            await aimAndDeliverableReport.GenerateReport(wrapper, sourceFile, null, CancellationToken.None);

            Assert.True(!string.IsNullOrEmpty(csv));
        }