diff --git a/test/Classes/Utilities/ExcelAccessibilityHelperTests.cs b/test/Classes/Utilities/ExcelAccessibilityHelperTests.cs new file mode 100644 index 00000000..5891bf15 --- /dev/null +++ b/test/Classes/Utilities/ExcelAccessibilityHelperTests.cs @@ -0,0 +1,102 @@ +using ClosedXML.Excel; +using Viper.Classes.Utilities; + +namespace Test.Classes.Utilities; + +public class ExcelAccessibilityHelperTests +{ + [Fact] + public void SetCoreProperties_PopulatesTitleSubjectAuthor() + { + using var wb = new XLWorkbook(); + + ExcelAccessibilityHelper.SetCoreProperties(wb, + title: "Annual Report", + subject: "FY26 figures", + author: "Test Suite"); + + Assert.Equal("Annual Report", wb.Properties.Title); + Assert.Equal("FY26 figures", wb.Properties.Subject); + Assert.Equal("Test Suite", wb.Properties.Author); + } + + [Fact] + public void SetCoreProperties_DefaultsAuthorToUcDavisSvm() + { + using var wb = new XLWorkbook(); + + ExcelAccessibilityHelper.SetCoreProperties(wb, title: "Doc"); + + Assert.Equal(ExcelAccessibilityHelper.DefaultAuthor, wb.Properties.Author); + } + + [Fact] + public void SetCoreProperties_FallsBackSubjectToTitleWhenNull() + { + using var wb = new XLWorkbook(); + + ExcelAccessibilityHelper.SetCoreProperties(wb, title: "Just A Title"); + + Assert.Equal("Just A Title", wb.Properties.Subject); + } + + [Fact] + public void PromoteToAccessibleTable_CreatesTableWithGivenName() + { + using var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data"); + ws.Cell(1, 1).Value = "Name"; + ws.Cell(1, 2).Value = "Score"; + ws.Cell(2, 1).Value = "Alice"; + ws.Cell(2, 2).Value = 42; + + var table = ExcelAccessibilityHelper.PromoteToAccessibleTable( + ws.Range(1, 1, 2, 2), "ScoresTable"); + + Assert.Equal("ScoresTable", table.Name); + Assert.True(table.ShowHeaderRow); + } + + [Fact] + public void PromoteToAccessibleTable_SanitizesInvalidCharactersInTableName() + { + using var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data"); + ws.Cell(1, 1).Value = "Header"; + ws.Cell(2, 1).Value = "Row"; + + var table = ExcelAccessibilityHelper.PromoteToAccessibleTable( + ws.Range(1, 1, 2, 1), "Cardiology - Group A"); + + Assert.Equal("Cardiology___Group_A", table.Name); + } + + [Fact] + public void PromoteToAccessibleTable_PrependsLetterWhenNameStartsWithDigit() + { + using var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data"); + ws.Cell(1, 1).Value = "Header"; + ws.Cell(2, 1).Value = "Row"; + + var table = ExcelAccessibilityHelper.PromoteToAccessibleTable( + ws.Range(1, 1, 2, 1), "2026Report"); + + Assert.StartsWith("T_", table.Name); + Assert.Contains("2026Report", table.Name); + } + + [Fact] + public void PromoteToAccessibleTable_HidesAutoFilterDropdowns() + { + using var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data"); + ws.Cell(1, 1).Value = "Header"; + ws.Cell(2, 1).Value = "Row"; + + var table = ExcelAccessibilityHelper.PromoteToAccessibleTable( + ws.Range(1, 1, 2, 1), "T1"); + + Assert.False(table.ShowAutoFilter); + } +} diff --git a/test/Classes/Utilities/PdfAccessibilityHelperTests.cs b/test/Classes/Utilities/PdfAccessibilityHelperTests.cs new file mode 100644 index 00000000..c2226f0b --- /dev/null +++ b/test/Classes/Utilities/PdfAccessibilityHelperTests.cs @@ -0,0 +1,82 @@ +using QuestPDF.Fluent; +using QuestPDF.Infrastructure; +using Viper.Classes.Utilities; + +namespace Test.Classes.Utilities; + +public class PdfAccessibilityHelperTests +{ + private static Document MinimalDocument() => + Document.Create(container => + container.Page(page => page.Content().Text("placeholder"))); + + [Fact] + public void WithAccessibility_PopulatesAllMetadataFields() + { + var document = MinimalDocument().WithAccessibility( + title: "Annual Report", + subject: "FY26 figures", + keywords: "merit, evaluation", + author: "Test Suite", + language: "en-GB"); + + var meta = document.GetMetadata(); + Assert.Equal("Annual Report", meta.Title); + Assert.Equal("FY26 figures", meta.Subject); + Assert.Equal("merit, evaluation", meta.Keywords); + Assert.Equal("Test Suite", meta.Author); + Assert.Equal("en-GB", meta.Language); + } + + [Fact] + public void WithAccessibility_DefaultsAuthorToUcDavisSvm() + { + var document = MinimalDocument().WithAccessibility(title: "Doc"); + + Assert.Equal(PdfAccessibilityHelper.DefaultAuthor, document.GetMetadata().Author); + } + + [Fact] + public void WithAccessibility_DefaultsLanguageToEnUs() + { + var document = MinimalDocument().WithAccessibility(title: "Doc"); + + Assert.Equal(PdfAccessibilityHelper.DefaultLanguage, document.GetMetadata().Language); + } + + [Fact] + public void WithAccessibility_SubjectFallsBackToTitleWhenNull() + { + var document = MinimalDocument().WithAccessibility(title: "Title Only"); + + Assert.Equal("Title Only", document.GetMetadata().Subject); + } + + [Fact] + public void WithAccessibility_KeywordsDefaultToEmptyStringWhenNull() + { + var document = MinimalDocument().WithAccessibility(title: "Doc"); + + Assert.Equal(string.Empty, document.GetMetadata().Keywords); + } + + [Fact] + public void WithAccessibility_EnablesPdfUa1Conformance() + { + var document = MinimalDocument().WithAccessibility(title: "Doc"); + + Assert.Equal(PDFUA_Conformance.PDFUA_1, document.GetSettings().PDFUA_Conformance); + } + + [Fact] + public void WithAccessibility_StampsCreationAndModifiedDates() + { + var before = DateTimeOffset.Now.AddSeconds(-5); + var document = MinimalDocument().WithAccessibility(title: "Doc"); + var after = DateTimeOffset.Now.AddSeconds(5); + + var meta = document.GetMetadata(); + Assert.InRange(meta.CreationDate, before, after); + Assert.InRange(meta.ModifiedDate, before, after); + } +} diff --git a/test/Classes/Utilities/WordAccessibilityHelperTests.cs b/test/Classes/Utilities/WordAccessibilityHelperTests.cs new file mode 100644 index 00000000..a9ce3096 --- /dev/null +++ b/test/Classes/Utilities/WordAccessibilityHelperTests.cs @@ -0,0 +1,223 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Wordprocessing; +using Viper.Classes.Utilities; +using DrawingNonVisualPicture = DocumentFormat.OpenXml.Drawing.Pictures.NonVisualDrawingProperties; +using DrawingDocProperties = DocumentFormat.OpenXml.Drawing.Wordprocessing.DocProperties; + +namespace Test.Classes.Utilities; + +public class WordAccessibilityHelperTests +{ +#pragma warning disable S3220 // OpenXML SDK uses params overloads by design for fluent object construction + private static (WordprocessingDocument doc, MainDocumentPart mainPart) NewDocument(MemoryStream stream) + { + var doc = WordprocessingDocument.Create(stream, WordprocessingDocumentType.Document); + var mainPart = doc.AddMainDocumentPart(); + mainPart.Document = new Document(new Body()); + return (doc, mainPart); + } +#pragma warning restore S3220 + + private static Style? FindStyle(Styles styles, string styleId) => + styles.Elements