feat: Initialize Strata.Excel.Core library with export, import, and test utilities
This commit introduces the `Strata.Excel.Core` project, a .NET library built on ClosedXML for robust Excel document generation and data import. Key features include: - **Export:** Flexible data export to Excel, supporting custom formatting, titles, subtitles, humanized headings, and batched processing for large datasets. Includes `ExcelContentResult` and `ZipFileContentResult` for ASP.NET Core integration. - **Import:** Utilities to easily import data from Excel worksheets into C# objects. - **Test Utilities:** Comprehensive helpers for comparing Excel workbooks in tests, handling resource extraction, and performing load tests. - **Build Infrastructure:** Sets up a Dockerfile for building the library, including SonarQube and Dependency-Check scanning. - **Project Structure:** Establishes `.gitignore`, `.dockerignore`, `nuget.config`, and a `README.md` with usage instructions and versioning guidelines. This foundational commit provides a reusable and well-tested framework for Excel operations within Strata applications.
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
using ClosedXML.Excel;
|
||||
using FluentAssertions;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using Strata.Excel.Core.Import;
|
||||
using Strata.Excel.TestUtilities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using static Strata.Excel.Core.ExportUtils;
|
||||
|
||||
namespace Strata.Excel.Core.Test.Unit.ExcelExportTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestExcelExport
|
||||
{
|
||||
[OneTimeSetUp]
|
||||
public void RunBeforeAnyTests()
|
||||
{
|
||||
Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
|
||||
// or identically under the hoods
|
||||
Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
|
||||
}
|
||||
|
||||
private static readonly ResourceFileExtractor _extractor = new ResourceFileExtractor(".ExpectedResults.");
|
||||
private static readonly ResourceFileExtractor _dataExtractor = new ResourceFileExtractor(".ExcelExportTests.");
|
||||
|
||||
[Test, Ignore("File and stream do not match")]
|
||||
public void TestCreateExcelWorkbook()
|
||||
{
|
||||
var currentDir = Directory.GetCurrentDirectory();
|
||||
var jsonData = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var data = JsonConvert.DeserializeObject<List<TestData>>(jsonData)
|
||||
.OrderBy(t => t.OrgPin)
|
||||
.ThenBy(t => t.DatabaseFriendlyName)
|
||||
.ThenBy(t => t.Description);
|
||||
var options = new ExportOptions
|
||||
{
|
||||
EmptyMessage = "No Mappings"
|
||||
};
|
||||
options.AddColumnOptions("Confidence Score", NumberFormatId.ZeroPercent, XLAlignmentHorizontalValues.Right);
|
||||
options.AddColumnOptions("Date Mapped", NumberFormatId.ShortDateSlash, XLAlignmentHorizontalValues.Right);
|
||||
|
||||
var expected = $@"{TestContext.CurrentContext.Test.Name}.xlsx";
|
||||
var wb = CreateExcelWorkbook(data, options);
|
||||
#pragma warning disable S125 // Sections of code should not be commented out
|
||||
// wb.SaveAs(Path.Combine(@"C:\Git\excel.core\tests\Strata.Excel.Core.Test.Unit\ExcelExportTests\", expected));
|
||||
#pragma warning restore S125 // Sections of code should not be commented
|
||||
|
||||
// assert
|
||||
wb.Worksheets.Should().HaveCount(1);
|
||||
var ws = wb.Worksheet(1);
|
||||
ws.Should().NotBeNull();
|
||||
|
||||
using (var expectedStream = _extractor.ReadFileFromResourceToStream(expected))
|
||||
using (var actualStream = new MemoryStream())
|
||||
{
|
||||
wb.SaveAs(actualStream);
|
||||
actualStream.Compare(expectedStream, out var message).Should().BeTrue(message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Test, Ignore("File and stream do not match")]
|
||||
public void TestCreateExcelWorkbookWithoutHumanizedHeadings()
|
||||
{
|
||||
var currentDir = Directory.GetCurrentDirectory();
|
||||
var jsonData = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var data = JsonConvert.DeserializeObject<List<TestData>>(jsonData)
|
||||
.OrderBy(t => t.OrgPin)
|
||||
.ThenBy(t => t.DatabaseFriendlyName)
|
||||
.ThenBy(t => t.Description);
|
||||
var options = new ExportOptions
|
||||
{
|
||||
EmptyMessage = "No Mappings",
|
||||
HumanizeHeading = false
|
||||
};
|
||||
options.AddColumnOptions("ConfidenceScore", NumberFormatId.ZeroPercent, XLAlignmentHorizontalValues.Right);
|
||||
options.AddColumnOptions("DateMapped", NumberFormatId.ShortDateSlash, XLAlignmentHorizontalValues.Right);
|
||||
|
||||
var expected = $@"{TestContext.CurrentContext.Test.Name}.xlsx";
|
||||
var wb = CreateExcelWorkbook(data, options);
|
||||
#pragma warning disable S125 // Sections of code should not be commented out
|
||||
//wb.SaveAs(Path.Combine(@"C:\Git\excel.core\tests\Strata.Excel.Core.Test.Unit\ExcelExportTests\", expected));
|
||||
#pragma warning restore S125 // Sections of code should not be commented
|
||||
|
||||
// assert
|
||||
wb.Worksheets.Should().HaveCount(1);
|
||||
var ws = wb.Worksheet(1);
|
||||
ws.Should().NotBeNull();
|
||||
|
||||
using (var expectedStream = _extractor.ReadFileFromResourceToStream(expected))
|
||||
using (var actualStream = new MemoryStream())
|
||||
{
|
||||
wb.SaveAs(actualStream);
|
||||
actualStream.Compare(expectedStream, out var message).Should().BeTrue(message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Test, Ignore("This keeps requiring that we update the stream on the test")]
|
||||
public void TestCreateExcelWorkbookWithTitlePage()
|
||||
{
|
||||
var currentDir = Directory.GetCurrentDirectory();
|
||||
var jsonData = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var data = JsonConvert.DeserializeObject<List<TestData>>(jsonData)
|
||||
.OrderBy(t => t.OrgPin)
|
||||
.ThenBy(t => t.DatabaseFriendlyName)
|
||||
.ThenBy(t => t.Description);
|
||||
var options = new ExportOptions
|
||||
{
|
||||
Title = "Account Mappgings",
|
||||
SubTitle = "Strata Decision Technology®",
|
||||
EmptyMessage = "No Mappings"
|
||||
};
|
||||
options.AddColumnOptions("Confidence Score", NumberFormatId.ZeroPercent, XLAlignmentHorizontalValues.Right);
|
||||
options.AddColumnOptions("Date Mapped", NumberFormatId.ShortDateSlash, XLAlignmentHorizontalValues.Right);
|
||||
|
||||
var expected = $@"{TestContext.CurrentContext.Test.Name}.xlsx";
|
||||
var wb = CreateExcelWorkbook(data, options);
|
||||
#pragma warning disable S125 // Sections of code should not be commented out
|
||||
//wb.SaveAs(Path.Combine(@"C:\Git\excel.core\tests\Strata.Excel.Core.Test.Unit\ExcelExportTests\", expected));
|
||||
#pragma warning restore S125 // Sections of code should not be commented
|
||||
|
||||
// assert
|
||||
wb.Worksheets.Should().HaveCount(2);
|
||||
var ws = wb.Worksheet(2);
|
||||
ws.Should().NotBeNull();
|
||||
ws.GetDataFromExcel<TestData>().Should().HaveCount(data.Count());
|
||||
|
||||
using (var expectedStream = _extractor.ReadFileFromResourceToStream(expected))
|
||||
using (var actualStream = new MemoryStream())
|
||||
{
|
||||
wb.SaveAs(actualStream);
|
||||
actualStream.Compare(expectedStream, out var message).Should().BeTrue(message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal class TestData
|
||||
{
|
||||
public string OrgPin { get; set; }
|
||||
public string DatabaseName { get; set; }
|
||||
public string DatabaseFriendlyName { get; set; }
|
||||
public string SphAccountRollupStatement { get; set; }
|
||||
public string SphAccountRollupCategory { get; set; }
|
||||
public string SphAccountRollupLineItem { get; set; }
|
||||
public string SphAccountRollupName { get; set; }
|
||||
public double ConfidenceScore { get; set; }
|
||||
public string DateMapped { get; set; }
|
||||
public int AccountId { get; set; }
|
||||
public string AccountCode { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string GLRollup { get; set; }
|
||||
public string OBDollarsFinancialReporting { get; set; }
|
||||
public string DSSAccountRollup1Name { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
[
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Assets - Current",
|
||||
"SphAccountRollupLineItem": "Accounts Receivable - Other",
|
||||
"SphAccountRollupName": "Balance Sheet - Assets - Current - Accounts Receivable - Other",
|
||||
"ConfidenceScore": 0.8767915097336801,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 420,
|
||||
"AccountCode": "105219",
|
||||
"Description": "340B DIFFERENTIAL RECEIVABLE",
|
||||
"GLRollup": "SKCURRENTASSETS",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT ASSETS - Other current assets",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Assets - Inventory",
|
||||
"SphAccountRollupLineItem": "Inventory",
|
||||
"SphAccountRollupName": "Balance Sheet - Assets - Inventory - Inventory",
|
||||
"ConfidenceScore": 0.9104504962709786,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 496,
|
||||
"AccountCode": "110024",
|
||||
"Description": "340B RETAIL INVENTORY",
|
||||
"GLRollup": "SKCURRENTASSETS",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT ASSETS - Inventory",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Revenue - Patient - Gross",
|
||||
"SphAccountRollupLineItem": "Revenue - Outpatient",
|
||||
"SphAccountRollupName": "Income Statement - Revenue - Patient - Gross - Revenue - Outpatient",
|
||||
"ConfidenceScore": 0.9840537253695426,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 2359,
|
||||
"AccountCode": "420800",
|
||||
"Description": "340B RETAIL REVENUE",
|
||||
"GLRollup": "OUTPATIENT REVENUE",
|
||||
"OBDollarsFinancialReporting": "IS - REVENUE: - Outpatient revenue",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Revenue - Other - Operating",
|
||||
"SphAccountRollupLineItem": "Other Operating Revenue",
|
||||
"SphAccountRollupName": "Income Statement - Revenue - Other - Operating - Other Operating Revenue",
|
||||
"ConfidenceScore": 0.8907208071926644,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 2305,
|
||||
"AccountCode": "575506",
|
||||
"Description": "340B RETAIL REVENUE",
|
||||
"GLRollup": "OTHER REVENUE",
|
||||
"OBDollarsFinancialReporting": "IS - Other Operating Rev - Other operating revenue",
|
||||
"DSSAccountRollup1Name": "Other Operating Revenue"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Revenue - Other - Operating",
|
||||
"SphAccountRollupLineItem": "Other Operating Revenue",
|
||||
"SphAccountRollupName": "Income Statement - Revenue - Other - Operating - Other Operating Revenue",
|
||||
"ConfidenceScore": 0.8907208071926644,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 2302,
|
||||
"AccountCode": "575030",
|
||||
"Description": "340B RETAIL REVENUE",
|
||||
"GLRollup": "OTHER REVENUE",
|
||||
"OBDollarsFinancialReporting": "IS - Other Operating Rev - Other operating revenue",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Employee Compensation and Benefits",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Employee Compensation and Benefits",
|
||||
"ConfidenceScore": 0.39884468761403535,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1302,
|
||||
"AccountCode": "244130",
|
||||
"Description": "401K CONTR CATCH UP OVER 50",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Employee Compensation and Benefits",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Employee Compensation and Benefits",
|
||||
"ConfidenceScore": 0.7123256655440802,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1301,
|
||||
"AccountCode": "244126",
|
||||
"Description": "401K CONTR MATCH PBL",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Employee Compensation and Benefits",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Employee Compensation and Benefits",
|
||||
"ConfidenceScore": 0.530717787014235,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1304,
|
||||
"AccountCode": "244140",
|
||||
"Description": "401K CONTR MILITARY MAKE UP",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Employee Compensation and Benefits",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Employee Compensation and Benefits",
|
||||
"ConfidenceScore": 0.7266931053978312,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1303,
|
||||
"AccountCode": "244135",
|
||||
"Description": "401K CONTR NO MATCH",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Revenue - Other - Nonoperating Items",
|
||||
"SphAccountRollupLineItem": "Contributions",
|
||||
"SphAccountRollupName": "Income Statement - Revenue - Other - Nonoperating Items - Contributions",
|
||||
"ConfidenceScore": 0.5031995471555109,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1300,
|
||||
"AccountCode": "244125",
|
||||
"Description": "401K CONTRIBUTIONS",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Expenses - Operating",
|
||||
"SphAccountRollupLineItem": "Supplies",
|
||||
"SphAccountRollupName": "Income Statement - Expenses - Operating - Supplies",
|
||||
"ConfidenceScore": 0.4405172973818624,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 2799,
|
||||
"AccountCode": "646009",
|
||||
"Description": "A2CL BLOOD ALLOCATION",
|
||||
"GLRollup": "SUPPLIES",
|
||||
"OBDollarsFinancialReporting": "IS - EXPENSES: - Medical supplies",
|
||||
"DSSAccountRollup1Name": "Medical Supplies"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Revenue - Other - Operating",
|
||||
"SphAccountRollupLineItem": "Other Operating Revenue",
|
||||
"SphAccountRollupName": "Income Statement - Revenue - Other - Operating - Other Operating Revenue",
|
||||
"ConfidenceScore": 0.9150939588019593,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 2287,
|
||||
"AccountCode": "571901",
|
||||
"Description": "A2CL RVU TRANSFER",
|
||||
"GLRollup": "OTHER REVENUE",
|
||||
"OBDollarsFinancialReporting": "IS - Other Operating Rev - Other operating revenue",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Assets - Current",
|
||||
"SphAccountRollupLineItem": "Accounts Receivable - Other",
|
||||
"SphAccountRollupName": "Balance Sheet - Assets - Current - Accounts Receivable - Other",
|
||||
"ConfidenceScore": 0.7593035979954855,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 443,
|
||||
"AccountCode": "105320",
|
||||
"Description": "A2CL SERVICES RECEIVABLE",
|
||||
"GLRollup": "SKCURRENTASSETS",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT ASSETS - Other current assets",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Expenses",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Expenses",
|
||||
"ConfidenceScore": 0.8831137893820182,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1348,
|
||||
"AccountCode": "247152",
|
||||
"Description": "AACN PHYSICIAN PMTS PAYABLE",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Assets - Current",
|
||||
"SphAccountRollupLineItem": "Cash and Cash Equivalents",
|
||||
"SphAccountRollupName": "Balance Sheet - Assets - Current - Cash and Cash Equivalents",
|
||||
"ConfidenceScore": 0.7556597792049811,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 67,
|
||||
"AccountCode": "100507",
|
||||
"Description": "AAH CONTRLLD DISB ACCT M AND I",
|
||||
"GLRollup": "SKCURRENTASSETS",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT ASSETS - Operating cash",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Assets - Current",
|
||||
"SphAccountRollupLineItem": "Cash and Cash Equivalents",
|
||||
"SphAccountRollupName": "Balance Sheet - Assets - Current - Cash and Cash Equivalents",
|
||||
"ConfidenceScore": 0.4848799811631093,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 68,
|
||||
"AccountCode": "100508",
|
||||
"Description": "AAH CONTROLLED DISB ACCT TPA",
|
||||
"GLRollup": "SKCURRENTASSETS",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT ASSETS - Operating cash",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Expenses",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Expenses",
|
||||
"ConfidenceScore": 0.5334519575935484,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1349,
|
||||
"AccountCode": "247153",
|
||||
"Description": "AAH PHYS PMT LIABILITY",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Balance Sheet",
|
||||
"SphAccountRollupCategory": "Liabilities - Current",
|
||||
"SphAccountRollupLineItem": "Accrued Expenses",
|
||||
"SphAccountRollupName": "Balance Sheet - Liabilities - Current - Accrued Expenses",
|
||||
"ConfidenceScore": 0.6824925674536929,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 1357,
|
||||
"AccountCode": "247170",
|
||||
"Description": "AAH PT INS REFUND REFUND PAYABLE",
|
||||
"GLRollup": "SKCURRENTLIABILITIES",
|
||||
"OBDollarsFinancialReporting": "Bal - CURRENT LIABILITIES - Other current liabilities",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Income Statement",
|
||||
"SphAccountRollupCategory": "Expenses - Operating",
|
||||
"SphAccountRollupLineItem": "Facilities - Rent",
|
||||
"SphAccountRollupName": "Income Statement - Expenses - Operating - Facilities - Rent",
|
||||
"ConfidenceScore": 0.5506624314109377,
|
||||
"DateMapped": "7/26/2022",
|
||||
"AccountId": 895,
|
||||
"AccountCode": "760005",
|
||||
"Description": "ABBOTT HEMATOLOGY LEASE",
|
||||
"GLRollup": "BUILDING AND EQUIPMENT RENTAL",
|
||||
"OBDollarsFinancialReporting": "IS - EXPENSES: - Other expenses",
|
||||
"DSSAccountRollup1Name": "Other Expense"
|
||||
},
|
||||
{
|
||||
"OrgPin": "0430",
|
||||
"DatabaseName": "jazz tst GM Platform Demo.1 B onboarding 20200922.1",
|
||||
"DatabaseFriendlyName": "StrataJazz Platform Cubekillers Demo 1 B Legacy onboarding",
|
||||
"SphAccountRollupStatement": "Not Specified",
|
||||
"SphAccountRollupCategory": "Not Specified",
|
||||
"SphAccountRollupLineItem": "",
|
||||
"SphAccountRollupName": "Not Specified - Not Specified - Not Specified",
|
||||
"ConfidenceScore": 0.0,
|
||||
"DateMapped": "",
|
||||
"AccountId": 2563,
|
||||
"AccountCode": "903155",
|
||||
"Description": "ABHS VISITS",
|
||||
"GLRollup": "STATISTICS",
|
||||
"OBDollarsFinancialReporting": "Not Specified - Not Specified - Not Specified",
|
||||
"DSSAccountRollup1Name": "Exclude"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,80 @@
|
||||
using ClosedXML.Excel;
|
||||
using FluentAssertions;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using Strata.Excel.Core.Import;
|
||||
using Strata.Excel.TestUtilities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using static Strata.Excel.Core.Test.Unit.ExcelExportTests.TestExcelExport;
|
||||
|
||||
namespace Strata.Excel.Core.Test.Unit.ExcelImportTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestExcelImport
|
||||
{
|
||||
[OneTimeSetUp]
|
||||
public void RunBeforeAnyTests()
|
||||
{
|
||||
Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
|
||||
// or identically under the hoods
|
||||
Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
|
||||
}
|
||||
|
||||
private static readonly ResourceFileExtractor _extractor = new ResourceFileExtractor(".ExpectedResults.");
|
||||
private static readonly ResourceFileExtractor _dataExtractor = new ResourceFileExtractor(".ExcelExportTests.");
|
||||
|
||||
[Test]
|
||||
|
||||
public void TestImportExcelWorksheet()
|
||||
{
|
||||
using (Stream stream = _extractor.ReadFileFromResourceToStream("TestCreateExcelWorkbook.xlsx"))
|
||||
{
|
||||
var wb = new XLWorkbook(stream);
|
||||
wb.SaveAs(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test.xlsx"));
|
||||
var ws = wb.Worksheets.First();
|
||||
var result = ws.GetDataFromExcel<TestData>();
|
||||
var data = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var expected = JsonConvert.DeserializeObject<List<TestData>>(data);
|
||||
result.Should().HaveCount(expected.Count)
|
||||
.And.Contain(row => expected.Select(d => d.AccountCode).Contains(row.AccountCode))
|
||||
.And.Contain(row => expected.Select(d => d.DatabaseName).Contains(row.DatabaseName))
|
||||
.And.Contain(row => expected.Select(d => d.DatabaseFriendlyName).Contains(row.DatabaseFriendlyName))
|
||||
.And.Contain(row => expected.Select(d => d.SphAccountRollupCategory).Contains(row.SphAccountRollupCategory))
|
||||
.And.Contain(row => expected.Select(d => d.Description).Contains(row.Description));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
public void TestImportWhatsNeededExcelWorksheet()
|
||||
{
|
||||
using (Stream stream = _extractor.ReadFileFromResourceToStream("TestCreateExcelWorkbook.xlsx"))
|
||||
{
|
||||
var wb = new XLWorkbook(stream);
|
||||
wb.SaveAs(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test.xlsx"));
|
||||
var ws = wb.Worksheets.First();
|
||||
var result = ws.GetDataFromExcel<ImportWhatsNeeded>();
|
||||
var data = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var expected = JsonConvert.DeserializeObject<List<ImportWhatsNeeded>>(data);
|
||||
result.Should().HaveCount(expected.Count)
|
||||
.And.Contain(row => expected.Select(d => d.AccountCode).Contains(row.AccountCode))
|
||||
.And.Contain(row => expected.Select(d => d.DatabaseName).Contains(row.DatabaseName))
|
||||
.And.Contain(row => expected.Select(d => d.DatabaseFriendlyName).Contains(row.DatabaseFriendlyName))
|
||||
.And.Contain(row => expected.Select(d => d.SphAccountRollupCategory).Contains(row.SphAccountRollupCategory))
|
||||
.And.Contain(row => expected.Select(d => d.Description).Contains(row.Description));
|
||||
}
|
||||
}
|
||||
|
||||
internal class ImportWhatsNeeded
|
||||
{
|
||||
public string DatabaseName { get; set; }
|
||||
public string DatabaseFriendlyName { get; set; }
|
||||
public string SphAccountRollupCategory { get; set; }
|
||||
public string AccountCode { get; set; }
|
||||
public string Description { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
using ClosedXML.Excel;
|
||||
using FluentAssertions;
|
||||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using Strata.Excel.TestUtilities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using static Strata.Excel.Core.ExportUtils;
|
||||
using static Strata.Excel.Core.Test.Unit.ExcelExportTests.TestExcelExport;
|
||||
|
||||
namespace Strata.Excel.Core.Test.Unit.ExcelLoadTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestExcelLoad
|
||||
{
|
||||
[OneTimeSetUp]
|
||||
public void RunBeforeAnyTests()
|
||||
{
|
||||
Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
|
||||
// or identically under the hoods
|
||||
Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
|
||||
}
|
||||
|
||||
private static readonly ResourceFileExtractor _dataExtractor = new ResourceFileExtractor(".ExcelExportTests.");
|
||||
|
||||
[TestCaseSource(nameof(LoadTestCases))]
|
||||
[Ignore("need to look for alternative that can handle large data")]
|
||||
public void ExcelLoadTest(int load, int batchSize)
|
||||
{
|
||||
var jsonData = _dataExtractor.ReadFileFromResource("data.json");
|
||||
var loadData = JsonConvert.DeserializeObject<List<TestData>>(jsonData);
|
||||
var data = new List<TestData>();
|
||||
while (data.Count < load)
|
||||
{
|
||||
data.AddRange(loadData);
|
||||
}
|
||||
Action action = () =>
|
||||
{
|
||||
var expectedLoad = data.Count + 1; // Add 1 to include the header row
|
||||
var options = new ExportOptions
|
||||
{
|
||||
EmptyMessage = "No Mappings",
|
||||
BatchSize = batchSize
|
||||
};
|
||||
options.AddColumnOptions("Confidence Score", NumberFormatId.ZeroPercent, XLAlignmentHorizontalValues.Right);
|
||||
options.AddColumnOptions("Date Mapped", NumberFormatId.ShortDateSlash, XLAlignmentHorizontalValues.Right);
|
||||
|
||||
var wb = CreateExcelWorkbook(data, options);
|
||||
#pragma warning disable S125 // Sections of code should not be commented out
|
||||
//var expected = $@"Excel Load Test {TestContext.CurrentContext.Test.Name}.xlsx";
|
||||
//wb.SaveAs(Path.Combine(@"C:\Git\excel.core\tests\Strata.Excel.Core.Test.Unit\ExcelLoadTests\", expected));
|
||||
#pragma warning restore S125 // Sections of code should not be commented
|
||||
|
||||
// assert
|
||||
wb.Worksheets.Should().HaveCount(1);
|
||||
var ws = wb.Worksheet(1);
|
||||
ws.Should().NotBeNull();
|
||||
var table = ws.Tables.First();
|
||||
table.RowCount().Should().Be(expectedLoad);
|
||||
};
|
||||
action.Should().NotThrow()
|
||||
.And.Subject.ExecutionTime().Should().BeLessThan(TimeSpan.FromMinutes(load / 3000));
|
||||
}
|
||||
|
||||
public static IEnumerable<TestCaseData> LoadTestCases()
|
||||
{
|
||||
var batchSize = 100000;
|
||||
for (var i = 48; i < 50; i += 2)
|
||||
{
|
||||
yield return new TestCaseData(i * 10000, batchSize).SetName($"{i}0000 rows with batches of {batchSize}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="ExcelExportTests\data.json" />
|
||||
<None Remove="ExpectedResults\TestCreateExcelWorkbook.xlsx" />
|
||||
<None Remove="ExpectedResults\TestCreateExcelWorkbookWithoutHumanizedHeadings.xlsx" />
|
||||
<None Remove="ExpectedResults\TestCreateExcelWorkbookWithTitlePage.xlsx" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="ExcelExportTests\data.json">
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ExpectedResults\TestCreateExcelWorkbook.xlsx" />
|
||||
<EmbeddedResource Include="ExpectedResults\TestCreateExcelWorkbookWithoutHumanizedHeadings.xlsx" />
|
||||
<EmbeddedResource Include="ExpectedResults\TestCreateExcelWorkbookWithTitlePage.xlsx" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.msbuild" Version="3.0.3">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="FluentAssertions" Version="6.7.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" />
|
||||
<PackageReference Include="Moq" Version="4.16.1" />
|
||||
<PackageReference Include="NUnit" Version="3.13.1" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\Strata.Excel.Core\Strata.Excel.Core.csproj" />
|
||||
<ProjectReference Include="..\..\src\Strata.Excel.TestUtilities\Strata.Excel.TestUtilities.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user