public async Task <byte[]> GetCumulativeCsv(CumulativeData cumulativeData)
        {
            try
            {
                await using var memoryStream = new MemoryStream();
                await using var writer       = new StreamWriter(memoryStream);

                using var csvWriter = new CsvWriter(writer);
                csvWriter.Configuration.HasHeaderRecord = false;
                csvWriter.Configuration.RegisterClassMap <CumulativeValueMap>();

                csvWriter.WriteRecord(cumulativeData.Header);
                await csvWriter.NextRecordAsync();

                foreach (var value in cumulativeData.CumulativeValues)
                {
                    csvWriter.WriteRecord(value);
                    await csvWriter.NextRecordAsync();
                }

                await writer.FlushAsync();

                return(memoryStream.ToArray());
            }
            catch (Exception ex)
            {
                throw new CsvException(CsvExceptionType.FailedToWrite,
                                       "There was problem creating the cumulative file", ex);
            }
        }
        public async Task GetCumulativeCsv_ValidInput_ReturnsByteArray()
        {
            // Arrange
            var service = new CsvService();

            var cumulativeData = new CumulativeData
            {
                Header = new CumulativeHeader {
                    MinOriginYear = 2000, DevelopmentYears = 5
                },
                CumulativeValues = new List <CumulativeValue>
                {
                    new CumulativeValue
                    {
                        Type   = ProductType.Comp,
                        Values = new List <double> {
                            1, 2, 3
                        }
                    }
                }
            };

            // Act
            var result = await service.GetCumulativeCsv(cumulativeData);

            // Assert
            Assert.NotNull(result);
            Assert.True(result.Length > 0);
        }
        public async Task OnPostAsync_ReturnsFileStreamResult_WithFileName()
        {
            // Arrange
            var csvService        = new Mock <ICsvService>(MockBehavior.Strict);
            var cumulativeService = new Mock <ICumulativeService>(MockBehavior.Strict);
            var page = new IndexModel(csvService.Object, cumulativeService.Object)
            {
                CsvFile = GetCsvFile()
            };

            var incrementalData = new List <Claim> {
                new Claim()
            };
            var cumulativeData = new CumulativeData();

            csvService.Setup(cs => cs.GetIncrementalClaims(page.CsvFile))
            .ReturnsAsync(incrementalData);
            csvService.Setup(cs => cs.GetCumulativeCsv(cumulativeData))
            .ReturnsAsync(new byte[1]);
            cumulativeService.Setup(cs => cs.GetCumulativeData(incrementalData))
            .ReturnsAsync(cumulativeData);

            // Act
            var result = await page.OnPostAsync() as FileStreamResult;

            // Assert
            Assert.NotNull(result);
            Assert.True(result.FileDownloadName == FileUpload.CumulativeCsvFileName);
        }
        public async Task OnPostAsync_ReturnsFileStreamResult()
        {
            // Arrange
            var csvService        = new Mock <ICsvService>(MockBehavior.Strict);
            var cumulativeService = new Mock <ICumulativeService>(MockBehavior.Strict);
            var page = new IndexModel(csvService.Object, cumulativeService.Object)
            {
                CsvFile = GetCsvFile()
            };

            var incrementalData = new List <Claim> {
                new Claim()
            };
            var cumulativeData = new CumulativeData();

            csvService.Setup(cs => cs.GetIncrementalClaims(page.CsvFile))
            .ReturnsAsync(incrementalData);
            csvService.Setup(cs => cs.GetCumulativeCsv(cumulativeData))
            .ReturnsAsync(new byte[1]);
            cumulativeService.Setup(cs => cs.GetCumulativeData(incrementalData))
            .ReturnsAsync(cumulativeData);

            // Act
            var result = await page.OnPostAsync();

            // Assert
            Assert.IsInstanceOf(typeof(FileStreamResult), result);
        }
        public async Task OnPostAsync_ShowsError_IfCumulativeServiceThrowsException()
        {
            // Arrange
            var csvService        = new Mock <ICsvService>(MockBehavior.Strict);
            var cumulativeService = new Mock <ICumulativeService>(MockBehavior.Strict);
            var page = new IndexModel(csvService.Object, cumulativeService.Object)
            {
                CsvFile = GetCsvFile()
            };

            var incrementalData = new List <Claim> {
                new Claim()
            };
            var cumulativeData = new CumulativeData();

            csvService.Setup(cs => cs.GetIncrementalClaims(page.CsvFile))
            .ReturnsAsync(incrementalData);
            csvService.Setup(cs => cs.GetCumulativeCsv(cumulativeData))
            .ReturnsAsync(new byte[1]);
            cumulativeService.Setup(cs => cs.GetCumulativeData(incrementalData))
            .ThrowsAsync(new CumulativeException(CumulativeExceptionType.InvalidInput,
                                                 "Error calculating cumulative data"));

            // Act
            await page.OnPostAsync();

            // Assert
            Assert.False(page.ModelState.IsValid);
            Assert.True(page.ModelState.ErrorCount == 1);
        }
        public async Task OnPostAsync_ReturnsError_IfInvalidFileType()
        {
            // Arrange
            var csvService        = new Mock <ICsvService>(MockBehavior.Strict);
            var cumulativeService = new Mock <ICumulativeService>(MockBehavior.Strict);
            var page = new IndexModel(csvService.Object, cumulativeService.Object);

            var fileMock = new Mock <IFormFile>();

            fileMock.Setup(_ => _.FileName).Returns("input.jpg");

            page.CsvFile = fileMock.Object;

            var incrementalData = new List <Claim> {
                new Claim()
            };
            var cumulativeData = new CumulativeData();

            csvService.Setup(cs => cs.GetIncrementalClaims(page.CsvFile))
            .ReturnsAsync(incrementalData);
            csvService.Setup(cs => cs.GetCumulativeCsv(cumulativeData))
            .ReturnsAsync(new byte[1]);
            cumulativeService.Setup(cs => cs.GetCumulativeData(incrementalData))
            .ReturnsAsync(cumulativeData);

            // Act
            await page.OnPostAsync();

            // Assert
            Assert.False(page.ModelState.IsValid);
            Assert.True(page.ModelState.ErrorCount == 1);
        }