From 01b41c8030f4bf6d66be64df8da078b5fbf2cc7a Mon Sep 17 00:00:00 2001 From: "Rami O. Hassan" <48259541+ramioh@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:02:40 +0200 Subject: [PATCH] Add tests --- src/MiniExcel/ExcelFactory.cs | 3 +- .../SaveByTemplate/ExcelOpenXmlTemplate.cs | 8 +- .../SaveByTemplate/IInputValueExtractor.cs | 9 ++ .../SaveByTemplate/InputValueExtractor.cs | 4 +- tests/MiniExcelTests/MiniExcelTests.csproj | 1 + .../InputValueExtractorTests.cs | 104 ++++++++++++++++++ .../MiniExcelTemplateAsyncTests.cs | 2 +- .../MiniExcelTemplateTests.cs | 2 +- 8 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs create mode 100644 tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs rename tests/MiniExcelTests/{ => SaveByTemplate}/MiniExcelTemplateAsyncTests.cs (97%) rename tests/MiniExcelTests/{ => SaveByTemplate}/MiniExcelTemplateTests.cs (97%) diff --git a/src/MiniExcel/ExcelFactory.cs b/src/MiniExcel/ExcelFactory.cs index 0543745e..d63998b7 100644 --- a/src/MiniExcel/ExcelFactory.cs +++ b/src/MiniExcel/ExcelFactory.cs @@ -50,7 +50,8 @@ internal static IExcelTemplateAsync GetProvider(Stream stream, IConfiguration co switch (excelType) { case ExcelType.XLSX: - return new ExcelOpenXmlTemplate(stream, configuration); + var valueExtractor = new InputValueExtractor(); + return new ExcelOpenXmlTemplate(stream, configuration, valueExtractor); default: throw new NotSupportedException($"Please Issue for me"); } diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs index 40f33287..85780233 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs +++ b/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs @@ -28,12 +28,14 @@ static ExcelOpenXmlTemplate() private readonly Stream _stream; private readonly OpenXmlConfiguration _configuration; + private readonly IInputValueExtractor _inputValueExtractor; private readonly StringBuilder _calcChainContent = new StringBuilder(); - public ExcelOpenXmlTemplate(Stream stream, IConfiguration configuration) + public ExcelOpenXmlTemplate(Stream stream, IConfiguration configuration, InputValueExtractor inputValueExtractor) { _stream = stream; _configuration = (OpenXmlConfiguration)configuration ?? OpenXmlConfiguration.DefaultConfig; + _inputValueExtractor = inputValueExtractor; } public void SaveAsByTemplate(string templatePath, object value) @@ -77,11 +79,11 @@ public void SaveAsByTemplateImpl(Stream templateStream, object value) var sheetStream = sheet.Open(); var fullName = sheet.FullName; + var inputValues = _inputValueExtractor.ToValueDictionary(value); ZipArchiveEntry entry = _archive.zipFile.CreateEntry(fullName); using (var zipStream = entry.Open()) { - GenerateSheetXmlImpl(sheet, zipStream, sheetStream, - InputValueExtractor.ToValueDictionary(value), sharedStrings, false); + GenerateSheetXmlImpl(sheet, zipStream, sheetStream, inputValues, sharedStrings, false); //doc.Save(zipStream); //don't do it because : ![image](https://user-images.githubusercontent.com/12729184/114361127-61a5d100-9ba8-11eb-9bb9-34f076ee28a2.png) } diff --git a/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs b/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs new file mode 100644 index 00000000..ae131da2 --- /dev/null +++ b/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MiniExcelLibs.OpenXml.SaveByTemplate +{ + public interface IInputValueExtractor + { + IDictionary ToValueDictionary(object valueObject); + } +} \ No newline at end of file diff --git a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs b/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs index 8ba0e1a6..3178badb 100644 --- a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs +++ b/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs @@ -6,9 +6,9 @@ namespace MiniExcelLibs.OpenXml.SaveByTemplate { - public static class InputValueExtractor + public class InputValueExtractor : IInputValueExtractor { - public static IDictionary ToValueDictionary(object valueObject) + public IDictionary ToValueDictionary(object valueObject) => valueObject is Dictionary valueDictionary ? GetValuesFromDictionary(valueDictionary) : GetValuesFromObject(valueObject); diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index 92a49d41..28c5d2df 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -22,6 +22,7 @@ + diff --git a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs new file mode 100644 index 00000000..5b819e37 --- /dev/null +++ b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Data; +using FluentAssertions; +using MiniExcelLibs.OpenXml.SaveByTemplate; +using Xunit; + +namespace MiniExcelTests.SaveByTemplate; + +public class InputValueExtractorTests +{ + [Fact] + public void ToValueDictionary_Given_InputIsDictionaryWithoutDataReader_Then_Output_IsAnEquivalentDictionary() + { + var valueDictionary = new Dictionary + { + ["Name"] = "John", + ["Age"] = 18, + ["Fruits"] = new List { "Apples, Oranges" }, + }; + + var sut = new InputValueExtractor(); + var result = sut.ToValueDictionary(valueDictionary); + + result.Should().BeEquivalentTo(valueDictionary); + } + + [Fact] + public void ToValueDictionary_Given_InputIsDictionaryWithDataReader_Then_DataReaderIsConvertedToListOfDictionaries() + { + var dataTable = new DataTable(); + + dataTable.Columns.Add("id", typeof(int)); + dataTable.Columns.Add("name", typeof(string)); + dataTable.Rows.Add(1, "Jack"); + dataTable.Rows.Add(2, "Mike"); + + var expectedOutput = new List> + { + new() { ["id"] = 1, ["name"] = "Jack" }, + new() { ["id"] = 2, ["name"] = "Mike" } + }; + + var valueDictionary = new Dictionary + { + ["DataReader"] = dataTable.CreateDataReader() + }; + + var sut = new InputValueExtractor(); + var result = sut.ToValueDictionary(valueDictionary); + + result["DataReader"].Should().BeEquivalentTo(expectedOutput); + } + + [Fact] + public void ToValueDictionary_Given_InputIsPocoRecord_Then_Output_IsAnEquivalentDictionary() + { + var valueObject = new PocoRecord("John", 18, new List { "Apples, Oranges" }); + + var expectedOutput = new Dictionary() + { + ["Name"] = "John", + ["Age"] = 18, + ["Fruits"] = new List { "Apples, Oranges" } + }; + + var sut = new InputValueExtractor(); + var result = sut.ToValueDictionary(valueObject); + + result.Should().BeEquivalentTo(expectedOutput); + } + + [Fact] + public void ToValueDictionary_Given_InputIsPocoClass_Then_Output_IsAnEquivalentDictionary() + { + var valueObject = new PocoClass + { + Name = "John", + Age = 18, + Fruits = new List { "Apples, Oranges" } + }; + + var expectedOutput = new Dictionary() + { + ["Name"] = "John", + ["Age"] = 18, + ["Fruits"] = new List { "Apples, Oranges" } + }; + + var sut = new InputValueExtractor(); + var result = sut.ToValueDictionary(valueObject); + + result.Should().BeEquivalentTo(expectedOutput); + } + + + private record PocoRecord(string Name, int Age, IEnumerable Fruits); + + private class PocoClass + { + public string Name { get; set; } + public int Age { get; set; } + public IEnumerable Fruits; // Field + }; +} \ No newline at end of file diff --git a/tests/MiniExcelTests/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs similarity index 97% rename from tests/MiniExcelTests/MiniExcelTemplateAsyncTests.cs rename to tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 01f93aa4..0a3174cc 100644 --- a/tests/MiniExcelTests/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Xunit; -namespace MiniExcelTests +namespace MiniExcelTests.SaveByTemplate { public class MiniExcelTemplateAsyncTests { diff --git a/tests/MiniExcelTests/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs similarity index 97% rename from tests/MiniExcelTests/MiniExcelTemplateTests.cs rename to tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index fd50fbcc..661b5b3f 100644 --- a/tests/MiniExcelTests/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Xunit; -namespace MiniExcelTests +namespace MiniExcelTests.SaveByTemplate { public class MiniExcelTemplateTests {