public async Task Then_The_Standards_Csv_File_Is_Extracted_From_The_Archive(
            string filePath,
            string content,
            string newFilePath,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <IImportAuditRepository> repository,
            [Frozen] Mock <IZipArchiveHelper> zipHelper,
            LarsImportService larsImportService)
        {
            //Arrange
            service.Setup(x => x.GetFileStream(newFilePath))
            .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(content)));
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(newFilePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync((ImportAudit)null);

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            zipHelper.Verify(x =>
                             x.ExtractModelFromCsvFileZipStream <StandardCsv>(It.IsAny <Stream>(), Constants.LarsStandardsFileName),
                             Times.Once);
        }
        public async Task Then_The_Current_Lars_Import_Data_Is_Deleted(
            string filePath,
            string content,
            string newFilePath,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <ILarsStandardImportRepository> larsStandardImportRepository,
            [Frozen] Mock <IApprenticeshipFundingImportRepository> apprenticeshipFundingImportRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2ImportRepository> sectorSubjectAreaTier2ImportRepository,
            [Frozen] Mock <IImportAuditRepository> repository,
            LarsImportService larsImportService)
        {
            //Arrange
            service.Setup(x => x.GetFileStream(newFilePath))
            .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(content)));
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(newFilePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync((ImportAudit)null);

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            larsStandardImportRepository.Verify(x => x.DeleteAll(), Times.Once);
            apprenticeshipFundingImportRepository.Verify(x => x.DeleteAll(), Times.Once);
            sectorSubjectAreaTier2ImportRepository.Verify(x => x.DeleteAll(), Times.Once);
        }
        public async Task Then_The_Download_Path_Is_Parsed_From_The_Url_And_The_Current_File_Is_Checked_Against_The_Existing_And_If_Same_Then_No_Download(
            string filePath,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <IImportAuditRepository> repository,
            [Frozen] Mock <ILarsStandardImportRepository> larsStandardImportRepository,
            [Frozen] Mock <IApprenticeshipFundingImportRepository> apprenticeshipFundingImportRepository,
            [Frozen] Mock <ILarsStandardRepository> larsStandardRepository,
            [Frozen] Mock <IApprenticeshipFundingRepository> apprenticeshipFundingRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2Repository> sectorSubjectAreaRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2ImportRepository> sectorSubjectAreaImportRepository,
            LarsImportService larsImportService)
        {
            //Arrange
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(filePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync(new ImportAudit(DateTime.Now, 100, ImportType.LarsImport, filePath));

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            pageParser.Verify(x => x.GetCurrentLarsDataDownloadFilePath(), Times.Once);
            service.Verify(x => x.GetFileStream(It.IsAny <string>()), Times.Never);
            larsStandardImportRepository.Verify(x => x.DeleteAll(), Times.Never);
            apprenticeshipFundingImportRepository.Verify(x => x.DeleteAll(), Times.Never);
            sectorSubjectAreaImportRepository.Verify(x => x.DeleteAll(), Times.Never);
            larsStandardRepository.Verify(x => x.DeleteAll(), Times.Never);
            apprenticeshipFundingRepository.Verify(x => x.DeleteAll(), Times.Never);
            sectorSubjectAreaRepository.Verify(x => x.DeleteAll(), Times.Never);
        }
        public async Task Then_An_Audit_Record_Is_Created(
            DateTime importStartTime,
            string filePath,
            List <LarsStandardImport> larsStandardImports,
            List <StandardImport> standards,
            List <ApprenticeshipFundingImport> apprenticeshipFundingImports,
            List <SectorSubjectAreaTier2Import> sectorSubjectAreaTier2Imports,
            [Frozen] Mock <IImportAuditRepository> importAuditRepository,
            [Frozen] Mock <ILarsStandardImportRepository> larsStandardImportRepository,
            [Frozen] Mock <IApprenticeshipFundingImportRepository> apprenticeshipFundingImportRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2ImportRepository> sectorSubjectAreaTier2ImportRepository,
            [Frozen] Mock <IStandardImportRepository> standardImportRepository,
            LarsImportService larsImportService)
        {
            standards.ForEach(s => s.LarsCode = 1);
            apprenticeshipFundingImports.ForEach(i => i.LarsCode = 1);
            larsStandardImportRepository.Setup(x => x.GetAll()).ReturnsAsync(larsStandardImports);
            apprenticeshipFundingImportRepository.Setup(x => x.GetAll()).ReturnsAsync(apprenticeshipFundingImports);
            sectorSubjectAreaTier2ImportRepository.Setup(x => x.GetAll()).ReturnsAsync(sectorSubjectAreaTier2Imports);
            standardImportRepository.Setup(x => x.GetAll()).ReturnsAsync(standards);

            //Act
            await larsImportService.LoadDataFromStaging(importStartTime, filePath);

            //Assert
            var totalRecords = larsStandardImports.Count + (apprenticeshipFundingImports.Count * standards.Count) + sectorSubjectAreaTier2Imports.Count;

            importAuditRepository.Verify(x => x
                                         .Insert(It.Is <ImportAudit>(c
                                                                     => c.ImportType.Equals(ImportType.LarsImport) &&
                                                                     c.FileName.Equals(filePath) &&
                                                                     c.RowsImported.Equals(totalRecords))),
                                         Times.Once);
        }
        public async Task Then_The_Standard_Data_Is_Loaded_Into_The_Import_Repository(
            string filePath,
            string content,
            string newFilePath,
            ApprenticeshipFundingCsv frameWorkCsv,
            List <StandardCsv> standardCsv,
            List <ApprenticeshipFundingCsv> apprenticeFundingCsv,
            SectorSubjectAreaTier2Csv sectorSubjectAreaTier2Csv1,
            SectorSubjectAreaTier2Csv sectorSubjectAreaTier2Csv2,
            SectorSubjectAreaTier2Csv sectorSubjectAreaTier2Csv3,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <ILarsStandardImportRepository> larsStandardImportRepository,
            [Frozen] Mock <IApprenticeshipFundingImportRepository> apprenticeshipFundingImportRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2ImportRepository> sectorSubjectAreaTier2ImportRepository,
            [Frozen] Mock <IImportAuditRepository> repository,
            [Frozen] Mock <IZipArchiveHelper> zipHelper,
            LarsImportService larsImportService)
        {
            //Arrange
            apprenticeFundingCsv            = apprenticeFundingCsv.Select(c => { c.ApprenticeshipType = "STD"; return(c); }).ToList();
            frameWorkCsv.ApprenticeshipType = "FRMK";
            apprenticeFundingCsv.Add(frameWorkCsv);
            service.Setup(x => x.GetFileStream(newFilePath))
            .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(content)));
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(newFilePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync((ImportAudit)null);
            zipHelper.Setup(x =>
                            x.ExtractModelFromCsvFileZipStream <StandardCsv>(It.IsAny <Stream>(),
                                                                             Constants.LarsStandardsFileName))
            .Returns(standardCsv);
            zipHelper.Setup(x =>
                            x.ExtractModelFromCsvFileZipStream <ApprenticeshipFundingCsv>(It.IsAny <Stream>(),
                                                                                          Constants.LarsApprenticeshipFundingFileName))
            .Returns(apprenticeFundingCsv);
            zipHelper.Setup(x =>
                            x.ExtractModelFromCsvFileZipStream <SectorSubjectAreaTier2Csv>(It.IsAny <Stream>(),
                                                                                           Constants.LarsSectorSubjectAreaTier2FileName))
            .Returns(new List <SectorSubjectAreaTier2Csv> {
                sectorSubjectAreaTier2Csv1, sectorSubjectAreaTier2Csv2, sectorSubjectAreaTier2Csv3
            });

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            larsStandardImportRepository.Verify(x =>
                                                x.InsertMany(It.Is <List <LarsStandardImport> >(c => c.Count.Equals(standardCsv.Count))), Times.Once);
            apprenticeshipFundingImportRepository.Verify(x =>
                                                         x.InsertMany(It.Is <List <ApprenticeshipFundingImport> >(c => c.Count.Equals(apprenticeFundingCsv.Count - 1))), Times.Once);
            sectorSubjectAreaTier2ImportRepository.Verify(x =>
                                                          x.InsertMany(It.Is <List <SectorSubjectAreaTier2Import> >(c =>
                                                                                                                    c.Count.Equals(3))), Times.Once);
        }
        public async Task Then_The_FundingData_Is_Added_From_The_Import_Repository_Along_With_StandardUId(
            DateTime importStartTime,
            string filePath,
            [Frozen] Mock <IStandardImportRepository> standardImportRepository,
            [Frozen] Mock <IApprenticeshipFundingImportRepository> apprenticeshipFundingImportRepository,
            [Frozen] Mock <IApprenticeshipFundingRepository> apprenticeshipFundingRepository,
            LarsImportService larsImportService)
        {
            //Arrange
            var standardImports = new List <StandardImport>
            {
                new StandardImport {
                    LarsCode = 1, StandardUId = "ST0001_1.0"
                },
                new StandardImport {
                    LarsCode = 2, StandardUId = "ST0002_1.0"
                },
                new StandardImport {
                    LarsCode = 2, StandardUId = "ST0002_1.1"
                }
            };

            standardImportRepository.Setup(s => s.GetAll()).ReturnsAsync(standardImports);

            var apprenticeshipFundingImports = new List <ApprenticeshipFundingImport>
            {
                new ApprenticeshipFundingImport {
                    LarsCode = 1, Id = Guid.NewGuid()
                },
                new ApprenticeshipFundingImport {
                    LarsCode = 1, Id = Guid.NewGuid()
                },
                new ApprenticeshipFundingImport {
                    LarsCode = 2, Id = Guid.NewGuid()
                },
                new ApprenticeshipFundingImport {
                    LarsCode = 2, Id = Guid.NewGuid()
                }
            };

            apprenticeshipFundingImportRepository.Setup(x => x.GetAll()).ReturnsAsync(apprenticeshipFundingImports);

            //Act
            await larsImportService.LoadDataFromStaging(importStartTime, filePath);

            //Assert
            standardImportRepository.Verify(x => x.GetAll(), Times.Once);
            apprenticeshipFundingRepository.Verify(x => x.InsertMany(It.Is <List <ApprenticeshipFunding> >(c => c.Count.Equals(6))), Times.Once);
            apprenticeshipFundingRepository.Verify(x => x.InsertMany(It.Is <List <ApprenticeshipFunding> >(c => c.Where(s => s.StandardUId == "ST0001_1.0").Count().Equals(2))), Times.Once);
            apprenticeshipFundingRepository.Verify(x => x.InsertMany(It.Is <List <ApprenticeshipFunding> >(c => c.Where(s => s.StandardUId == "ST0002_1.0").Count().Equals(2))), Times.Once);
            apprenticeshipFundingRepository.Verify(x => x.InsertMany(It.Is <List <ApprenticeshipFunding> >(c => c.Where(s => s.StandardUId == "ST0002_1.1").Count().Equals(2))), Times.Once);
        }
        public async Task Then_The_Data_Is_Deleted_From_The_Repository(
            DateTime importStartTime,
            string filePath,
            [Frozen] Mock <ILarsStandardRepository> larsStandardRepository,
            [Frozen] Mock <IApprenticeshipFundingRepository> apprenticeshipFundingRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2Repository> sectorSubjectAreaTier2Repository,
            LarsImportService larsImportService)
        {
            //Act
            await larsImportService.LoadDataFromStaging(importStartTime, filePath);

            //Assert
            larsStandardRepository.Verify(x => x.DeleteAll(), Times.Once);
            apprenticeshipFundingRepository.Verify(x => x.DeleteAll(), Times.Once);
            sectorSubjectAreaTier2Repository.Verify(x => x.DeleteAll(), Times.Once);
        }
        public async Task Then_The_Data_Is_Downloaded_From_The_Api_If_No_Previous_File_Returned(
            string filePath,
            string content,
            string newFilePath,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <IImportAuditRepository> repository,
            LarsImportService larsImportService)
        {
            //Arrange
            service.Setup(x => x.GetFileStream(newFilePath))
            .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(content)));
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(newFilePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync((ImportAudit)null);

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            service.Verify(x => x.GetFileStream(newFilePath), Times.Once);
        }
        public async Task Then_The_Download_Path_Is_Parsed_From_The_Url_And_The_Current_File_Is_Checked_Against_The_Existing_And_If_Same_Then_Download(
            string filePath,
            string content,
            [Frozen] Mock <ILarsPageParser> pageParser,
            [Frozen] Mock <IDataDownloadService> service,
            [Frozen] Mock <IImportAuditRepository> repository,
            LarsImportService larsImportService)
        {
            //Arrange
            service.Setup(x => x.GetFileStream(filePath))
            .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(content)));
            pageParser.Setup(x => x.GetCurrentLarsDataDownloadFilePath()).ReturnsAsync(filePath);
            repository.Setup(x => x.GetLastImportByType(ImportType.LarsImport))
            .ReturnsAsync(new ImportAudit(DateTime.Now, 100, ImportType.LarsImport, filePath));

            //Act
            await larsImportService.ImportDataIntoStaging();

            //Assert
            pageParser.Verify(x => x.GetCurrentLarsDataDownloadFilePath(), Times.Once);
            service.Verify(x => x.GetFileStream(filePath), Times.Once);
        }
        public async Task Then_The_Data_Is_Added_From_The_Import_Repositories(
            DateTime importStartTime,
            string filePath,
            List <LarsStandardImport> larsStandardImports,
            List <SectorSubjectAreaTier2Import> sectorSubjectAreaTier2Imports,
            [Frozen] Mock <ILarsStandardImportRepository> larsStandardImportRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2ImportRepository> sectorSubjectAreaTier2ImportRepository,
            [Frozen] Mock <ILarsStandardRepository> larsStandardRepository,
            [Frozen] Mock <IApprenticeshipFundingRepository> apprenticeshipFundingRepository,
            [Frozen] Mock <ISectorSubjectAreaTier2Repository> sectorSubjectAreaTier2Repository,
            LarsImportService larsImportService)
        {
            //Arrange
            larsStandardImportRepository.Setup(x => x.GetAll()).ReturnsAsync(larsStandardImports);
            sectorSubjectAreaTier2ImportRepository.Setup(x => x.GetAll()).ReturnsAsync(sectorSubjectAreaTier2Imports);

            //Act
            await larsImportService.LoadDataFromStaging(importStartTime, filePath);

            //Assert
            larsStandardRepository.Verify(x => x.InsertMany(It.Is <List <LarsStandard> >(c => c.Count.Equals(larsStandardImports.Count))), Times.Once);
            sectorSubjectAreaTier2Repository.Verify(x => x.InsertMany(It.Is <List <SectorSubjectAreaTier2> >(c => c.Count.Equals(sectorSubjectAreaTier2Imports.Count))), Times.Once);
        }